STM32F103C8T6串口1B6B7通信
时间: 2025-01-01 08:31:03 浏览: 14
### STM32F103C8T6 使用串口1 B6/B7 引脚进行 UART 通信配置
对于STM32F103C8T6单片机而言,在使用B6/B7作为UART通信引脚时需要注意这些引脚并非默认用于USART1。通常情况下,USART1的TX/RX被分配到A9/A10上[^1]。然而,通过重映射功能可以将USART1重新定位至其他GPIO端口,比如PB6/PB7。
#### GPIO与USART初始化设置
为了实现这一目标,需先完成基本的硬件抽象层(HAL)库初始化工作,并确保正确设置了相应的外设时钟使能以及GPIO模式切换:
```c
// 启用所需外设时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
// USART1_TX (PB6), USART1_RX(PB7) 配置为复用推挽输出/上下拉输入
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 执行重映射操作以改变USART1的功能引脚位置
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
```
上述代码片段展示了如何启用必要的时钟资源并针对USART1指定新的I/O线路。值得注意的是,这里调用了`HAL_NVIC_*()`函数来设定中断优先级并向量表项,这一步骤是为了后续可能涉及到的数据接收处理做准备。
#### USART参数配置
接下来定义具体的波特率及其他传输特性:
```c
static void MX_USART1_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
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;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
```
此部分负责建立实际的通讯链路属性,包括但不限于比特率、字符长度等重要选项。此处选择了常见的115200bps速率及无校验位的标准帧结构。
#### 中断服务程序(ISR)
最后编写ISR用来响应来自外部设备的消息事件:
```c
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
/* USART1 init function */
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
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;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
```
这段代码实现了当接收到新数据包时触发相应动作的能力,从而允许应用程序实时获取最新信息更新。
阅读全文