ydy2023 发表于 2023-9-4 18:25:44

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

以前做项目用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);
         
      }      
}

ydy2023 发表于 2023-9-4 18:28:00


波形图片上传不了

神农鼎 发表于 2023-9-4 19:48:58

任意沿

ydy2023 发表于 2023-9-5 18:00:39

使用STC32G12K128单片机,测试不成功,输出没有PWM形,能进入PWMA的中断程序,但是奇怪PWMA_SR1寄存器没有一个状态位为1,是不是这颗单片机坏了,要不要换一颗?

zealot 发表于 2023-9-5 19:17:14

本帖最后由 zealot 于 2023-9-5 19:18 编辑

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

梁工 发表于 2023-9-5 22:27:42

ydy2023 发表于 2023-9-5 18:00
使用STC32G12K128单片机,测试不成功,输出没有PWM形,能进入PWMA的中断程序,但是奇怪PWMA_SR1寄存器没有 ...

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

ydy2023 发表于 2023-9-6 12:00:02

这个问题已解决,初始化的问题,感谢!

ydy2023 发表于 2023-9-6 12:03:02

请教一下,能不能在PWM发生更新事件后,设定一个延时时间(2us左右)触发ADC转换?

梁工 发表于 2023-9-6 14:15:20

ydy2023 发表于 2023-9-6 12:03
请教一下,能不能在PWM发生更新事件后,设定一个延时时间(2us左右)触发ADC转换? ...

没法直接设置,2us的时间可以软件延时一下。

ydy2023 发表于 2023-9-7 16:10:08

好的
页: [1]
查看完整版本: 在PWM波形的上升沿进入PWM中断 | 已解决