HAL库STM32的串口收发教程

这篇具有很好参考价值的文章主要介绍了HAL库STM32的串口收发教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        首先配置STM32CubeMX

第一步在系统SYS里的Debug(调试)选项选择Serial Wire(这里使用ST-LINK-V2仿真下载器所以选择该项)。

hal 串口接收,stm32

 第二打开使用外部晶振

hal 串口接收,stm32

 在芯片引脚上点击PC13选择GPIO_Output(即设置GPIO为输出模式)

hal 串口接收,stm32

点击GPIO,点击PC13

hal 串口接收,stm32

在其下方配置引脚:

GPIO out  level 设置成High(高电平)即初始设置成高电平。本处使用的最小系统STM32F103C8T6,其自带LED灯的正极默认接3.3V,负极接PC13引脚,也就是使用这款最小系统则无需接线。当PC13输出低电平时,LED亮起,输出高电平时LED熄灭。

GPIO mode设置成Output Push Pull(推挽输出)

GPIO Pull-upPull down 设置成No pull-up and no pull-down(不上拉也不下拉)

Maximum output speed设置成Low(低速模式)

User Label 名称根据自己喜好命名,也可以不命名这里命名为PC13

hal 串口接收,stm32

hal 串口接收,stm32

串口数据发送有两种方式,一种是阻塞式的,一种是非阻塞式的。阻塞式的顾名思义就是数据发送是一次接一次发送的,也就是上一个数据发送完成才会继续接着发送下一个数据,每次发送数据都按时间顺序排队。而非阻塞式则会立即发送。

首先介绍阻塞式的

在Function中选择

HAL_UART_Transmit (UART_HandleTypeDef *huart, const uint8 t *pData, uint16 t Size, uint32 t Timeout)

这个函数就是阻塞式串口发送数据,第一个参数是UART句柄,指向已初始化的UART外设。指向huart这里使用串口一所以是huart1的地址,第二个参数是需要发送的数据。Txstr1的字节大小使用sizeof来取大小。Timeout是操作超时时间,单位是毫秒。当执行某个操作时,可能会遇到需要等待的情况,比如等待网络响应、等待数据传输完成、等待锁释放等。为了确保程序的执行不会无限期地阻塞在等待状态,我们可以设置一个超时时间(即 timeout),如果在规定的时间内操作未完成,则会触发超时处理。

hal 串口接收,stm32

将这个函数复制粘贴到主程序里,并填入参数。执行完发送数据后反转LED灯以便可以看到执行效果。在函数名HAL_UART_RxCpltCallback中,"RxCplt"表示"Receive Complete",即接收完成的意思。   

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);//LED灯反转函数。

hal 串口接收,stm32

发送的数据字符串数组命名为Txstr1,字符串内容是hello word,\r\n表示将光标移动到行首并换行。

hal 串口接收,stm32

 将串口一的TX(PA9)和RX(PA10)和USB转TTL的TX和RX相连,注意需要交叉相连。即芯片的TX连接USB转TTL的RX,芯片的RX连接USB转TTL的TX。VCC和GND也要相连,并插入电脑。打开串口助手XCOM,波特率9600,停止位1位,数据位8为,无奇偶校验。按下单片机的复位键,此时串口助手收到hello word,并且单片机上的LED灯亮起。至此,阻塞式串口发送数据完成。

hal 串口接收,stm32

hal 串口接收,stm32

其次是非阻塞式的数据发送。非阻塞式的串口数据发送相比阻塞式会复杂一点。在配置STM32CubeMX的时候多了一步操作。就是要勾选NVCI Settings中的USART1 global interrupt(串口一全局中断)让它使能,如果不勾选这项的话就无法成功发送数据。

hal 串口接收,stm32

非阻塞式也称中断式的串口数据发送函数是HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size),与阻塞式不同的是其没有超时时间参数。

hal 串口接收,stm32

将其复制到主程序里填入参数执行。

hal 串口接收,stm32

中断式的发送方式还需要一个回调函数,回调函数用于执行完数据发送后执行什么内容。weak表示这个函数是虚函数,即函数里没有执行任何内容。我们只需要重写这个虚函数即可。

hal 串口接收,stm32

 回调函数编写如下,当数据发送完成时,LED灯电平翻转即亮起,串口数据发送效果跟上面的方法是一样的。hal 串口接收,stm32

hal 串口接收,stm32

接下来是串口接收教程,接收和中断基本差不多。

使用串口数据接收中断式函数。HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

该函数的*huart指向串口外设。其中,h代表"handle"或者"handler",表示这个结构体是用来处理UART通信相关操作的句柄或者处理器。填写实参时取具体串口的地址即可,如&huart1,表示串口一。*pData即指向所接收的数据的指针,填实参时取对应变量的地址,如&Rxdata。Size是指接收的数据的个数。

hal 串口接收,stm32

将中断式函数写在主函数里。

hal 串口接收,stm32

 另外跟发送一样,中断接收串口数据也有接收完成回调函数。

hal 串口接收,stm32

在主函数前重写串口接收函数即可。

hal 串口接收,stm32

 单片机和电脑使用usb-ttl连接上后打开串口助手。发送01,并勾选以十六进制发送即可。这样单片机上的LED灯也会翻转电平。

hal 串口接收,stm32

非阻塞式串口数据接收函数是HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout),其中Timeout是接收超时时间,每次执行这个函数时都会有一定的超时时间,在超时时间内可以接收数据,在超时时间外不会接收数据无论实际有无收到数据。因此当要重复接收某一数据是建议将此函数放在循环里。

hal 串口接收,stm32

放在循环里之后可以不断接收数据,当接收到01时电平翻转一次。

hal 串口接收,stm32

 文章来源地址https://www.toymoban.com/news/detail-621266.html

到了这里,关于HAL库STM32的串口收发教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 串口中断接收数据包

    目录 一、CUBEmx配置 1.设置系统时钟,配置SYS,配置时钟树  ​编辑  2.配置串口USART1 3.配置NVIC,开启串口中断 ​编辑4.点击GENERATE CODE输出文件即可 二、代码部分 0.串口重定向——printf 1.关于舵机 2.开启串口中断函数 3.编写串口回调函数 4.主函数部分 三、实验现象: 四、总

    2024年02月04日
    浏览(33)
  • HAL库STM32CUBEMX学习记录(一)——USART(串口中断收发数据)

    一、首先使用STM32CUBEMX新建一个工程 二、打开工程文件 1.在usart.c中添加以下代码  2.然后在最后面加入中断回调函数 3.在usart.h文件中加入  4.新建一个cmd.c文件,创建命令check函数 5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数 6.最后串口初始化函数后打开串口中

    2024年02月16日
    浏览(31)
  • STM32_HAL库串口接收相关函数分析

    串口接收的程序整体分为三个部分:初始化部分,开启中断部分,中断函数部分: 初始化部分: 该部分主要完成相关引脚的初始化,串口的初始化(设置波特率,校验位,字长等),为了逻辑清晰,把初始化相关代码放在本文的最后。 开启中断部分: 调用HAL_UART_Receive_IT函数

    2024年02月16日
    浏览(33)
  • 【STM32】HAL库 STM32CubeMX——DMA (串口DMA发送接收)

    软件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦线,面包板,USB转TTL DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道系统的运

    2024年02月12日
    浏览(52)
  • STM32使用HAL库,串口收发一段时间后出错问题及解决

    当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。 当数据量过大且传输频率快时,串口可能会因为溢出,

    2024年02月16日
    浏览(31)
  • 【STM32】HAL库——串口中断只接收到两个字符

    环境:STM32CubeMX(6.7.0)+MDK-ARM(V5.36.0.0)+STM32F103C8T6 使用XCOM发送字符串(总共8个字符),单片机进行解析为ModBus协议失败,只接收到前两个字节的数据。 原串口中断回调函数: 去掉串口中断回调函数的printf函数即可 在嵌入式系统中,将printf函数直接放在串口中断服务程序(ISR)中

    2024年01月22日
    浏览(33)
  • STM32 HAL库串口突然不再接收数据的异常情况

    STM32串口接收分为阻塞式接收和中断式接收。 1、中断+DMA接收 出现突然不再接收数据的异常情况,最有可能的情况为ORE错误和BUSY标志位持续置高。 解决方法:在重新打开中断接收前,使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误;如果串口中断重新接收打开频繁且间隔短的话

    2024年02月13日
    浏览(40)
  • 【STM32 HAL库实战】串口DMA + 空闲中断 实现不定长数据接收

    STM32CubeMX最新版: 打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR,在Commercial Part Number 中输入MCU型号,例如我在这里输入了STM32L431RCT6。选中正确型号然后双击进入下一步的配置界面。 1.1 SYS配置如图 1.2 RCC配置如图 开启了外部晶振,若无则都选择Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    浏览(61)
  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(42)
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    ✨申明:本文章仅发表在 CSDN 网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 📌相关参考《HAL库教程9:串口接收不定长数据》 🎉对于串口接收不定长数据的处理方案网上有很多,个人觉得采用定时

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包