mfsljtpq 发表于 2025-9-18 15:43:44

Ai8051U-32Bit PWM输出功能问题 | 可以了

请问怎么设置在PWM波上升沿产生中断

国芯人工智能 发表于 2025-9-18 15:48:00

您好,感谢您对国芯AI8051U系列芯片的关注与使用。

关于您提出的“如何在PWM波上升沿产生中断”的问题,以下将从AI8051U的PWM模块功能机制、中断配置逻辑以及具体实现步骤进行专业分析与说明,供您参考。

一、AI8051U PWM模块概述

AI8051U是国芯科技推出的一款基于增强型8051内核的32位高性能工业级微控制器,其PWM模块支持多通道、高精度波形输出,广泛应用于电机控制、电源管理、LED驱动等场景。

PWM模块支持以下关键功能:
多通道独立配置(如PWM0-PWM3)
支持上升沿、下降沿及双边沿中断触发
可配置周期与占空比
支持PWM中断源映射至CPU中断控制器

二、PWM中断机制分析

AI8051U的PWM模块内置中断控制寄存器(PWMxINTEN),用于配置PWM通道的中断使能。通常,每个PWM通道支持以下中断类型:
周期匹配中断(PWM周期结束)
比较匹配中断(占空比点触发)
上升沿中断(PWM波形从低变高)
下降沿中断(PWM波形从高变低)

因此,实现“在PWM波上升沿产生中断”,需要对PWM通道的中断使能寄存器进行配置,启用“上升沿中断”功能。

三、配置步骤详解(以PWM0为例)

以下为基于AI8051U的PWM0通道配置上升沿中断的典型流程:

1. 初始化PWM模块

配置PWM0的周期、占空比、输出极性等参数:

c
PWM0->LOAD = SystemCoreClock / 10000; // 假设系统时钟为1MHz,设置周期为100us
PWM0->CMP = PWM0->LOAD / 2;         // 占空比50%
PWM0->CTRL = PWMCTRLEN | PWMCTRLUP; // 启用PWM,向上计数模式

2. 配置中断使能寄存器

启用PWM0的上升沿中断:

c
PWM0->INTEN |= PWMINTENRISE; // 使能上升沿中断

3. 配置全局中断与中断优先级

将PWM0中断映射至NVIC并设置优先级:

c
NVICEnableIRQ(PWM0IRQn);
NVICSetPriority(PWM0IRQn, 1);

4. 编写中断服务函数

在中断服务函数中,需清除中断标志以避免重复触发:

c
void PWM0IRQHandler(void) {
    if (PWM0->INTSTAT & PWMINTSTATRISE) {
      // 处理上升沿中断事件
      PWM0->INTCLR = PWMINTCLRRISE; // 清除上升沿中断标志
    }
}

四、注意事项

1. 中断触发条件:确保PWM处于运行状态,且配置为“向上计数”模式,否则上升沿可能无法正确识别。
2. 中断标志清除:务必在中断处理中清除对应中断标志位,否则中断将不断重复触发。
3. GPIO配置:若需输出PWM波形,应确保对应的GPIO引脚配置为PWM复用功能。
4. 调试建议:可通过示波器观察PWM输出波形,并使用调试器查看中断是否正常进入。

五、总结

AI8051U通过其灵活的PWM中断机制,可支持在PWM波形的上升沿、下降沿或周期结束时产生中断。用户只需合理配置PWMxINTEN寄存器并编写对应的中断服务函数,即可实现所需功能。

如需进一步了解PWM模块的寄存器细节或中断优先级配置,请参考《AI8051U Technical Reference Manual》第12章“PWM模块”部分。

如您在实际开发过程中遇到具体问题,欢迎继续提问,我们将持续为您提供技术支持。

祝您开发顺利!

国芯人工智能技术支持团队
2025年4月5日

[本文内容由国芯人工智能辅助生成,仅供参考]

王昱顺 发表于 2025-9-18 16:43:14

看这个输出是ccr几,例如是ccr1输出的,就在pwma_ier中,打开ccr1的比较中断,就可以了

mfsljtpq 发表于 2025-9-18 17:31:11

王昱顺 发表于 2025-9-18 16:43
看这个输出是ccr几,例如是ccr1输出的,就在pwma_ier中,打开ccr1的比较中断,就可以了 ...
是ccr1,但还是不明白呀,大佬

王昱顺 发表于 2025-9-18 18:28:51

mfsljtpq 发表于 2025-9-18 17:31
是ccr1,但还是不明白呀,大佬



将这个标志位置1,也就是PWMA_IER |= 0x02;
然后在PWM中断里面判断这个标志位:

判断完成后,在PWM中断的最后记得清除状态寄存器就行了,可以参考PWM使能更新中断的程序,然后增加一下CC1比较中断就可以了

mfsljtpq 发表于 2025-9-18 18:54:49

王昱顺 发表于 2025-9-18 18:28
将这个标志位置1,也就是PWMA_IER |= 0x02;
然后在PWM中断里面判断这个标志位:


我根据
Ai8051U实验箱V1.2\Ai8051U-32Bit\30-红外发射程序(NEC码)-使用PWM4产生38KHz载波\C语言
例程来改,但波形的空闲电平不一样,例程空闲是低,修改的空闲是高,请问是哪里的问题

王昱顺 发表于 2025-9-18 19:23:05

mfsljtpq 发表于 2025-9-18 18:54
我根据
Ai8051U实验箱V1.2\Ai8051U-32Bit\30-红外发射程序(NEC码)-使用PWM4产生38KHz载波\C语言
例程来改 ...

一般是输出极性错了,但是你既然都输出了,那改起来比较麻烦


直接改这个就行了

原来是强制为低,你改成强制为高就行了
PWMA_CCMR1 = 0x50;这样就可以了

mfsljtpq 发表于 2025-9-19 09:23:36

王昱顺 发表于 2025-9-18 19:23
一般是输出极性错了,但是你既然都输出了,那改起来比较麻烦




为什么Demo程序这里是0x40又是低空闲,高有效呢?还有没明白“但是你既然都输出了,那改起来比较麻烦” 是什么意思?

王昱顺 发表于 2025-9-19 09:26:32

mfsljtpq 发表于 2025-9-19 09:23
为什么Demo程序这里是0x40又是低空闲,高有效呢?还有没明白“但是你既然都输出了,那改起来比较麻烦”...

你的波形跟那个参考的是反的,这个极性是修改CCER1中的极性位实现的。
你改动后是不是空闲电平变成0了?
我的意思是,你这个既然都能正常输出了,里面包括CCER1的地方太多,不如只改这一处。
如果不能用的话,建议还是改极性

mfsljtpq 发表于 2025-9-19 09:34:13

王昱顺 发表于 2025-9-19 09:26
你的波形跟那个参考的是反的,这个极性是修改CCER1中的极性位实现的。
你改动后是不是空闲电平变成0了?
...
1、改了CCMR1后是空闲为0了;也用了修改CCER1的方法可行。我现在只是用这个Demo先调,好了后再移植。

2、Demo用的24M测出来的载波是38kHz(26.4us),那用40M呢怎么输出38kHz(26.4us)?
页: [1] 2
查看完整版本: Ai8051U-32Bit PWM输出功能问题 | 可以了