void uart_init1(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); USART_DeInit(USART2); //复位串口 //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10解释代码
这段代码是初始化STM32的USART2串口,其中包含以下步骤:
- 使能USART2和GPIOA的时钟,以及复用功能的时钟。
- 将USART2重置为默认状态。
- 配置PA.9引脚为复用推挽输出,速度为50MHz。
- 配置PA.10引脚为浮空输入。
- 初始化GPIOA的PA.9和PA.10引脚。
最终实现的功能是,将USART2的TX引脚连接到PA.9引脚,将USART2的RX引脚连接到PA.10引脚,以便进行串口通信。
void uart_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 }
这段代码是用来初始化USART1串口的函数。以下是代码的解析:
首先,通过调用RCC_APB2PeriphClockCmd
函数来使能USART1和GPIOA的时钟。这是为了确保这两个外设能够正常工作。
接下来,使用GPIO_Init
函数初始化PA.9和PA.10引脚,分别作为USART1的TX和RX引脚。PA.9被配置为复用推挽输出模式,而PA.10被配置为浮空输入模式。
然后,使用NVIC_Init
函数配置USART1的中断优先级和使能。这里的配置将USART1的中断优先级设置为3,并使能该中断通道。
接着,使用USART_Init
函数初始化USART1的相关参数,包括波特率、数据位长度、停止位数、奇偶校验位、硬件流控制和收发模式等。
最后,通过调用USART_ITConfig
函数开启USART1的接收中断,并使用USART_Cmd
函数使能USART1。
这样,经过初始化后,USART1串口就可以进行数据的收发了。
void uart4_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //使能GPIOC时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//使能USART4时钟 //串口4对应引脚复用映射 GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4); //GPIOC10复用为USART4 GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4); //GPIOC11复用为USART4 //USART1端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOC12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC12 //USART1 初始化设置 USART_InitStructure.USART_BaudRate = bound; //波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(UART4, &USART_InitStructure); //初始化串口4 USART_Cmd(UART4, ENABLE); //使能串口4 //USART_ClearFlag(USART1, USART_FLAG_TC); #if EN_UART4_RX USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启相关中断 //Uart4 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //串口4中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 #endif 换成HAL库程序
使用STM32 HAL库重写UART4初始化函数
GPIO配置
在使用HAL库时,GPIO的配置可以通过HAL_UART_MspInit()
函数完成。此函数会在调用HAL_UART_Init()
时被自动触发[^2]。因此,无需手动声明该函数。以下是具体的GPIO配置过程:
static void MX_UART4_GPIO_Init(void)
{
__HAL_RCC_GPIOD_CLK_ENABLE(); // 启用GPIOD时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/** UART4 TX/RX 配置 */
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6; // 假设TX为PD5, RX为PD6
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4; // 设置为UART4复用功能
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
UART配置
对于UART4的初始化,主要涉及波特率、数据位、停止位以及校验位等参数的设置。这些都可以通过结构体UART_HandleTypeDef
来定义并传递给HAL_UART_Init()
函数。
UART_HandleTypeDef huart4;
void MX_UART4_Init(void)
{
huart4.Instance = UART4; // 定义使用的UART实例
huart4.Init.BaudRate = 115200; // 波特率为115200bps
huart4.Init.WordLength = UART_WORDLENGTH_8B;// 数据长度为8位
huart4.Init.StopBits = UART_STOPBITS_1; // 停止位为1
huart4.Init.Parity = UART_PARITY_NONE; // 无奇偶校验
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;// 关闭硬件流控制
huart4.Init.Mode = UART_MODE_TX_RX; // 收发模式开启
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; // 不启用高级特性
if (HAL_UART_Init(&huart4) != HAL_OK) // 初始化UART
{
Error_Handler(); // 错误处理函数
}
}
中断设置
为了使能UART4的中断接收功能,需先配置NVIC优先级组,并注册相应的中断向量表项。接着利用HAL_NVIC_EnableIRQ()
激活指定的中断源。最后,在中断服务程序中调用HAL_UART_IRQHandler()
以执行实际的数据接收逻辑[^3]。
// NVIC配置
__HAL_RCC_UART4_CONFIG(RCC_APB1_PERIPHCLK_PCLK); // 配置UART4时钟源
HAL_NVIC_SetPriority(UART4_IRQn, 0, 1); // 设定抢占优先级和子优先级
HAL_NVIC_EnableIRQ(UART4_IRQn); // 开启UART4中断
// 中断服务例程
void UART4_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart4); // 调用HAL层的中断处理器
}
// 接收完成后回调函数示例
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == UART4)
{
/* 用户自定义操作 */
}
}
以上即为基于STM32 HAL库实现UART4初始化的主要步骤,涵盖了GPIO引脚分配、UART基本属性设定以及中断机制的相关内容[^1][^3]。
相关推荐
















