STM32CubeMX开启串口通信HAL库
使用STM32CubeMX使能串口并完成发送+接收
第一步,在STM32CubeMX上使能串口,完成属性配置并且打开串口中断(测试使用的是f103c8t6,但是其他板子操作是一样的,关于CubeMX创建工程以及工程的必要初始化配置看我博客第一篇文章)
按照上面这张图进行串口使能配置,属性除了波特率有很大可能改动以外大多数情况都是用默认的,使能后打开中断设置进行优先级配置
这样就完成了第一步,点击生成工程就可以了
第二步,进行发送重定向(使用用习惯了的printf打印输出)
按照我博客第一篇建立的工程,然后按照上面第一步进行配置后,用keil打开工程,在usart.c中添加以下代码,记住!!!添加在BEGIN END 之间。下面配了一张图
#include "stdio.h"
#ifdef __GNUC_
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
第三步:测试使用printf发送(PA9连usb转ttl-Rx,PA10连usb转ttl-Tx)
现在main.c中包含头文件 #include “stdio.h” 同样记住,写在BEGIN-END之间
直接在组函数的循环中添加print语句即可使用,没什么别的要加的,很简单。
第四步:测试串口接收
要添加的代码在这里:
uint8_t RX_Buffer[20];
void user_usart1_rx_logic()
{
printf("在这里面实现用户逻辑\r\n");
}
void SystemClock_Config(void); //这个是顺带复制的,本来工程中就有了
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
HAL_UART_Transmit(&huart1, (uint8_t *)RX_Buffer, 10,0xFFFF);//发送10个数据给串口1,可以直接使用printf(RX_Buffer)打印
printf("\r\n"); //打印的时候加入回车换行符
HAL_UART_Receive_IT(&huart1,RX_Buffer,10); // 重新使能串口1接收中断
user_usart1_rx_logic();
}
然后就可以在组函数的循环中使用 HAL_UART_Receive_IT(&huart1,RX_Buffer,10); 来进行接收了,注意这里传入的参数,那个10,代表接收为10个字符后出发中断,可以自己改。这样,接收发送就都弄好了,注意上面的 HAL_UART_Transmit 这个函数也是发送打印,只是这个用的是库自带的函数,没有用我们自己重定向的
第五步:一些拓展资料
大家可以点开查看Cube创建的工程中自带的函数
里面有很多函数,大家有兴趣可以自己了解,包括DMA方式的一些操作,下面给大家总结了几个常用的
串口的发送接收函数:
HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();//串口中断模式发送
HAL_UART_Receive_IT();//串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Receive_DMA();//串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback() 一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback() 发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback() 一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback() 接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback() 传输过程中出现错误时,通过中断处理函数调用。
串口有三种通信模式:
第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
最后总结这部分是参考了另外一位博主的资料。
最后
我是一个新人博主,目前也是一个大学生,但是真心喜欢嵌入式和物联网,已经自学3年了,我会带着热爱一直把博文写下去,也是自己记笔记的一种方式,大家可以关注我,给我留言,一起学习
上一篇: HAL库----STM32CubeMX 软件使用方法
下一篇: 汇编实验三——中断及查看中断向量地址
推荐阅读
-
基于HAL库用STM32CubeMx生成FATFs+sd+flash
-
STM32 HAL库中串口空闲中断+DMA 实现串口数据的不定长接收
-
STM32L051使用HAL库操作实例(4)-串口实验
-
【STM32】(F207)_HAL库开发教程(四)—串口FIFO使用
-
STM32F103用hal库使用DMA+串口空闲中断接收数据
-
STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式
-
(HAL库学习3)STM32CubeMX HAL库 ADC与DAC使用
-
(HAL库学习5) STM32CubeMX HAL库 外部中断使用
-
(HAL库学习7)STM32CubeMX HAL库 PWM输出
-
【STM32】STM32CUBEMX系列教程:HAL库方式的微秒延时函数