STM32 之 HAL 库USART的DMA的使用

上一篇对于UART的使用是非常初级的。一般我也只会用来进行代码测试,不会运用到实际项目当中。因为阻塞式的询问串口数据非常占用CPU的使用率,即便每次询问1ms对于CPU来讲都是很长时间的空闲状态。上一篇讲的bug也只是出现在该情况下。因为对于串口数据的到来时间不确定,所以浪费了很多时间在等待信号。

非阻塞式的串口通信主要有IT和DMA。

IT是利用MCU的中断的硬件特性,就像是示波器的trigger一样。它捕捉相应信号的上升下降沿,触发后进入系统注册的中断函数。很多人会告诉你像STM32这样的MCU都是单核的不存在多线程,实际上并不是。STM32的外设通信与控制都是由不同的时钟来实现的。如下图:

这是STM32的时钟配置,系统时钟实际上分频为了10个时钟。这10个时钟实际上是相互独立的,正如同多核心一样可以异步完成任务。我们程序的main函数使用的是SYSCLK。而中断正是使用的图中的PCLK。可能是PCLK1也可能是PCLK2,需要到手册上查表。

这里提醒一点,因为HAL库的计时精度和延时精度都是ms级别的,有的人在SYSCLK里面的Tick事件里面进行计时来实现精度更高的延时或者控制。这绝对是错误的。在SYSCLK的TICK里面会直接影响到主程序的运行。如果你的计时代码复杂一点,可能你的main函数中的代码就会卡住根本不会运行了。因为系统时钟被你在Tick里面的代码跑满了。所以有这种需要的话在上图中任选一个不用的时钟来实现都可以,推荐APB1和APB2也就是timer时钟。

我的新版CubeMX下,中断使用的时钟源还是可选择的:

  • 19
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值