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模块
, 插上PA9
和PA10
, 连上电脑看看, 然后看看有什么现象吧. 当然没有串口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. 课后作业
参考提供的模板,使用usart.
当接收到特定内容,例如
OPEN
时,打开LED灯.