tsunami87 发表于 2023-9-15 08:16:14

PCA 捕获异常,单片机执行速度变慢 | 已解决

STC8G1K08的单片机,开启了timer0,timer2,uart2,PCA2的捕获,其中timer0和timer2是固定周期,timer0配置了输出到管脚
上电后驱动几个GPIO的LED闪烁,再开启PCA2的捕获,并将捕获到的脉冲周期记录到内存中。如果超时未捕获到脉冲就停止PCA2
再进入死循环,每delay 1秒左右LED闪烁并uart发送固定的字符串。
发现刚上电未开启捕获,单片机运行时正常的,led闪烁的频率符合预期
但开启PCA2捕获后,进入死循环发现LED闪烁和uart发送数据的频率会有周期性的大大加长,一会闪烁频率正常一会要10几秒才闪烁一次。
PCA2的捕获是使用的P37脚,我将P37脚配置为上拉,上电未启动捕获前led闪烁正常,但将P37脚配置为高阻后,上电led闪烁变慢,似乎单片机的运行速度大大降低了。

请教可能是什么原因?


乘风飞扬 发表于 2023-9-15 09:27:17

可能是开启了某些中断,但是触发中断后没有清除中断标志。
这样会导致不断进入中断,从而占用大量CPU资源,使主循环程序执行效率变低。

tsunami87 发表于 2023-9-15 09:37:13

谢谢回答,我再检查中断处理的代码。但配置P37口为高阻态单片机就执行变慢,这个可能什么原因?

神农鼎 发表于 2023-9-15 10:17:16

用仿真来看你程序错在哪


【新提醒】仿真 STC8 系列 MCU,用 STC-USB Link1D - 仿真/ISP下载/做自己的ISP/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

tsunami87 发表于 2023-9-15 11:59:23

本帖最后由 tsunami87 于 2023-9-15 12:06 编辑

STCLINK1D已买等到了试试。另外请教下,PCA的CR寄存器,赋值0只是停止计数吧。中断不会停止吧,要将ECCFn配置为0才能停止中断吧?

梁工 发表于 2023-9-15 13:34:44

PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
允许捕捉中断后,输入端不要高阻悬空,要给确定的电平。高阻悬空的IO电平会漂浮不定,有可能会频繁触发中断。

tsunami87 发表于 2023-9-28 09:45:19

梁工 发表于 2023-9-15 13:34
PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
允许捕捉中断后,输入端不要高阻悬空,要给 ...

的确原因是只停止了计数。中断没关,一直报。

tsunami87 发表于 2023-9-28 09:48:13

梁工 发表于 2023-9-15 13:34
PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
允许捕捉中断后,输入端不要高阻悬空,要给 ...

但有另外一个疑问是,我一直开着ADC,采样频率是14khz多,ADC一直有采样中断上报,中断处理函数也很简单,但主循环似乎没有机会运行了。14KHZ的中断会太多了么?

梁工 发表于 2023-9-28 13:09:41

tsunami87 发表于 2023-9-28 09:48
但有另外一个疑问是,我一直开着ADC,采样频率是14khz多,ADC一直有采样中断上报,中断处理函数也很简单 ...

14KHz就是72us左右,ADC中断读取ADC值一般不超过2us(主频30MHz),占比不到3%,不应该出现主程序没机会运行的情况,应该是你的程序逻辑除了问题,比如,你上报是什么接口?上报时间是否远小于ADC间隔时间72us?如果用串口,是查询还是中断方式?

tsunami87 发表于 2023-9-28 14:39:03

梁工 发表于 2023-9-28 13:09
14KHz就是72us左右,ADC中断读取ADC值一般不超过2us(主频30MHz),占比不到3%,不应该出现主程序没机会 ...

主频是22118400,14KHZ是我在中断函数中反转gpio电平,用示波器测试到的频率。adc值没有上报,只是简单做了运算,因为还没有完成adc数据的处理,所以adc的值最终没有输出,只是中断函数中做了计算。主程序不能说没有机会运行,是速度慢了非常多,原来delay 10ms的变成了3秒左右。停止adc后主循环运行就正常。
页: [1] 2
查看完整版本: PCA 捕获异常,单片机执行速度变慢 | 已解决