Tliang 发表于 2021-8-14 18:23:20

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;
关闭捕获后再使用按键运行上面的代码开启捕获功能,有信号到的时候也不会触发捕获中断了。

kundi 发表于 2021-8-14 19:56:26

是不是关闭捕获之前,P_SW2最高位被清零了(比如在中断中清零)?或者中间把相关中断位(包括ES=0)被清零了但没有恢复。

Tliang 发表于 2021-8-16 09:20:20

kundi 发表于 2021-8-14 19:56
是不是关闭捕获之前,P_SW2最高位被清零了(比如在中断中清零)?或者中间把相关中断位(包括ES=0)被清零 ...

P_SW2最高位开起来后没有动过,中断在启动捕获的时候会重新开起来

现在是上电第一次开启后捕获工作一直正常,期间会捕获很多数据并解码正确。但是关闭PWM1后再开起来就不进中断了

Tliang 发表于 2021-8-16 09:48:46

      //PWM1_CCER1 = 0x00;
      //PWM1_CCMR2 = 0x00;
      PWM1_IER = 0x00;
      PWM1_CR1 = 0x00;
      PWM1_SR1 = 0;
把这段代码前两行屏蔽就可以工作正常了,两句代码中间加两个nop也没用

这是什么情况呢?关闭通道的捕获功能再开起来就不行了?

Tliang 发表于 2021-8-16 12:28:55

有没有人知道什么原因?试了一上午,只要关了捕获功能再开,就不能正常的触发了

小李非刀 发表于 2021-8-16 16:54:47

不存在楼主说的情况。我的都可以重复的允许、禁止的。

小李非刀 发表于 2021-8-16 16:59:05

功能都是由寄存器控制,寄存器是可以重复赋值的,所以不存在说关闭功能,再初始化就不行的。

我的部分程序:
//========================================================================
// 函数: 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);        //转成十进制文本并发送
                }
        }
}

Tliang 发表于 2021-8-16 17:54:04

小李非刀 发表于 2021-8-16 16:59
功能都是由寄存器控制,寄存器是可以重复赋值的,所以不存在说关闭功能,再初始化就不行的。

我的部分程序 ...

现在把关闭PWM1部分的代码
      //PWM1_CCER1 = 0x00;
      //PWM1_CCMR2 = 0x00;
这两句屏蔽后就可以正常使用了,没有发现什么问题。

不理解这是什么情况

小李非刀 发表于 2021-8-16 23:08:18

Tliang 发表于 2021-8-16 17:54
现在把关闭PWM1部分的代码
      //PWM1_CCER1 = 0x00;
      //PWM1_CCMR2 = 0x00;


PWM1_CCMR2时2通道的寄存器,你给个0x00不会影响。
我的程序也是执行了PWM1_CCER1 = 0x00; 正常操作。

kundi 发表于 2021-8-17 01:13:23

换其他同型号芯片看看,是否重复了此问题,没有重复出现或多个里面只有个别出现,则可能是偶然的质量问题。

Tliang 发表于 2021-8-17 08:39:19

小李非刀 发表于 2021-8-16 23:08
PWM1_CCMR2时2通道的寄存器,你给个0x00不会影响。
我的程序也是执行了PWM1_CCER1 = 0x00; 正常操作。 ...

我用的是通道2,P12脚。之前配置成连接到通道1一直发生中断,配置成通道2就正常了
页: [1]
查看完整版本: 8H1K08使用PWM1捕获模式,关闭之后重新打开没法再次触发捕获中断