引言:
以人为例,人与人交流需要共同语言,传输媒介,而串口通信可作用于两设备之间进行交流,其前提是保证两设备的通信波特率一致,其异步通信方式可理解是两设备之间无需有时钟线的限制(这里不过多解释)。
该博客将使用一个板子一个串口来进行收发通信测试,收发方式使用中断和DMA,同时在此之前会教大家配置工程以及定时器中断。
一、基础配置
打开cubemx搜索芯片stm32H750VBT6
新建好之后对RCC的配置如下
接下来配置时钟树,左边8输入的是外部晶振频率,中间红框输入480最大值,回车后自动分分配数值,稍等一会就好
、定时器中断配置
选择定时器14,勾选activated,配置属性和上图一样,由于定时器14的总频率为240MHZ,则中断频率为240/240/1000=1000HZ,即1ms执行一次中断
在此NVIC settings窗口打开定时器中断,即勾选Enabled
串口中断配置
选择打开串口五,mode选择Asynchronous异步通信,Baud Rate(波特率)需要两个设备一致,但用一个串口发给自己收波特率本就一致了,不做修改。
同理在NVIC settings拦勾选Enabled打开串口中断
还可以先尝试把DMA加上去,需要用的时候可以直接用,点Add添加收发的DMA
NVIC是一个管理所有中断的窗口,勾选即为打开中断,preemption priority为中断优先级,其数值越小其优先级越高。
生成工程
工程名称和工程存放路径不能有中文
第三块红框那选择MDK,版本我一般选择V5,目的是生成keil上的工程文件
在code generate中需要勾选这个,目的是为了各自生成.c和.h文件
最后点击右上角的generate code ,至此工程就建立好了
代码编写
一、定时器中断
确定定时器中断测试
在main函数里需要先打开定时器中断
可在 /* USER CODE BEGIN 2 */下添加
HAL_TIM_Base_Start_IT(&htim14);
接下来需要用到定时器中断回调函数,在配置时打开中断后就会自动生成其的弱函数,只需要重新定义一遍再添加我们需要的代码即可
//定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
}
二、串口中断接发
收发数据我们前提需要有数据发且有位置存,至此我们需要定义一组发送和存储的数组,且要求为一字节8位的数据才能正常发送接收
//定义发送和接收存储的数组
uint8_t txbuffer[2]={1,2};
uint8_t rxbuffer[2];
之后便可在WHILE循环里发送数据,如图
// 中断发送
HAL_UART_Transmit_IT(&huart5,txbuffer,sizeof(txbuffer));
发送完成需要测试能否接收
在发送前先开启一次接收,如图
添加该函数
// 中断接收
HAL_UART_Receive_IT(&huart5,rxbuffer,sizeof(rxbuffer));
同定时器中断一样,串口中断有它的中断回调,我们使用到串口接收中断回调
// 中断接收回调
int a,b;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart5)
{
HAL_UART_Receive_IT(&huart5,rxbuffer,sizeof(rxbuffer));
a=rxbuffer[0];
b=rxbuffer[1];
}
}
至此串口的中断收发就完成了
三、串口DMA接发
如若不是使用空闲中断(具体可自己去了解)简单的DMA不需要过多操作,只需在之前的中断发送和接收函数修改即可
// DMA发送
HAL_UART_Transmit_DMA(&huart5,txbuffer,sizeof(txbuffer));
// DMA接收
HAL_UART_Receive_DMA(&huart5,rxbuffer,sizeof(rxbuffer));