STM32F4 HAL库中是如何实现UART IO配置的?
1.配置串口IO、中断等底层的东西需要在用户文件中重写HAL_UART_MspInit函数
2.hal库是在stm32f4xx_hal_msp.c文件中重写的HAL_UART_MspInit函数,分析如下:
stm32f4xx_hal_msp.c通过间接方式最终包含了stm32f4xx_hal_uart.h,包含关系如下:
stm32f4xx_hal_msp.c
-->#include "main.h"
-->#include "stm32f4xx_hal.h"
-->#include "stm32f4xx_hal_conf.h"
-->#define HAL_UART_MODULE_ENABLED //是否使用串口模块的开关,打开开关则包含头文件 #include "stm32f4xx_hal_uart.h"
3.stm32f4xx_hal_uart.h头文件中有HAL_UART_MspInit函数的声明
-->void HAL_UART_MspInit(UART_HandleTypeDef *huart);//定义在stm32f4xx_hal_uart.h头文件中
4.stm32f4xx_hal_uart.c源文件中有HAL_UART_MspInit的弱实现
-->__weak修饰的函数其作用是将当前文件的对应函数声明为弱函数符号,如果外部文件出现相同的函数名,最终编译出来的
文件会优先指向外部文件的函数符号;因此HAL_UART_MspInit函数实现了重写。
/**
* @brief UART MSP Init.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval None
*/
__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_MspInit could be implemented in the user file
*/
}
4.重写后的函数
1 /**
2 * @brief UART MSP Initialization
3 * This function configures the hardware resources used in this example:
4 * - Peripheral's clock enable
5 * - Peripheral's GPIO Configuration
6 * @param huart: UART handle pointer
7 * @retval None
8 */
9 void HAL_UART_MspInit(UART_HandleTypeDef *huart)
10 {
11 GPIO_InitTypeDef GPIO_InitStruct;
12
13 /*##-1- Enable peripherals and GPIO Clocks #################################*/
14 /* Enable GPIO TX/RX clock */
15 USARTx_TX_GPIO_CLK_ENABLE();
16 USARTx_RX_GPIO_CLK_ENABLE();
17 /* Enable USART2 clock */
18 USARTx_CLK_ENABLE();
19
20 /*##-2- Configure peripheral GPIO ##########################################*/
21 /* UART TX GPIO pin configuration */
22 GPIO_InitStruct.Pin = USARTx_TX_PIN;
23 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
24 GPIO_InitStruct.Pull = GPIO_NOPULL;
25 GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
26 GPIO_InitStruct.Alternate = USARTx_TX_AF;
27
28 HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
29
30 /* UART RX GPIO pin configuration */
31 GPIO_InitStruct.Pin = USARTx_RX_PIN;
32 GPIO_InitStruct.Alternate = USARTx_RX_AF;
33
34 HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
35 }
STM32F4 HAL库中是如何实现UART IO配置的?的更多相关文章
- stm32 HAL库笔记(一)——普通IO口
今天介HAL库操作普通IO口,就是输入/输出. 如果用CubeMX配置io工程,打开以后可以看到如下代码: GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB ...
- STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义
DMA_FLAG_TCIF0_4就是指DMA的通道0和通道4,DMA_FLAG_TCIF1_5就是指DMA的通道1和通道5,DMA_FLAG_TCIF2_6就是指DMA的通道2和通道6,DMA_FLA ...
- STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章 STM32H7的USART串口基础知识和 ...
- STM32 之 HAL库(固件库) _
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数
最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例)我们首 ...
- STM32 之 HAL库(固件库)
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章 STM32H7的HAL库框架设计学 ...
- STM32基于HAL库通过DMA读写SDIO
通过STM32CUBEMX生成DMA读写sdio的工程,再读写过程中总会卡死在DMA中断等待读写完成的while中,最终发现while等待的标志在SDIO的中断里置位的,而SDIO中断优先级如果小于或 ...
随机推荐
- DRF排序
排序 对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序. 使用方法: 在类视图中设置filter_backends, 使用 ...
- docker配置文件模板
{ "registry-mirrors": [ "https://bxsfpjcb.mirror.aliyuncs.com" ], "max-conc ...
- JS语句创建简单表格
var line=3; var list=3; var table=document.createElement("table"); table.setAttribute(&quo ...
- 2022-05-27内部群每日三题-清辉PMP
1.一个组织正在开始一个大型的.首个这种类型的项目.项目经理与相关方召开会议,以识别存在的项目问题.项目经理应该使用什么工具和技术来改进会议的结果? A.头脑风暴.核对单和访谈 B.头脑风暴.因果图和 ...
- python_子网划分计算器
import ipaddress class Compute: def __init__(self, network): self.net = network # 功能1: ip子网划分 def ip ...
- maven-阿里云镜像
<mirror> <id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots&l ...
- (已解决)nginx+php 上传文件大小设置。
1. 问题 上传文件过大报错,413 Request Entity Too Large. 2. 解决方法 修改配置文件,在以下两处: a. php.ini文件(php目录) 在File Uploads ...
- AI口算批改、练习小程序
一个口算助手小程序,可以拍照批改作业,口算练习,专为家长辅导孩子学习打造的口算助手. 后端采用java开发 下载源码: http://market.zhenzikj.com/detail/132. ...
- 16.SharedPreferences存储
1.SharedPreferences存储 不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的,保存为.xml文件. 也就是说当保存一条数据的时候,需要给这条数据提 ...
- 和为K的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . /** * @param {number[]} nums * @param {number} k ...