STC8H PWM 如何关闭--看这里 | 已解决
查找了STC论坛,都没有,解决这个问题。如下方法也试了,没在成功
STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):
1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
PWMA_ENO |= 0x01; // 允许PWM1P输出
delay_ms(5); // P1.0输出PWM 5ms
P10 = 1; // P1.0输出高电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5); // P1.0输出高电平5ms
PWMA_ENO |= 0x01; // 允许PWM1P输出
delay_ms(5); // P1.0输出PWM 5ms
P10 = 0; // P1.0输出低电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5); // P1.0输出高电平5ms
2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5); // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;// 强制PWM输出无效(低)电平
delay_ms(5); // PWM输出低电平5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5); // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;//强制PWM输出有效(高)电平
delay_ms(5); // PWM输出高电平5ms
后来与STC的陈工联系,与 PWMB_ENO设置时扩展寄存器访问使能开了没有有关。
if(DR_Flag)
{
DR_Flag = 0;
P_SW2 |= 0x80;
PWMB_ENO |= ENO8P; //使能输出
P_SW2 &= 0x7f;
}
else
{
DR_Flag = 1;
P_SW2 |= 0x80;
PWMB_ENO &= ~ENO8P; //禁止输出
P_SW2 &= 0x7f;
P34 = 0; //输出低电平
}
就是操作PWMB_ENO时都要打开SW2高8位。
实测可行
没有冲突时建议保持EAXFR为1
访问位于xdata的扩展寄存器,一定要先设置 P_SW2 |= 0x80;
设置之后,不用清0,后面也不需要重复设置。 P_SW2 这个东西会产生很多问题 我开始也按照手册打开--配置---关闭 有一次调试失败找了好几天都没找到原因 最后发现是别任务的地方把这个P_SW2 关闭了 造成改寄存器失败造成问题 后来我干脆打开就不关闭了 具体的存储区域也没研究估计一般不会用到吧 lzzasd 发表于 2023-8-21 21:57
P_SW2 这个东西会产生很多问题 我开始也按照手册打开--配置---关闭 有一次调试失败找了好几天都没找到 ...
打开不用关闭,不会有问题的。
页:
[1]