STM32f103Hal库学习笔记--USART

STM32f103Hal库学习笔记–USART

前言

因为参加学校的航模队需要用到一些单片机,大一下的时候就自学了51,后来大二上的寒假总算是入门了stm32的标准库,大二下因为很多原因搁置了stm32,转战arduino,大二下的寒假开始了解hal库;今天上午想用标准库写一个串口中断收发,结果发现自己连新建工程都不记得怎么操作了(嫌弃自己),所以突发奇想想通过学习笔记来记录学习hal库的过程,第一次写文章,外加半路出家学习单片机,难免会有有一些错误,所以仅供参考。(再次嫌弃)


一、串口是什么?

大致就是一种用于单片机间通信的东西,网上太多介绍的了,反正我也是在网上学的,所以不懂就百度吧。

二、Hal库串口通信

1.中断模式

(1)CubeMx配置

时钟选择,默认选择内部高速时钟
时钟选择,默认选择内部高速时钟(偷懒不想配置时钟)
打开串口,配置串口以及打开中断
打开串口,配置串口以及打开中断
配置工程
配置工程
配置工程

(2)函数相互调用逻辑

串口收发数据(中断模式)主要运用到四个函数
首先是HAL_UART_Recive_IT(中断接收函数),在stm32f1xx_hal_uart.c中,官方描述为使用阻塞模式接收数据,然鹅这里用于中断模式,我自己把这个函数理解为使能中断。
函数本身
第二个函数是USART1_IRQHandler(中断服务函数),在stm32f1xx_it.c文件中,串口接收到数据,产生中断时立即调用。
中断服务函数
第三个是HAL_UART_IRQHandler(中断处理函数),串口产生中断后调用USART1_IRQHandler中断服务函数,中断服务函数调用中断处理函数,该函数用于判断产生中断的来源(收到数据还是发送数据),然后根据来源判断是调用UART_Recive_IT还是UART_Transmit_IT函数。
第四个是UART_Recive_IT(接收函数)(以收到数据产生中断为例),接收发来的数据并储存,然后调用HAL_UART_RxCpltCallBack(中断回调函数),中断回调函数用于用户自行编写产生中断后单片机的动作,记得再次开启接收函数中断,即再次调用HAL_UART_Recive_IT(中断接收函数)。

(3)需要自己添加的代码

//main.c
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
/* USER CODE END PD */

/* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */

//stm32f1xx_it.c
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	HAL_UART_Transmit(&huart1, (uint8_t *)&aRxBuffer, 1, 10000);//将接收到的数据发送
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
}
/* USER CODE END 1 */

(4)总结

串口中断模式收发函数总的来说程序逻辑顺序就是:
HAL_UART_Recive_IT (中断接收函数)//开启中断
USART1_IRQHandler(中断服务函数)//产生中断即调用
HAL_UART_IRQHandler(中断处理函数)//服务函数调用,判断中断源
UART_Recive_IT(接收函数)//根据不同中断源调用不同回调函数
HAL_UART_RxCpltCallBack(中断回调函数)//用户赋予中断执行动作
函数间跳来跳去的确实有点绕,但是绕着绕着还是能大概绕明白的

2.DMA模式

有一说一DMA还没怎么学懂,不过应该现在做的项目还比较基础,后面需要用到了再加深了解也不晚,毕竟还是为了学而学更有动力。

(1)CubeMx配置

老规矩,跟前面的配置差不多,不太重要不细说。
中断配置
中断配置,默认开启DMA中断了,但不太清楚开不开启串口中断
DMA配置
DMA配置

(2)函数相互调用逻辑

MX-DMA-INIT
首先是程序最先调用main函数里面MX-DMA-Init函数,进去看看函数原型MX-DMA-Init函数原型
很简单就是配置中断优先级,开启中断
HAL-DMA-Ini
紧接着再HAL-UART-MspInit里面看到了HAL-DMA-Init和__HAL-LINKDMA,再进去看看两个函数原型
HAL-DMA-Init
HAL-DMA-Init函数原型,官方描述是初始化函数,看原型也确实是配置DMA所需的寄存器
__HAL-LINKDMA
顾名思义就是把串口的tx或者rx连接到DMA上
这里完了之后,DMA的配置就大致结束了,然后再通过HAL-UART-Transmit-DMA来通过DMA方式传输数据(也可以是Recive),下面是函数原型

HAL-UART-Transmit-DMA
官方给的描述是通过DMA的方式发送数据,里面比较重要的函数是HAL-DMA-START-IT,再进去看看HAL-DMA-START-IT
官方给的描述是开启中断,不过还可以看到可以将DMA传输源和传输目标的地址作为形参传入,再看回来,HAL-Transmit-DMA调用HAL-START-DMA-IT,传输源为HAL-Transmit-DMA的形参(uint8_t *pData),目标地址为tx的DR(数据)寄存器。

(3)还没有搞懂的地方

然后函数HAL-Transmit-DMA就被执行完了,然后好像数据就被发送了?我也不是很清楚。(笑死了,自己都没搞清楚就写这篇文章,不过作为一篇自己的笔记,不管搞没搞懂都把它记下来,后面也好再继续学习,也防止自己搞忘)
不过好像还有一个地方没有搞懂,就是DMA说是可以不占用CPU资源的情况下进行数据传输,但是我看好像无论是DMA传输还是中断传输,都是把数据放入tx的DR寄存器,然后再发送出去,难道是DMA传输只需要DMA控制器跟外设都产生了应答就可以传输数据,而不需要跟CPU发出指令吗?那也就是说数据只要放进了DR寄存器就相当于发出去了(或者接受到了)?

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103 HAL库是针对STM32F103系列微控制器的硬件抽象层(HAL)库。该库提供了一组函数和驱动程序,用于方便地使用STM32F103系列芯片的各种外设和功能。HAL库可以简化开发过程,提高代码的可重用性和可移植性。 在Cube固件包的Drivers文件夹下,可以找到HAL库的源码文件夹。HAL库的基本使用可以参考引用中提供的博客,其中详细记录了HAL库学习过程。HAL库的使用可以通过初始化系统时钟、配置外设等方式来实现。 需要注意的是,HAL库的SystemInit函数并不像标准库的SystemInit函数那样进行时钟的初始化配置。它只会打开HSI(高速内部时钟),没有其他时钟相关的配置。因此,在使用HAL库时,我们需要编写自己的时钟配置函数,来对系统时钟进行初始化和配置。 总结而言,STM32F103 HAL库是为了方便开发者使用STM32F103系列微控制器而设计的硬件抽象层库。它提供了一系列函数和驱动程序,可用于配置和控制STM32F103系列芯片的外设和功能。具体的使用方法可以参考相关文档和博客。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32初识HAL库](https://blog.csdn.net/Caramel_biscuit/article/details/130856712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32F103 HAL库基本使用(一)](https://blog.csdn.net/weixin_45488643/article/details/119321607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值