8H1K08使用PWM1捕获模式,关闭之后重新打开没法再次触发捕获中断
按按键后,使用下面这段代码开启捕获:
P_SW2 = 0x80;
PWM1_CNTRH = 0x00;
PWM1_CNTRL = 0x00;
PWM1_ARRH = 0x00;
PWM1_ARRL = 0x00;
PWM1_CCER1 = 0x00;
PWM1_CCMR2 = 0x01;
PWM1_CCER1 = 0x30;
PWM1_CR1 = 0x01;
PWM1_IER = 0x04;
上电第一次可以正常触发捕获中断,运行完之后使用下面代码关闭捕获:
PWM1_CCER1 = 0x00;
PWM1_CCMR2 = 0x00;
PWM1_IER = 0x00;
PWM1_CR1 = 0x00;
PWM1_SR1 = 0;
关闭捕获后再使用按键运行上面的代码开启捕获功能,有信号到的时候也不会触发捕获中断了。 是不是关闭捕获之前,P_SW2最高位被清零了(比如在中断中清零)?或者中间把相关中断位(包括ES=0)被清零了但没有恢复。 kundi 发表于 2021-8-14 19:56
是不是关闭捕获之前,P_SW2最高位被清零了(比如在中断中清零)?或者中间把相关中断位(包括ES=0)被清零 ...
P_SW2最高位开起来后没有动过,中断在启动捕获的时候会重新开起来
现在是上电第一次开启后捕获工作一直正常,期间会捕获很多数据并解码正确。但是关闭PWM1后再开起来就不进中断了 //PWM1_CCER1 = 0x00;
//PWM1_CCMR2 = 0x00;
PWM1_IER = 0x00;
PWM1_CR1 = 0x00;
PWM1_SR1 = 0;
把这段代码前两行屏蔽就可以工作正常了,两句代码中间加两个nop也没用
这是什么情况呢?关闭通道的捕获功能再开起来就不行了? 有没有人知道什么原因?试了一上午,只要关了捕获功能再开,就不能正常的触发了 不存在楼主说的情况。我的都可以重复的允许、禁止的。 功能都是由寄存器控制,寄存器是可以重复赋值的,所以不存在说关闭功能,再初始化就不行的。
我的部分程序:
//========================================================================
// 函数: void PWMA_config(void)
// 描述: PPWM配置函数。
// 参数: noe.
// 返回: none.
// 版本: V1.0, 2021-5-10
// 备注:
//========================================================================
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_PSCR = 11; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_DTR= 0; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_CCER1= 0;
PWMA_CCER2= 0;
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_ENO = 0; //IO禁止输出PWM,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
PWMA_PS = 0;
PWMA_IER = 0;
PWMA_CCMR1= 0x31; // 通道1模式配置, 配置成输入通道, 8个时钟滤波
PWMA_CCER1 |= 0x03; // 配置通道输入使能和极性, 允许输入, 下降沿
PWMA_PS |= 0; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
PWMA_IER |= 0x02; // 使能中断
PWMA_EGR = 0x01; //产生一次更新事件, 清除计数器和与分频计数器, 装载预分频寄存器的值
PWMA_SMCR = 0x60;
PWMA_BKR = 0x00; //主输出使能 相当于总开关
PWMA_CR1 |= 0x01; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMA_ISR_En = PWMA_IER; //设置标志允许通道1~4中断处理
P1M1 = 0x00;
P1M0 = 0x00;
}
/******************** 主函数 **************************/
void main(void)
{
PWMA_config();
UART1_config(115200UL, 1, 0); // brt: 通信波特率,timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,=1: 切换到P3.6 P3.7,=2: 切换到P1.6 P1.7.
EA = 1;
PrintString1("STC8H系列PWMA捕捉程序范例!\r\n");
while (1)
{
if(cmd != 0)
{
if(cmd == 'e')
{
PWMA_config();
SBUF = 'E'; //提示允许
}
if(cmd == 'd')
{
PWMA_CCMR1= 0x00; // 通道1模式配置, 配置成输入通道, 8个时钟滤波
PWMA_CCER1= 0x00; // 配置通道输入使能和极性, 允许输入, 下降沿
PWMA_IER = 0x00; // 使能中断
PWMA_EGR = 0x00; //产生一次更新事件, 清除计数器和与分频计数器, 装载预分频寄存器的值
PWMA_SMCR = 0x00;
PWMA_BKR = 0x00; //主输出使能 相当于总开关
PWMA_CR1 = 0x00; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
SBUF = 'D'; //提示禁止
}
cmd = 0;
}
if(B_Capture1)
{
B_Capture1 = 0;
u16_to_ascii(1, CCAP1_Time); //转成十进制文本并发送
}
}
}
小李非刀 发表于 2021-8-16 16:59
功能都是由寄存器控制,寄存器是可以重复赋值的,所以不存在说关闭功能,再初始化就不行的。
我的部分程序 ...
现在把关闭PWM1部分的代码
//PWM1_CCER1 = 0x00;
//PWM1_CCMR2 = 0x00;
这两句屏蔽后就可以正常使用了,没有发现什么问题。
不理解这是什么情况 Tliang 发表于 2021-8-16 17:54
现在把关闭PWM1部分的代码
//PWM1_CCER1 = 0x00;
//PWM1_CCMR2 = 0x00;
PWM1_CCMR2时2通道的寄存器,你给个0x00不会影响。
我的程序也是执行了PWM1_CCER1 = 0x00; 正常操作。 换其他同型号芯片看看,是否重复了此问题,没有重复出现或多个里面只有个别出现,则可能是偶然的质量问题。 小李非刀 发表于 2021-8-16 23:08
PWM1_CCMR2时2通道的寄存器,你给个0x00不会影响。
我的程序也是执行了PWM1_CCER1 = 0x00; 正常操作。 ...
我用的是通道2,P12脚。之前配置成连接到通道1一直发生中断,配置成通道2就正常了
页:
[1]