USART串口例程

调试中使用log是必不可少的,所以我们来学习一些USART串口,方便我们进行串口打印东西到电脑进行调试~

1. 工程创建

其他设置按照之前教的设置,然后再设置一下串口设置,波特率啥的都设置好,前期先按照我的模板,后续你们自己发挥。注意设置NVIC中断向量,使能串口中断,以及DMA设置,因为我们等等会用到串口不定长空闲中断,实现不定长发送信息这种操作,比较实用,我们的手表项目中也使用到了这种操作。

[!TIP|style:flat|label:Tip 小贴士|iconVisibility:visible] 不知道中断是什么的,请在网上先自行查阅学习一下. Preemption是抢占优先级,Sub Priority是次优先级

设置完PA9 PA10应该都亮起来了,这两个PIN硬件上连接到的CH340,然后连到typec的,方便你接电脑调试。

2. 代码细节

[!TIP|style:flat|label:Tip 小贴士|iconVisibility:visible] 请先保证你已经下拉了仓库,有模版代码了!

生成代码后,我们试试来打印吧~

2.1. 测试发送

首先为了方便打印, 我们将常用的printf重定向到串口1,在usart.c中最后加入一个fputc重定向, 然后打开Use MicroLIB.

然后在while(1)中循环测试发送吧~

printf("uart TX test\r\n");
HAL_Delay(500);

烧录完再按照pin-map插上串口转ttl模块, 插上PA9PA10, 连上电脑看看, 然后看看有什么现象吧. 当然没有串口ttl转USB模块的同学,可以直接使用板子下面的Type-C口,也是串口,不过请注意不要stlink下载器和Type-C两路供电,有供电冲突!

设置好vofa的设置,然后打开串口连接,发现一直有数据传电脑上啦~ 确实是差不多0.5秒一个数据发过来呢~ vofa的下载和使用,大家直接网上搜就行,一直强调自学能力!

2.2. 测试接收

串口接收的方式有很多种,大家可以自行网上搜索,这里只给一个不定长接收的模板,具体的代码内容详见仓库中的工程,这里只解释一下关键的代码。

初始化的时候开启空闲中断,开始接收

// 开启DMA接收
HAL_UART_Receive_DMA(&huart1, RXbuf, 50);
// 幅值寄存器中的IDLE触发中断的内容
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

然后在USART1中添加这个内容,即接收中断发生时,查看是否为空闲中断。

注意,中断中有打印函数(串口发送),这是不规范的,容易出问题,建议创建一个队列存放需要发送的内容,然后在一个特定的任务中不断读取queue然后发送内容。这个任务需要放到while(1)中。

void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
    if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
    {
        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);
        HAL_UART_DMAStop(&huart1);

        printf("receive ok:%s\r\n",RXbuf);
        HAL_UART_Receive_DMA(&huart1, RXbuf, 50);
    }
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */

/* USER CODE END USART1_IRQn 1 */
}

然后发送内容,就可以看到我们想要的现象了~

3. 课后作业

  1. 参考提供的模板,使用usart.

  2. 当接收到特定内容,例如OPEN时,打开LED灯.

Copyright © 油炸鸡开源硬件 | 渝ICP备2024035140号-2 | all right reserved,powered by Gitbook更新时间: 2025-06-07 10:01:12

results matching ""

    No results matching ""