基于中断/DMA的串口通信
本篇讲述,通过中断方式、DMA两种方式完成串口通信
中断方式
使用STM32CubeMX创建工程:
-
打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。
-
在"Pinout & Configuration"选项卡中,开始如下配置:
点击A->Z,选择SYS,在Debug一栏选择Serial Wire
选择RCC,如下:
-
配置USART1
-
在"Clock Configuration"选项卡中,设置如下:
-
在"Project Manager"选项卡中,按如下配置:
Code Generator界面:
-
最后,点击GENERATE CODE,生成后直接点击打开项目
keil代码部分
打开项目后,进行代码编写。
1.定义全局变量和对main进行编写
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:开始发送
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
//设置接受中断
HAL_UART_Receive_IT(&huart1,(uint8_t *)&c, 1);
while (1)
{
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
}
}
2.重载HAL_UART_RxCpltCallback函数
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);
}
3.烧录和结果
4.波形图
DMA方式
使用STM32CubeMX创建工程
与中断方式大致相同,唯一不同如下
在"Clock Configuration"选项卡中,设置如下:
a5
keil代码部分
打开项目后,进行代码编写。
1.定义全军变量和对main进行编写
uint8_t A;
int flag=0;
uint8_t r[5]="start";
int j=0;
int i=0;
int flag1=0;
int flag2=0;
uint8_t t[4]="stop";
void SystemClock_Config(void);
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
HAL_UART_Receive_DMA(&huart1,(uint8_t *)&A,1);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if(flag==1){
HAL_UART_Transmit_DMA(&huart1,"hello windows!\n",15);
HAL_Delay(1000);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.重载HAL_UART_RxCpltCallback函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(A==r[i]){
flag1++;
i++;
}
else
{
flag1=0;
i=0;
}
if(A==t[j]){
flag2++;
j++;
}
else
{
flag2=0;
j=0;
}
if(flag1==5)
{
flag=1;
HAL_UART_Transmit_DMA(&huart1,"start",5);
flag1=0;
i=0;
}
if(flag2==4)
{
flag=0;
HAL_UART_Transmit_DMA(&huart1,"stop",4);
flag2=0;
j=0;
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)&A,1);
}
3.烧录和结果
4.波形图
总结
通过这两种不同的方式,使我更加了解串口通信,让我受益匪浅。