STM32问题总结

前言:

最近在做一个基于STM32F091RX的智能锁项目,第一次做ST的项目,刚开始还是有点茫然,网上各种查资料,ST有两种开发方式分别是基于寄存器的开发,基于库的开发,就开发周期与简单程度来说,库开发比较方便点,但是很难让你深刻的理解各个寄存器,对于新手来说,用寄存器开发提升比较大点,对ST的理解也会更深,而我们老大,直接叫我基于HAL库的开发(基于函数库再封装一层)这样开发程度更难。

成长过程:

最开始都没听过HAL库这个概念,还是茫然。然后网上找到一个比较好的教程,就这样瞎子开始过河了,这里要感谢下微学堂的教程,让我很快的掌握了HAL库,当然中途也遇到不少问题,各种百度找问题。

问题总结:

   HAL_Delay()的理解:最开始也不知道HAL库有自己的延时函数,然后自己用systick写了自己的延时函数,但是SYStick的局限性,最多只能延时两秒,而且重新配置关于systick的寄存器,打乱的原有的HAL库,最后发现有个HAL_Delay()函数很好用,他的实现有点类似内核的时钟jiffies,时间到了1s,产生中断,然后变量 uwTick++。

DMA的理解:DMA在IC中是个很常用的功能,作用就是减轻CPU的工作负担,不经过CPU,外设直接从内存中读取

基于DMA的音频文件读取:由于开发成本问题,目前这个只能锁没用语音IC,而是直接用一个DAC接功放,再接喇叭,DAC读取WAV文件,采用了DMA方式,这样减轻了CPU负担,void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *thdac)
{
// printf("dac dma cplt\n");
wave_dma_status = 1;
}
void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* thdac)
{
// printf("dac dma half cplt\n");
wave_dma_status = 2;

}

用到了DAC半转换与全转换的回调函数实现.

低功耗问题:最近再调低功耗问题,ST有三种低功耗状态,sleep,stop,standby,sleep的功耗在MA级,stop与standby的功耗再uA级,由于stop的功耗有点大,而standby模式虽然最省电,但是它必须用wakeup唤醒,而且由于Standby模式,把内部电源全部关闭,导致寄存器数据丢失,唤醒后,代码需重新启动,感觉这功能不是很实用,最终选择了STOP模式,功耗在五六uA级别,关键是可以实用任意外部中断唤醒。但是木有遇到一个问题,IO脚的切换问题,原本打算把闲置的IO脚设置成模拟输入(最省电的模式),然后唤醒后,重新配置外设,但是会导致程序跑飞,目前还没找到问题,很尴尬。

扫描二维码关注公众号,回复: 1577138 查看本文章

总结:不断学习,博观而约取,厚积而薄发。

猜你喜欢

转载自blog.csdn.net/welbell_uplooking/article/details/80654076