找回密码
 立即注册
查看: 741|回复: 19

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

[复制链接]

该用户从未签到

1

主题

11

回帖

49

积分

新手上路

积分
49
发表于 2023-9-15 08:16:14 | 显示全部楼层 |阅读模式
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闪烁变慢,似乎单片机的运行速度大大降低了。

请教可能是什么原因?


回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 137 天

    [LV.7]常住居民III

    26

    主题

    1317

    回帖

    4107

    积分

    论坛元老

    积分
    4107
    发表于 2023-9-15 09:27:17 | 显示全部楼层
    可能是开启了某些中断,但是触发中断后没有清除中断标志。
    这样会导致不断进入中断,从而占用大量CPU资源,使主循环程序执行效率变低。

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    11

    回帖

    49

    积分

    新手上路

    积分
    49
     楼主| 发表于 2023-9-15 09:37:13 | 显示全部楼层
    谢谢回答,我再检查中断处理的代码。但配置P37口为高阻态单片机就执行变慢,这个可能什么原因?
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9362

    回帖

    1万

    积分

    管理员

    积分
    13906
    发表于 2023-9-15 10:17:16 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    11

    回帖

    49

    积分

    新手上路

    积分
    49
     楼主| 发表于 2023-9-15 11:59:23 | 显示全部楼层
    本帖最后由 tsunami87 于 2023-9-15 12:06 编辑

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

    截图202309151205101899.jpg
    截图202309151205187829.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2980

    回帖

    6717

    积分

    超级版主

    积分
    6717
    发表于 2023-9-15 13:34:44 | 显示全部楼层
    PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
    允许捕捉中断后,输入端不要高阻悬空,要给确定的电平。高阻悬空的IO电平会漂浮不定,有可能会频繁触发中断。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    11

    回帖

    49

    积分

    新手上路

    积分
    49
     楼主| 发表于 2023-9-28 09:45:19 | 显示全部楼层
    梁工 发表于 2023-9-15 13:34
    PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
    允许捕捉中断后,输入端不要高阻悬空,要给 ...

    的确原因是只停止了计数。中断没关,一直报。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    11

    回帖

    49

    积分

    新手上路

    积分
    49
     楼主| 发表于 2023-9-28 09:48:13 | 显示全部楼层
    梁工 发表于 2023-9-15 13:34
    PCA中断没有清除中断标志,或者中断耗时太长,或者中断太频繁。
    允许捕捉中断后,输入端不要高阻悬空,要给 ...

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

    点评

    14KHz就是72us左右,ADC中断读取ADC值一般不超过2us(主频30MHz),占比不到3%,不应该出现主程序没机会运行的情况,应该是你的程序逻辑除了问题,比如,你上报是什么接口?上报时间是否远小于ADC间隔时间72us?如果  详情 回复 发表于 2023-9-28 13:09
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2980

    回帖

    6717

    积分

    超级版主

    积分
    6717
    发表于 2023-9-28 13:09:41 | 显示全部楼层
    tsunami87 发表于 2023-9-28 09:48
    但有另外一个疑问是,我一直开着ADC,采样频率是14khz多,ADC一直有采样中断上报,中断处理函数也很简单 ...

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

    使用道具 举报

    该用户从未签到

    1

    主题

    11

    回帖

    49

    积分

    新手上路

    积分
    49
     楼主| 发表于 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后主循环运行就正常。

    点评

    你可以用一个IO指示你的中断执行时间: 中断函数 { P10 = 1; 中断代码; P10 = 0; } 示波器看P1.0的高电平时间,以及周期。  详情 回复 发表于 2023-10-3 23:38
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-10 11:34 , Processed in 0.070285 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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