STM32
直播中

刘敏

7年用户 1170经验值
私信 关注
[问答]

STM8 PWM溢出中断或比较中断执行中断程序有延时是怎么回事?

在PWM溢出或是比较中断时,进中断将一个IO口翻转,然后执行中断程序(用延时3us测试),屏蔽中断程序,可以看IO翻转边沿与PWM翻转边沿对齐,当执行中断程序时,IO翻转边沿滞后PWM翻转边沿。以下是初始化配置与中断程序。void PWM1_INIT(void)
{
    CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟
    tiM1_CR1 = (1<<7);                        //自动预装载允许
    //设置TIM1 CH1 与 TIM1 CH1N通道
    TIM1_CCMR1 = (6<<4)|(1<<3)|(1<<2);        //TIM1 CH1 PWM1  输出比较1预装载使能  输出比较1 快速使能
    //TIM1_CCER1 |= 0x01;                       //CC1为输出 高电平有效
    TIM1_CCER1 |= (1<<0)|(1<<2);              //CC1为输出 OC1高电平有效 开启OC1N OC1N高电平有效

    //设置TIM1 CH2 与 TIM1 CH2N通道
    TIM1_CCMR2 =(6<<4)|(1<<3)|(1<<2);        //TIM1 CH2 输出模式 PWM1 输出比较2预装载使能  输出比较2 快速使能
    TIM1_CCER1 |= (1<<4)|(1<<6);             //CC2为输出   互补输出使能

    TIM1_PSCRH = 0x00;                        //预分频 0
    TIM1_PSCRL = 0x00;                        //16M

    TIM1_ARRH = 0x01;                     //设定自动重装载值高8位
    TIM1_ARRL = 0x40;                          //设置自动重装载值低8位

    TIM1_CCR1H = 0x00;
    TIM1_CCR1L = 0x64;  // 占空比值
    TIM1_CCR2H = 0x00;
    TIM1_CCR2L = 0x64;  // 占空比值  

    //TIM1_BKR |= (1<<7)|(1<<4);                 //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平  开启刹车输入 刹车输入低电平有效
    TIM1_BKR |= (1<<7);                       //主输出使能  关闭刹车输入
    TIM1_DTR = 0x18;                          //死区时间 24*125ns=3000ns
    TIM1_EGR = (1<<0);                        //产生更新事件
    TIM1_CR1 |= 0x01;                           //使能计数器
    TIM1_IER |= 0x01;  //允许更新中断

}

#pragma vector=0xD
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
  TIM1_SR1_UIF = 0; //更新中断标志  
  PC_ODR_ODR5 ^= 1;
  //PC_ODR_ODR5 = 1;
  //Delay_Just(5);
  //PC_ODR_ODR5 = 0;


//  TIM1_SR1_UIF = 0; //更新中断标志
}










回帖(2)

路云芳

2024-4-11 09:21:13
看起来像是先延时再翻转了IO口。在DEBUG模式下看看汇编代码部分是不是先执行了延时。一般来说中断是硬件触发,到软件执行不会有什么物理延迟的,除非其他中断阻塞到它的执行
举报

李鸿洋

2024-4-11 14:56:38
PWM溢出中断或比较中断执行中断程序有延时的原因可能是因为中断服务程序(ISR)的执行时间相对较长,导致延迟了IO口的翻转。

在STM8中,当一个中断被触发时,CPU会立即开始执行ISR,并且会自动屏蔽其他中断,以确保ISR的完整执行。在ISR执行期间,其他中断将被放置在挂起状态,直到ISR结束并启用其他中断。

在你的代码中,当PWM溢出或比较中断发生时,ISR会被触发,并执行中断程序。然而,如果中断程序的执行时间较长(例如通过延时函数延时3us),那么IO口的翻转就会延迟,因为中断程序执行期间,其他中断被屏蔽,包括IO口的翻转引脚的中断。

解决这个问题的方法是尽量减少中断程序的执行时间。如果需要实现较长的延时,可以考虑使用硬件定时器或其他定时方法来进行延时操作,而不是使用延时函数。这样可以确保IO口的翻转与PWM翻转边沿对齐。

另外,还可以考虑优化中断程序的代码,尽量使其执行时间更短。这可以通过合理的算法设计、避免使用复杂的计算或调用耗时的函数等方式来实现。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分