找回密码
 立即注册
查看: 424|回复: 9

在PWM波形的上升沿进入PWM中断 | 已解决

[复制链接]

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
发表于 2023-9-4 18:25:44 | 显示全部楼层 |阅读模式
以前做项目用STC8G1K08A,用PWM的上升沿中断,在中断函数内对数据进行处理,
现在想用STC32G单片机升级这个项目,在开发板上测试,不能在PWM波形的上升沿进入PWM中断。
请高手指导一下,感谢!

/*
        1.在P20引脚输出PWM波形;
        2.在PWM波形的上升沿进入PWM中断,在PWM中断中操作P27电平信号,并在示波器上显示P27波形,
          检测PWM中断发生的时间
        3.时钟频率35MHZ

                                                                                                                                                        */
#include  "STC32G.h"        
#include  "delay.h"
#include        "pwm.h"
#include  "timer.h"        


/*************************************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
**************************************************************/
void delay_ms(uint16 x)
{  
        uint16 i;   
  do{
         i = 705;
         while(--i);
     }while(--x);  
}

#define delay_us(x)           35*x        // 35M时钟,延时的时间
/**************************************************************************************
功能描述:对PWM5进行初始化
入口参数:无
返回值:无
**************************************************************************************/
void PWM_Configuration(void)
{        
        P_SW2 |= 0x80;                            //将EAXFR位置1,以访问在XDATA区域的扩展SFR
        
        PWMA_CCER1  = 0;
        PWMA_CCER2  = 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;
        PWMA_PS     = 0;
        PWMA_IER    = 0;
        
        PWMA_PS = 0x00;               //高级 PWM 通道输出脚选择位
        PWMA_PS |= 0x01;              //选择 P0.0 通道
        PWMA_PSCRH = 0;
        PWMA_PSCRL = 0;                        //计数时钟不分频        
        PWMA_CCER1 = 0x00;            //写 CCMRx 前必须先清零 CCxE 关闭通道,会不会是这里的问题?
        PWMA_CCMR1 = 0x60;            //通道模式配置
        PWMA_CCER1 = 0x01;            //配置通道输出使能和极性,CC1P通道使能,输出不反向        
        PWMA_ARRH =delay_us(10)>>8;                //周期10us
        PWMA_ARRL =delay_us(10);        
        PWMA_CCR1H=delay_us(2)>>8;                //占空比2us
        PWMA_CCR1L=delay_us(2);
        PWMA_ENO = 0x01;            //使能 PWM1P 输出        
        PWMA_BKR = 0x80;              //使能主输出
        PWMA_IER=0X01;                                //测试
        PWMA_CR1 |= 0x01;             //将CENA位置1,开始计时        
        P_SW2 &= 0x7F;                            //将EAXFR位置0,恢复访问XRAM               
}
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
        PWMA_SR1 =0;
        PWMA_SR2 =0;
        P27 =1;
        NOP(5);
        P27 =0;
        
}
/***************************************************************************
* 描  述 : 主函数
* 入  参 : 无
* 返回值 : 无
**************************************************************************/
int main(void)
{
        P0M1 =0;
        P0M0 =1;
        P2M1 =0X7F;
        P2M0 =0XFF;                //P27推挽
        
        PWM5_Configuration();       //初始化PWM5口
        EA = 1;                                  //允许总中断
        P20=0;
        
  while(1)
  {
     P00 =!P00;
          delay_ms(300);
         
        }        
}

回复 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-9-4 18:28:00 | 显示全部楼层

波形图片上传不了
回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9462

回帖

1万

积分

管理员

积分
14007
发表于 2023-9-4 19:48:58 | 显示全部楼层
任意沿
截图202309041948297384.jpg
回复 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-9-5 18:00:39 | 显示全部楼层
使用STC32G12K128单片机,测试不成功,输出没有PWM形,能进入PWMA的中断程序,但是奇怪PWMA_SR1寄存器没有一个状态位为1,是不是这颗单片机坏了,要不要换一颗?

点评

芯片哪有那么容易坏,是没有初始化好。 先用STC的官方例程,观察PWM输出正常,然后允许匹配中断(上升沿还是下降沿),增加中断函数,OK!  详情 回复 发表于 2023-9-5 22:27
回复 支持 反对 送花

使用道具 举报

该用户从未签到

4

主题

9

回帖

68

积分

注册会员

积分
68
发表于 2023-9-5 19:17:14 | 显示全部楼层
本帖最后由 zealot 于 2023-9-5 19:18 编辑

cr1里面除了cenA=1之外,还要设置一个URSA=1,才会有sr1里面的UIFA,
pdf里面有说我记得是那样的,
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3030

回帖

6831

积分

超级版主

积分
6831
发表于 2023-9-5 22:27:42 | 显示全部楼层
ydy2023 发表于 2023-9-5 18:00
使用STC32G12K128单片机,测试不成功,输出没有PWM形,能进入PWMA的中断程序,但是奇怪PWMA_SR1寄存器没有 ...

芯片哪有那么容易坏,是没有初始化好。
先用STC的官方例程,观察PWM输出正常,然后允许匹配中断(上升沿还是下降沿),增加中断函数,OK!
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-9-6 12:00:02 | 显示全部楼层
这个问题已解决,初始化的问题,感谢!
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-9-6 12:03:02 | 显示全部楼层
请教一下,能不能在PWM发生更新事件后,设定一个延时时间(2us左右)触发ADC转换?

点评

没法直接设置,2us的时间可以软件延时一下。  详情 回复 发表于 2023-9-6 14:15
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3030

回帖

6831

积分

超级版主

积分
6831
发表于 2023-9-6 14:15:20 | 显示全部楼层
ydy2023 发表于 2023-9-6 12:03
请教一下,能不能在PWM发生更新事件后,设定一个延时时间(2us左右)触发ADC转换? ...

没法直接设置,2us的时间可以软件延时一下。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-9-7 16:10:08 | 显示全部楼层
好的
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-17 10:34 , Processed in 0.080193 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表