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,触摸正常工作时:
关于STC8H1K08T芯片在使用PWM8与触摸按键功能时出现的冲突问题,经初步分析,该现象可能与以下原因有关:
1. 引脚复用冲突:STC8H1K08T的P3.7(即PWM8输出引脚)可能同时被配置为触摸按键输入功能。若未正确设置引脚复用模式,可能导致PWM信号被意外干扰或中断。
2. 中断优先级冲突:触摸按键中断处理过程中,若未合理设置中断优先级,可能会导致PWM定时器中断被抢占,从而影响PWM输出的稳定性。
3. 寄存器配置冲突:在初始化PWM和触摸按键功能时,若对同一组寄存器进行了重复或冲突的配置,可能导致功能异常。
建议采取以下措施进行排查与优化:
检查P3.7引脚是否被正确配置为PWM输出模式,避免与其他功能复用。
确保触摸按键中断与PWM中断之间存在合理的优先级分配。
在触摸按键中断处理函数中,尽量减少对全局变量的操作,避免影响PWM定时器的正常运行。
通过以上调整,可有效解决PWM8与触摸按键功能同时工作时出现的异常问题。
[本文内容由国芯人工智能辅助生成,仅供参考] 程序不完整,看看触摸按键中断函数 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; heculess 发表于 2025-7-25 16:49
#define FILL_BTN_DATA(x) TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;
不要在中断函数内执行耗时的计算
像这样只在中断函数内设置标志,然后在主函数内处理
如果使用了PWM中断,注意中断优先级
触摸按键程序:
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
#define FILL_BTN_DATA(x) TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;
这是一个宏定义,就是简单的计算赋值,例程里也是这样写的。应该不算耗时操作。
PWM没有用到中断,就是初始化后直接输出pwm波。
现在是触摸没有问题,但是触摸工作时候PWM8完全没法使用
页:
[1]