关于HAL库串口中断接收哪些路子 第一弹

一个串口中断搞了两周半,实在汗颜,群里也啰嗦了好多了,为了答谢给予我帮助的一些人,也为了回馈本论坛,就把这两个半周的领悟发出来,希望后来人不要再像我一样走弯路了!废话不多说,直接主题啦!
先说我的硬件平台,最常见的正点原子407开发板,一说“正点”又多想了哈!用过MX的请自动忽略第一弹,直瞅第二弹,节约你的时间。

1 .首先,打开MX,进入那一系列的配置,如图:



1.png



我的板载芯片是STM32F407ZGT6,这里自然也选407,LQFP封装,对应选择。



2.png



片子跑起来,除了电源的另一重要部分,时钟源,我的板子有外部晶振,虽然片子内部也有,但传说中外部的更精准,谁知道呢,反正我没试过,有就用呗,选外部晶振源。



3.png



串口的研究,这里不用多说,我用USART1调试,因为板子电路把USART1做成了RS232,并且都转换成了USB接口的,只要一根手机充电线就OK,总之就是简单,那就USART1吧,选择第一个异步通信。



4.png



这里要说下,调试接口,看到好多人都没选,也能跑得很happy,但是之前也试过仿真的时候遇到一些问题,还没总结原因到底是不是因为这个,但本人觉得人为定义调试方式总比片子自己判断来的靠谱吧,Maybe!我这里选得SWD调试方法。

到这里,管脚配置基本完了,进入下一步!(看到就这么个东东搞两周半,再汗颜一下)



5.png



这一步是配置时钟的,我觉得只要是这个论坛的,没有不知道的!(就是这么啃腚)之前说过要用外部晶振源,而我的外部晶振8M,这里自然要对应把其改成8M,之后就是一系列的锁相环倍频因子、锁相环倍频数之类的巴拉巴拉,串口挂在APB2上,一顿废话之后,我们要做的就是:
点选HSE外部高速,然后在点选PLLCLK倍频时钟,APB2框填那个最大的84M(额就爱最大滴),回车或任意空白单击左键,MX会帮我们搞定的。嘿嘿!



6.png




这一步是各个模块的相关配置,我们主要针对USART,NVIC里把串口的中断打勾,至于组优先和子优先就不研究了,默认0就OK!



7.png




至此,设置完毕,欢快的点那个齿轮,选择路径和开发平台,去生成代码吧,我的开发环境Keil5,就选这个了,重要提示,路径一定要是全英文字符,不然Keil要报错滴!

2 .这里,就开始说说串口了,我就喝口水,使劲罗嗦了,别嫌烦啊!
先说一个最基本的,神马是信息?(求别喷)记得信息论里大概这么个意思,有变化的的东西携带有信息,就好比我写个 1 ,它的信息量少的就是个 1,但我写个 n ,它的信息量基本就无穷大,因为我 n 是多少都可以 ,所以,我们计算机里传递信息就要搞个有复杂度,但又不能太复杂的东西,通俗点说:携带有穷信息的东东,于是,高低电平就出来了,于是,单个高低电平不满足需求,多信息位出来了,于是多信息位不好校验,接收,解析,串行协议就出来了。这么多于是,我不知道怎么解释,我也一知半解,但我觉得差不多到这里就可以了,现在说说串行协议里的几个关键词,波特率已经被老生长谈了,关于发送时间的换算也有了,我就一笔带过,我今天想说说数据位(因为它把我坑了):
常见的数据位就两种: 8位、9位,常用的数据位只有1种:8位,这里是学过微机原理人脑子里的概念,但是,实际情况是这样的8位机中: 一般是 0-8-0-0 结构,0起始位 8数据位 0奇偶校验位 0停止位=8位; 一种 1-8-0-1结构 ,1起始位 8数据位 0奇偶校验位 1停止位=10位。其他9位数据位的不研究,有兴趣的自己“吻度娘”,我们得到两个信息,
不同结构同一波特率数据量有差异;串行数据一帧,有且只会有一个8位的数据,也就是1Byte。


有以上结论,就去耍“码子”吧,打开项目,面对的是一系列系统初始化,包括串口滴(哇哈哈哈,ST真是贴心啊),看看他干了啥?找到main.c并打开,找到这一句:
`UART_HandleTypeDef huart1;` 声明一个串口结构体,用的一种面向对象的思想(别问我怎么知道是串口结构体不是其他的,不然地球不适合你),这里是个神马东东?带一下:


typedef struct
{
USART_TypeDef [i]Instance; /[/i]!< UART registers base address */

UART_InitTypeDef Init; /[i]!< UART communication parameters [/i]/

uint8_t [i]pTxBuffPtr; /[/i]!< Pointer to UART Tx transfer Buffer */

uint16_t TxXferSize; /[i]!< UART Tx Transfer size [/i]/

uint16_t TxXferCount; /[i]!< UART Tx Transfer Counter [/i]/

uint8_t [i]pRxBuffPtr; /[/i]!< Pointer to UART Rx transfer Buffer */

uint16_t RxXferSize; /[i]!< UART Rx Transfer size [/i]/

uint16_t RxXferCount; /[i]!< UART Rx Transfer Counter [/i]/

DMA_HandleTypeDef [i]hdmatx; /[/i]!< UART Tx DMA Handle parameters */

DMA_HandleTypeDef [i]hdmarx; /[/i]!< UART Rx DMA Handle parameters */

HAL_LockTypeDef Lock; /[i]!< Locking object [/i]/

__IO HAL_UART_StateTypeDef State; /[i]!< UART communication state [/i]/

__IO uint32_t ErrorCode; /[i]!< UART Error code [/i]/

}UART_HandleTypeDef;

这里强调一下,由于万恶的 “版圈法”,我的后续已不够全部写在这里,详见 《关于HAL库串口中断接收哪些路子 第二弹》,将就下吧!

12 个评论

等你的《关于HAL库串口中断接收哪些路子 第二弹》!!!!
期待第二弹!!
说道调试接口,我从没设置过,跑的真的很Happy呢...........
但是F103就不行了,....
你这么一说,突然想到,难道真是这个问题.........
对了,论坛里如果是一层楼一层楼分享的话,如果每层楼都需要图片或者代码等等复杂的东西,发表的时候选择[发布问题],不要选择[发布文章],我每次都是这样搞的.然后一层楼一层楼慢慢记录..呵呵
有个同样的开发板 正点 哈哈 正好拿来做实验
新手初来咋到,赞一个
我感觉F4的HAL库,串口中断接收有错,您看看
这是之前的库,F4的库更新过很多次,最近的一次更新已经有很大的改动,所以具体的实现方法可能还要与时俱进。另外由于当时本人水平有限,在其后的第二弹、第三弹、第四弹贴出的代码还是有许多不足之处,在多串口并发时容易暴露许多问题。所以这篇帖子以完全无经验的新手入门理解优先,实际使用受环境影响需要在此基础上进行优化,另外库的变动我会实时关注,同时感谢您提出宝贵意见!

迷迷糊糊看了好多帖子还是迷糊。


已经成功了,谢谢楼主

文章写得不错,度娘有一些这样的资料可以看。

就喜欢看这种文章


要回复文章请先登录注册