找回密码
 立即注册
查看: 73|回复: 6

Ai8H1K08T和PWM8无法同时正常工作

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-25 14:52:59
已绑定手机

1

主题

2

回帖

13

积分

新手上路

积分
13
发表于 7 天前 | 显示全部楼层 |阅读模式
参照梁工触摸键数码管的帖子。用触摸键调整pwm占空比。结果发现单独触摸键工作正常,单独pwm也工作正常。但是同时工作,会导致PWM8输出乱掉。完全不是自己设定输出。在触摸按键代码里,关闭触摸中断使能,PWM8就输出正常。PWM8 3.4引脚输出
  1. void led_driver_init()
  2. {
  3.         P_SW2 |= 0x80;
  4.         
  5.         PWMB_DTR = 0;
  6.         
  7.         PWMB_CCER2 = 0x00;                          
  8.         PWMB_CCMR4 = 0x60;                          
  9.         PWMB_CCER2 = 0x10;   
  10.         
  11.         PWMB_CCR8 = 500;                           
  12.         PWMB_ARR = 1000;  
  13.         
  14.         PWMB_PS |= 0x40;
  15.         PWMB_ENO = 0x40;
  16.         
  17.         PWMB_BKR = 0x80;                           
  18.         PWMB_CR1 = 0x01;                           
  19. }
复制代码
触摸初始化

  1. void touch_button_int()
  2. {
  3.         P_SW2 |= 0x80;
  4.         
  5.         TSCHEN2 = 0xe8;        
  6.         
  7.         TSCFG1  = (7<<4) + 6;
  8.         TSCFG2  = 1;
  9.         
  10.         IE2 |= 0x80;
  11.         IP2 |= 0x80;
  12.         IP2H |= 0x80;
  13. //        init_zero_status();
  14. }
复制代码
触摸代码都是来自触摸键例程。pwm8输出注释IE2 |= 0x80时:

normal

normal

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

error

error

回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 7 天前 | 显示全部楼层
关于STC8H1K08T芯片在使用PWM8与触摸按键功能时出现的冲突问题,经初步分析,该现象可能与以下原因有关:

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 7 天前 | 显示全部楼层
程序不完整,看看触摸按键中断函数
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-25 14:52:59
已绑定手机

1

主题

2

回帖

13

积分

新手上路

积分
13
发表于 7 天前 | 显示全部楼层
  1. void TKSU_ISR(void) interrupt TKSU_VECTOR
  2. {
  3.         if(TSSTA2&0x40){
  4.                 TSSTA2 |= 0x40;
  5.         }
  6.         if(TSSTA2&0x80){
  7.                 unsigned char xdata btn_scan_finish_idx = TSSTA2&0x0f;
  8.                 TSSTA2 |= 0x80;
  9.                
  10.                 if(btn_scan_finish_idx == 11)
  11.                         FILL_BTN_DATA(0);
  12.                 if(btn_scan_finish_idx == 13)
  13.                         FILL_BTN_DATA(1);
  14.                 if(btn_scan_finish_idx == 14)
  15.                         FILL_BTN_DATA(2);
  16.                 if(btn_scan_finish_idx == 15){
  17.                         FILL_BTN_DATA(3);
  18.                         scan_finished = 1;
  19.                 }
  20.         }
  21. }
复制代码


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

点评

不要在中断函数内执行耗时的计算 像这样只在中断函数内设置标志,然后在主函数内处理 [attachimg]109857[/attachimg] [attachimg]109858[/attachimg] [attachimg]109859[/attachimg]  详情 回复 发表于 7 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 7 天前 | 显示全部楼层
hecu*** 发表于 2025-7-25 16:49
#define FILL_BTN_DATA(x)                        TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;

不要在中断函数内执行耗时的计算
像这样只在中断函数内设置标志,然后在主函数内处理
如果使用了PWM中断,注意中断优先级

截图202507251815327334.jpg
截图202507251817397920.jpg
截图202507251817572408.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 7 天前 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-25 14:52:59
已绑定手机

1

主题

2

回帖

13

积分

新手上路

积分
13
发表于 7 天前 | 显示全部楼层
#define FILL_BTN_DATA(x)                        TK_cnt[##x##] = ((TK_cnt[##x##] * 3)>>2) + TSDAT/16;
这是一个宏定义,就是简单的计算赋值,例程里也是这样写的。应该不算耗时操作。
PWM没有用到中断,就是初始化后直接输出pwm波。
现在是触摸没有问题,但是触摸工作时候PWM8完全没法使用
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-1 02:16 , Processed in 0.123365 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表