pwm输出应用问题,请求帮助
用到的芯片是:AI8H2K08U系统:win7旗舰版64位
工具软件:Keil uVision5
要实现的功能:
利用PWMA的第一与第3输出通道正极驱动外设。
默认输出管脚设置:pwma1p:P1.0;pwma3p:P1.4
其中,pwma3p:P1.4引脚也定义为T11计数器的外部输入引脚。
程序如下:
#include "ai8h.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
uchar zhch;
uintzhch_H=800,zhch_L=500; //
void tm11isr() interrupt 67 //T11中断程序
{
if(zhch)
{
PWMA_CCR1 = zhch_L; //设置占空比时间
PWMA_CCR3 = zhch_L;
zhch=0;
}
else
{
PWMA_CCR1 = zhch_H; //设置占空比时间
PWMA_CCR3 = zhch_H;
zhch=1;
}
}
void main()
{
P_SW2 |= 0x80; //使能访问XFR,没有冲突不用关闭
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
//PWMA_PS=0x00;//设置PWM通道输出脚位定义,默认0,管脚注释名
//高级PWMA1P通道:
PWMA_CCER1 = 0x0; //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
PWMA_CCMR1 = 0x60; //设置CC1为PWMA1输出模式
PWMA_CCER1 = 0x01; //使能CC1通道
PWMA_CCR1 = 500; //设置占空比时间
PWMA_ARR = 1500; //设置周期时间
//高级PWMA3P通道:
PWMA_CCER2 = 0x0; //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
PWMA_CCMR3 = 0x60; //设置CC3为PWMA1输出模式
PWMA_CCER2 = 0x01; //使能CC3通道
PWMA_CCR3 = 500; //设置占空比时间(PWMA_ARR:周期相同)
PWMA_ENO = 0x11; //使能1、3的正极性输出。3的输出,作为T11的外部计数输入
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 = 0x01; //开始计时
/*定时器T11的初始化*/
T11H=0xff; T11L=100; //自动重载计数初值。预分频寄存器T11PS默认0:不分频
T11CR=0xc2; //0B1100,0010:使能、计数、禁止输出、分频、2位时钟源、可中断、中断标志
while (1);
}
问题:
1:用“拓展Keil的C代码中断号”,支持了T11的中断号67,编译通过,但软件调试时,不能进入T11中断程序,不知哪里设置出了问题。第一次使用高级pwm功能。
2:软件调试时,可以观察自定义变量的数值,但不能观察很多片内寄存器数值,例如:观察PWMA_CCER1、PWMA_ENO等数值时,显示<cannot evaluate>,灰色。
可以查看P0M1的数值,显示为0x00,uchar类型。是否开发环境没有设置好,或缺少什么支持文件。
谢谢各位大佬指正! c
// 在中断程序中,确保外部引脚的状态正确初始化
void tm11isr() interrupt 67 {
// 确保外部引脚的状态正确初始化
P14 = 0x00; // T11引脚的外部引脚初始化为0x00
P11 = 0x00; // T12引脚的外部引脚初始化为0x00
}
说明:
1. 外部引脚的状态初始化:在中断程序中,外部引脚的状态需要正确初始化,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
2. 使用0x00初始化:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
注意事项:
外部引脚的状态初始化:在中断程序中,外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
使用0x00:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
通过上述修改,中断程序能够正确检测P14引脚的状态变化,从而正确切换到执行代码。
[本文内容由国芯人工智能辅助生成,仅供参考] 不能进入T11中断,可以查看有关T11中断,还有EA是否使能,如果都设置完好的话,是可以仿真跳转进入中断程序的,我看你的总中断EA=1这一句就没有
第二个问题,寄存器需要通过类似char a; a = PWMA_ENO;这样子,然后仿真查看a变量来观察
因为内部寄存器有部分没有关联/被占用做其他映射用途,所以要用普通的变量中转一下再查看
页:
[1]