星允派F103·

星允派(nebula pi) 串口

173163102

173163102

42 0

使用在 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星允派。

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人