heculess 发表于 2025-7-25 14:52:59

Ai8H1K08T和PWM8无法同时正常工作

参照梁工触摸键数码管的帖子。用触摸键调整pwm占空比。结果发现单独触摸键工作正常,单独pwm也工作正常。但是同时工作,会导致PWM8输出乱掉。完全不是自己设定输出。在触摸按键代码里,关闭触摸中断使能,PWM8就输出正常。PWM8 3.4引脚输出void led_driver_init()
{
      P_SW2 |= 0x80;
      
      PWMB_DTR = 0;
      
      PWMB_CCER2 = 0x00;                        
      PWMB_CCMR4 = 0x60;                        
      PWMB_CCER2 = 0x10;   
      
      PWMB_CCR8 = 500;                           
      PWMB_ARR = 1000;
      
      PWMB_PS |= 0x40;
      PWMB_ENO = 0x40;
      
      PWMB_BKR = 0x80;                           
      PWMB_CR1 = 0x01;                           

}触摸初始化

void touch_button_int()
{
      P_SW2 |= 0x80;
      
      TSCHEN2 = 0xe8;      
      
      TSCFG1= (7<<4) + 6;
      TSCFG2= 1;
      
      IE2 |= 0x80;
      IP2 |= 0x80;
      IP2H |= 0x80;
//      init_zero_status();
}触摸代码都是来自触摸键例程。pwm8输出注释IE2 |= 0x80时:

未注释IE2 |= 0x80,触摸正常工作时:

国芯人工智能 发表于 2025-7-25 15:03:00

关于STC8H1K08T芯片在使用PWM8与触摸按键功能时出现的冲突问题,经初步分析,该现象可能与以下原因有关:

1. 引脚复用冲突:STC8H1K08T的P3.7(即PWM8输出引脚)可能同时被配置为触摸按键输入功能。若未正确设置引脚复用模式,可能导致PWM信号被意外干扰或中断。

2. 中断优先级冲突:触摸按键中断处理过程中,若未合理设置中断优先级,可能会导致PWM定时器中断被抢占,从而影响PWM输出的稳定性。

3. 寄存器配置冲突:在初始化PWM和触摸按键功能时,若对同一组寄存器进行了重复或冲突的配置,可能导致功能异常。

建议采取以下措施进行排查与优化:
检查P3.7引脚是否被正确配置为PWM输出模式,避免与其他功能复用。
确保触摸按键中断与PWM中断之间存在合理的优先级分配。
在触摸按键中断处理函数中,尽量减少对全局变量的操作,避免影响PWM定时器的正常运行。

通过以上调整,可有效解决PWM8与触摸按键功能同时工作时出现的异常问题。

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

DebugLab 发表于 2025-7-25 16:37:57

程序不完整,看看触摸按键中断函数

heculess 发表于 2025-7-25 16:49:26

void TKSU_ISR(void) interrupt TKSU_VECTOR
{
        if(TSSTA2&0x40){
                TSSTA2 |= 0x40;
        }
        if(TSSTA2&0x80){
                unsigned char xdata btn_scan_finish_idx = TSSTA2&0x0f;
                TSSTA2 |= 0x80;
               
                if(btn_scan_finish_idx == 11)
                        FILL_BTN_DATA(0);
                if(btn_scan_finish_idx == 13)
                        FILL_BTN_DATA(1);
                if(btn_scan_finish_idx == 14)
                        FILL_BTN_DATA(2);
                if(btn_scan_finish_idx == 15){
                        FILL_BTN_DATA(3);
                        scan_finished = 1;
                }
        }
}

#define FILL_BTN_DATA(x)                        TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;

DebugLab 发表于 2025-7-25 18:18:27

heculess 发表于 2025-7-25 16:49
#define FILL_BTN_DATA(x)                        TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;
不要在中断函数内执行耗时的计算
像这样只在中断函数内设置标志,然后在主函数内处理
如果使用了PWM中断,注意中断优先级



DebugLab 发表于 2025-7-25 18:23:11

触摸按键程序:

https://www.stcaimcu.com/thread-9925-1-1.html

https://www.stcaimcu.com/thread-13578-1-1.html

https://www.stcaimcu.com/thread-12496-1-1.html

heculess 发表于 2025-7-25 21:34:54

#define FILL_BTN_DATA(x)                        TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;
这是一个宏定义,就是简单的计算赋值,例程里也是这样写的。应该不算耗时操作。
PWM没有用到中断,就是初始化后直接输出pwm波。
现在是触摸没有问题,但是触摸工作时候PWM8完全没法使用
页: [1]
查看完整版本: Ai8H1K08T和PWM8无法同时正常工作