STM32串口设定流程总结

本文详细介绍了STM32串口配置的过程,包括时钟配置、IO重映射、IO功能模式设置、串口模块初始化等关键步骤,并提供了具体的寄存器配置代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



STM32配置串口需要配置的寄存器包括:

1、时钟配置,开启相应IO端口的时钟,以及串口模块的时钟。

      串口1模块时钟寄存器:RCC_APB2Periph_USART1

      串口1的端口是PA9PA10,对应的时钟寄存器:RCC_APB2Periph_GPIOA

      开启的函数是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

      串口2的模块时钟寄存器:RCC_APB1Periph_USART2

      串口2的端口是PA2,PA3;对应的时钟寄存器是:RCC_APB2Periph_GPIOA

      开启的函数是:RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2| RCC_APB2Periph_GPIOA, ENABLE);

此处的意义在于开启了我们要使用的模块:串口模块1/串口模块2,以及对应的IO 时钟项。如果要使用STM32中的硬件首先就是要配置和开启相应模块的时钟。

2IO重映射的问题:

STM32的管脚功能可以重映射,可以将串口2TXRX端口从原来默认的PA2PA3,重新定义到PD5,PD6上,定义完成后,串口2TXRX端口就不再是原来的管脚,而是PD5PD6了。

要进行IO的重映射,首先要开启IO重映射的时钟:此项时钟寄存器的名称是:RCC_APB2Periph_AFIO

开启此时钟的代码:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIOENABLE);

开启了时钟后,还要写入控制IO重定义功能的寄存器:

GPIO_PinRemapConfig函数是用来写入此寄存器的,写入对应的位,就可以实现IO 的重定义功能。

GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

如果IO 重定义了,那么重定义之前的端口PA2PA3就不要设置了,只设置映射后PD5PD6就可以了。

3、设置TxRXIO功能模式,以及IO speed

 

      //GPIO配置RX

      GPIO_InitStructure.GPIO_Pin= USART1_RxPin;//

      GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;

      GPIO_Init(USART1_GPIO,&GPIO_InitStructure);

 

      //GPIO配置TX

      GPIO_InitStructure.GPIO_Pin= USART1_TxPin;

      GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;

      GPIO_Init(USART1_GPIO,&GPIO_InitStructure);

此处需要注意的是:

1.Speed = 50hz.

2.Rxmode设置为:GPIO_Mode_IN_FALOATING;

3.Txmode设置为:GPIO_Mode_AF_PP

4、对串口模块进行初始化设置:

 USART_InitStructure.USART_BaudRate = 9600;//波特率的设定

 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//每个字有几位

 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;//需要开启哪些mode

 

  /*Configure USART1 */

 USART_Init(USART1, &USART_InitStructure);     //将以上的设定写入到寄存器中去。

5、是能发送和接收中断:

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

6、使能串口:

 USART_Cmd(USART1, ENABLE);

7、因为是能了中断,所以在这些工作之前还需要对中断进行设定:

 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;//待设定的中断通道

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//中断的主优先级

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//中断的次优先级

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断是能还是不使能

 NVIC_Init(&NVIC_InitStructure);

设置完以上的7项,串口就可以正常的工作了。当然,开始的系统时钟什么的初始化还是要做的。不过和这个没关系,在此不再赘述。

 

 

### STM32串口通信的设计步骤与流程 STM32串口通信功能基于其通用同步/异步收发器(USART),能够实现与其他设备的数据交换。以下是设计STM32串口通信的主要步骤以及对应的流程说明: #### 1. 配置系统时钟 在使用STM32的USART外设之前,需要先初始化系统的时钟源。通常情况下,会启用外部晶振并设置PLL来提供稳定的时钟频率[^1]。 ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 初始化时钟配置 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; HAL_RCC_OscConfig(&RCC_OscInitStruct); // 设置系统时钟为72MHz RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); ``` #### 2. 配置GPIO引脚 为了使能USART的功能,需将相应的TX和RX引脚配置为复用模式,并设置合适的上下拉电阻[^2]。 ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 (假设USART1位于PA9/PA10) // TX Pin (PA9) GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // USART1 Alternate Function HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // RX Pin (PA10) GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式 GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 3. 初始化USART模块 通过调用`HAL_UART_Init()`函数完成USART硬件参数的设定,包括波特率、数据位数、停止位及校验方式等[^1]。 ```c UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // 波特率为115200bps huart1.Init.WordLength = UART_WORDLENGTH_8B; // 数据长度为8位 huart1.Init.StopBits = UART_STOPBITS_1; // 单停止位 huart1.Init.Parity = UART_PARITY_NONE; // 无奇偶校验 huart1.Init.Mode = UART_MODE_TX_RX; // 收发双向模式 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 关闭硬件流控 if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } ``` #### 4. 编写发送接收逻辑 利用中断或者DMA机制可以提高程序效率,在此仅展示简单的轮询方法用于基础测试。 ```c uint8_t data_to_send[] = "Hello from STM32!"; HAL_UART_Transmit(&huart1, data_to_send, sizeof(data_to_send), HAL_MAX_DELAY); // 发送字符串 uint8_t received_data[20]; HAL_UART_Receive(&huart1, received_data, sizeof(received_data), HAL_MAX_DELAY); // 接收数据 ``` #### 5. 调试验证 借助虚拟终端软件观察实际传输效果,确认双方握手正常且未发生丢包现象[^3]。 --- ### 流程图概述 以下是一个简化版的STM32串口通信开发流程图描述: 1. **启动阶段**: 开启必要的电源与时钟资源。 2. **端口映射**: 定义哪些物理管脚对应于特定的USART实例。 3. **属性定义**: 明确帧格式的各项指标。 4. **驱动加载**: 将预编写的固件烧录至目标板卡。 5. **运行检验**: 进行初步连通性和功能性检测。 ![STM32 Serial Communication Flowchart](https://example.com/stm32_serial_flow.png) *(假想链接)* ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值