使用在 STM32F103VE 上配置和使用 USART的输出。 下面是我对如何调试串口 输出的总结和步骤细化:
1、认识串口
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
配置 USART1 的步骤 激活 USART 通过设置 USART_CR1 寄存器中的 UE 位来激活 USART。
设置字长 配置 USART_CR1 寄存器中的 M 位来定义数据字长(8 位或 9 位)。
配置停止位 在 USART_CR2 寄存器中设置停止位的位数(0.5、1.5 或 2 个停止位)。
DMA 配置 如果需要使用多缓冲器通信,配置 USART_CR3 中的 DMAT 位,并设置相关的 DMA 寄存器。
设置波特率 使用 USART_BRR 寄存器来选择所需的波特率。波特率由分数波特率发生器设定,支持宽范围的波特率选择。
启用发送器 设置 USART_CR1 中的 TE 位以启用发送器,并发送一个空闲帧作为第一次数据发送。
发送数据 将要发送的数据写入 USART_DR 寄存器。这会清除 TXE 位,表示数据已加载到发送缓冲器。
等待传输完成 在写入最后一个数据字后,等待 TC 位变为 1,表示最后一个数据帧的传输已经完成。 调试串口 1 输出的步骤 软件配置 根据配置步骤,编写代码配置 USART1。 确保波特率、数据位、停止位等参数与接收设备一致。
发送测试数据 编写代码通过 USART1 发送一些测试数据(字符串“Hello, World!”)。 确保数据已正确写入 USART_DR 寄存器。
2、串口引脚图


上图所示连接,串口PC端连接与开发板的是PA3,PA2--PA9,PA10.
3、使用STM32 cube MX 软件中配置
引脚PA9,PA10定义

引脚功能配置

定义串口的波特率等信息

3、串口输出信息

根据实际输出可以看到串口有输出对应的信息。
4、代码
上电输出代码
printf("hello,wold!\r\n");
unsigned char Sendbuf[] = "星允派!rymcu pi\r\n";
HAL_UART_Transmit(&huart1,Sendbuf, sizeof(Sendbuf),HAL_MAX_DELAY);
主函数代码
while (1)
{
/* 用户代码结束位置(由STM32CubeMX生成的部分结束) */
/* 用户自定义代码开始位置 */
// 读取按键K1的状态,假设按键按下时引脚电平为0,未按下时为1
i = HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin); // 读取KEY1的状态
if (i == 0)
{
// 如果按键K1被按下(电平为0),则让LED1闪烁
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); // LED1点亮
HAL_Delay(300); // 延时300毫秒
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET); // LED1熄灭
HAL_Delay(300); // 延时300毫秒
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); // 再次点亮LED1(这里可能是多余的,可以根据需要调整)
}
else
{
// 如果按键K1未被按下(电平为1),则保持LED1熄灭
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
}
// 检查是否接收到数据(rx_done标志位为1表示数据接收完成)
if(rx_done == 1)
{
rx_done = 0; // 清除接收完成标志位,准备接收下一组数据
// 打印固定字符串"rymcu.com!"到串口
printf("rymcu.com!\r\n");
// 打印接收到的数据长度(可选,根据需要启用)
// printf("length of rx data: %d!\r\n",rx_cnt);
// 循环打印接收缓冲区中的数据
for(int i = 0; i < rx_cnt; i++)
{
printf("%c", rx_buff[i]); // 逐个字符打印接收到的数据
}
printf("\r\n"); // 打印换行符
rx_cnt = 0; // 清除接收数据计数器,准备下一次接收
}
// 以下代码被注释掉,原本功能是让LED1状态取反(即闪烁),但频率由延时决定
// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); // 切换LED1的状态
}
static void MX_USART1_UART_Init(void)
{
/* 用户自定义代码开始前的部分(由STM32CubeMX生成) */
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* 用户自定义代码开始位置(预留区域) */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
// 配置USART1的基本参数
huart1.Instance = USART1; // 指定使用的USART外设为USART1
huart1.Init.BaudRate = 115200; // 设置波特率为115200
huart1.Init.WordLength = UART_WORDLENGTH_8B; // 设置数据位长度为8位
huart1.Init.StopBits = UART_STOPBITS_1; // 设置停止位为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; // 使用16倍过采样
// 初始化USART1,如果初始化失败,调用错误处理函数
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler(); // 调用错误处理函数
}
/* 用户自定义代码开始后的部分 */
/* USER CODE BEGIN USART1_Init 2 */
// 启用USART1的接收中断(RXNE)和空闲中断(IDLE)
// RXNE中断:当接收数据寄存器中有数据时触发
// IDLE中断:当接收线路处于空闲状态时触发
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE | UART_IT_RXNE);
/* USER CODE END USART1_Init 2 */
}
5、KEIL设置

总结: 通过对星允派的开发,让我从入门到精通又进一步的有了收获,了解了串口的工作原理现工作方式,知道了如何去实现和使用STM32F103星允派。