CH573 HAL_SLEEP后 ADC采样不准确,一直溢出,把HAL_SLEEP宏取消后ADC就正常
    GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_Floating);
    ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
    RoughCalib_Value = ADC_DataCalib_Rough(); 
    ADC_ChannelCfg(ADC_CHANNEL);

ADC设置如上所示,在全局定义了HAL_SLEEP的宏以后,ADC只有前几次是对的,随后开始不正常,一直处于接近溢出的状态(好像是4070+左右),无论adc引脚电压怎么变,把HAL_SLEPP的宏取消后,一切正常,前几次和后续测量一直都很正常,电压测量范围为锂电池电压的3.5~4.2v经过10k+10k的分电阻,即3.5/2v~4.2/2v,请问这是什么情况呢?谢谢!!如果却有此情况,那么使用ADC时是否无法使用HAL_SLEEP了?

您好,ADC与休眠的使用注意以下几点:

①为了减少休眠期间的IO漏电,ADC采值引脚在休眠前建议配置为上/下拉输入以固定电平,在唤醒后重新配置为浮空输入。

②sleep唤醒后,需要重新初始化ADC,重点关注CHANNEL选择的配置。

③外围电路是否有大电容,若有,①中休眠前的上拉会给电容充电;休眠唤醒后先等待电容放电,过一段时间再采集ADC。


好的,我先按您方法检测试试先,谢谢


按照二楼方法在MounRiver全局宏定义HAL_SLEEP后,ADC可以正常测量了!该问题已解决,谢谢!!
但是部分的hal层的任务不正常,请问一下宏定义HAL_SLEEP后,其他外设需要注意什么事项吗?如spi,串口或者hal层的一些任务设定等,目前hal层有个串口解析数据的任务(串口接收使用串口的中断),该任务为50ms周期,但是打开HAL_SLEEP后,该任务不正常了,具体未测试原因,但鉴于使用HAL_SLEEP前一切正常的情况,想咨询下使用HAL_SLEEP的相关注意事项,谢谢!!


注意sleep休眠期间,MCU的32M晶振是停止振动的,MCU也就没了主频。“串口解析数据的任务(串口接收使用串口的中断)”串口接收是要跑主频的,休眠期间收不到。

sleep休眠+串口接收的解决方案:

①能接受串口发给MCU的第一包丢包,一段时间后(唤醒后等待主频稳定需要约1.5ms)用第二包通信,那么可以将MCU的RX引脚,配置为GPIO唤醒的引脚,第一包用来唤醒MCU,第二包用来交互数据。CH582芯片Sleep模式串口唤醒接收数据 - SweetTea_lllpc - 博客园 (cnblogs.com)

②MCU有多余的IO可以单独用作唤醒,那么在串口数据发送前先拉IO唤醒MCU,再发串口包通信。也是需要注意主频稳定需要数个ms。

也可以上位机和MCU之间约定好通信格式,一收一发。上位机需要发包时,不断查询MCU是否已经唤醒;MCU每隔50ms就等待比如说5ms来判断上位机是否下发数据,收到数据就给上位机回包。总之,MCU需要处于唤醒后的状态才可以收到串口数据。


明白了!!谢谢您!!那也就是说HAL_SLEEP休眠期间,系统滴答定时器也是无法正常工作的,如果有需要一直得到系统时间差用作微积分运算,那应该就不能使用HAL_SLEEP了吧?如果是不行的话,能否使用tmos开一个event专门做毫秒累加代替系统滴答定时器,这样是否可行呢?


是的,sleep休眠期间主频停止了,滴答定时器也不会工作。

看您需要什么样的功能,总的来讲如果sleep休眠期间也要保持计数,那么一定要用32K时钟来计数。

TMOS系统本身就可以视作一个定时器,调用tmos_start_task接口安排延迟执行事件,会有一个0.625ms为单位的时钟,用它来安排什么时候唤醒以执行事件,系统时间差可以在唤醒后调用RTC_GetCycle32k接口获取当前RTC计数后与上次结果作差(计满一天会清零重新计数);如果每隔0.625ms都要唤醒一次,那太频繁了,TMOS系统安排不了休眠。


RTC在sleep休眠期间会正常计数吗?


请问一下如果有1ms间隔的任务,还有必要开启HAL_SLEEP吗,感觉也是挺频繁的


RTC在休眠期间也是一直跑的。

1ms一次太频繁了,没必要开休眠,实际上也睡不下去。sleep.c里的CH57X_LowPower函数中,会判断下一次TMOS事件执行的时间点,与当前RTC事件的差值,是否小于1ms,若小于1ms是直接return,不会继续跑休眠的。

image.png


好的,明白了!!!谢谢!


您好,想再咨询下sleep休眠期间与看门狗的关系,例如:sleep休眠时间大于喂狗时间,看门狗如果使用看门狗溢出中断喂狗,是否会正常喂狗呢?


另外想咨询下tmos任务间自动sleep和自动唤醒,这个过程是通过rtc唤醒来实现的吗?根据下一个任务的时间间隔来设置对应的rtc触发时间以此来唤醒系统运行tmos任务,是这样吗?谢谢!


请问一下使用内部rtc,并且校准后,时间单位是按照频率32768还是32000去计算呢?我看手册上好像说是校准到32khz 但是rtc寄存器上写的是以32768为基准,对此有点疑惑,谢谢了!!!!!!


只有登录才能回复,可以选择微信账号登录