文章目录
一、基于中断的串口通信
1.配置stm32cubemx
配置RCC
配置SYS
配置USART1
配置NVIC
配置时钟树
project manager设置
2.在keil软件中修改代码
定义全局变量
uint8_t c;
uint8_t d[10];//指令 s:停止 t:开始
uint8_t index=0;
uint8_t num=0;
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
uint8_t r[5]="start";
uint8_t t[4]="stop";
int flag1=0,i=0;
int flag2=0,j=0;
char tips1[]="start stm32";//提示2
char tips2[]="stop stm32";//提示3
int flag=0;//标志 s:停止发送 t:开始发送
重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,0xFFFF);
if(c==r[i]){
flag1++;
i++;
}
else
{
flag1=0;
i=0;
}
if(c==t[j]){
flag2++;
j++;
}
else
{
flag2=0;
j=0;
}
if(flag1==5)
{
flag=1;
flag1=0;
i=0;
}
if(flag2==4)
{
flag=0;
flag2=0;
j=0;
}
//HAL_UART_Transmit(&huart1,(uint8_t *)&flag2,1,0xFFFF);
HAL_UART_Receive_IT(&huart1,(uint8_t *)&c, 1);
}
在mian函数的while循环前添加串口接收函数
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
加上if识别语句
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
3.烧录
4.结果
发送start开始发送hello Windows,发送stop停止发送hello Windows
5.波形图
二、基于DMA的串口通信
1.DMA介绍
DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
我们知道,数据传输,首先需要的是数据的源地址、数据传输位置的目标地址、传递数据多少的数据传输量、进行多少次传输的传输模式。DMA所需要的核心参数,便是这四个。
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
2.通过CubeMX创建项目
设置RCC
设置USART1
选择异步通信
参数选择默认
使能串口
添加两个通道
创建项目(如图)
3.把main函数中的内容修改为自己的代码
int main(void)
{
HAL_Init();
uint8_t message[] = "hello Windows\n"; //定义数据发送数组
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)message, sizeof(message));
HAL_Delay(1000);
}
}
4.结果
把修改完的代码进行编译后再烧录,通过串口调试助手查看。(打开串口助手后连续发送hello Windows)