STM32CubeMX-串口中断实验

文章目录

  • STM32CubeMX笔记-串行口中断接收
    • 一、初始准备
      • 1.硬件平台
      • 2.软件平台
    • 二、操作步骤
      • 1.CubeMX生成初始化代码
      • 2.Keil编写串口中断回调函数
      • 3.程序下载,观察现象
    • 三、源码仓库

STM32CubeMX笔记-串行口中断接收

一、初始准备

1.硬件平台

使用正点原子STM32F4探索者

STM32CubeMX-串口中断实验_第1张图片

2.软件平台

STM32CubeMX软件平台

Keil5软件平台

STM32CubeProgrammer下载平台

STM32CubeMX-串口中断实验_第2张图片

二、操作步骤

1.CubeMX生成初始化代码

  • 芯片选择

打开cube软件,点击MCU选择

STM32CubeMX-串口中断实验_第3张图片

F4探索者的主控为STM32F407ZET6,所以在搜索框找到STM32F407ZE后点击具体芯片,再开始工程

STM32CubeMX-串口中断实验_第4张图片

  • 配置时钟源

我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示配置完成

STM32CubeMX-串口中断实验_第5张图片

  • 配置时钟树

我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,精英板的晶振和时钟倍频如下

STM32CubeMX-串口中断实验_第6张图片

一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值

STM32CubeMX-串口中断实验_第7张图片

  • 配置LED

参考之前的LED配置文章:链接

  • 配置串口

探索者的的串口PA9和PA10通过USB转TTL芯片CH340G与安卓口连接,连接到PC机上,PC机则通过串口软件与下位机通信,原理图如下:

STM32CubeMX-串口中断实验_第8张图片

STM32CubeMX-串口中断实验_第9张图片

串口配置步骤如下,点击USART1,出现的配置栏有2个选项。第一个选项Mode用来设置串口1的模式。第二个选项Hardware Flow Control用来开启/关闭串口1的硬件流控制,该选项只有在Mode选项值为Asynchronous(异步通信)模式的前提下才有效。这里我们要开启串口1的异步模式,并且不使用硬件流控制,所以这里我们直接选择Mode值为Asynchronous即可。

STM32CubeMX-串口中断实验_第10张图片

Parameter Settings参数选项卡用来配置USART的初始化参数,包括波特率停止位等等。这里我们将USART1配置为:波特率115200,8位字长模式,无奇偶校验位,1个停止位,发送/接收均开启,过采样选择16倍,防止误采样数据,16倍采样,简单讲就是要求采样时钟大于波特率的16倍,这样采样的数据基本不会出错

STM32CubeMX-串口中断实验_第11张图片

User Constants是用来配置用户常量,这里我没用使用到
NVIC选项卡用来使能USART1中断。这里我们勾上Enabled选项。

STM32CubeMX-串口中断实验_第12张图片

DMA Setting是使用USART的DMA时才需要配置,这里我们不配置。

GPIO Setting便是查看和配置USART1相关的IO口,配置和从System Core的GPIO配置一模一样,我们直接在这里面配置

STM32CubeMX-串口中断实验_第13张图片

配置到这的时候,因为使用到串口中断,所以我们还需要设置中断优先级分组,点击System Core选择中断分组,对使用到的中断进一步分组,这里我全部使用到的2(0.0)

STM32CubeMX-串口中断实验_第14张图片

以上就是配置的全部内容,下面就是生成代码

  • 生成工程代码

配置生成工程的名字,存储路径以及编译器,这里我们选MDK-ARM(Keil被收购后改名)

STM32CubeMX-串口中断实验_第15张图片

配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择

PS:用户代码段是一下注释之间的代码

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

STM32CubeMX-串口中断实验_第16张图片

最后点击生成代码
STM32CubeMX-串口中断实验_第17张图片

然后我们打开代码工程,如下:
STM32CubeMX-串口中断实验_第18张图片

我们可以在main.h里面看到我们定义的端口

STM32CubeMX-串口中断实验_第19张图片

2.Keil编写串口中断回调函数

串口代码的编写可以参考我之前的文章,有详细讲述常用的串口通信协议解析方式:链接

在main函数用户代码0段我们定义我们需要使用到的变量

/* USER CODE BEGIN 0 */
#define USART_REC_LEN 200
uint8_t		Res;
uint8_t 	USART1_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.(一般给200,接收数据量大就增加)
uint16_t  USART1_RX_STA;       			 				//接收状态标记	
/* USER CODE END 0 */

STM32CubeMX-串口中断实验_第20张图片

点开stm32f4xx_it.c会看到串口1中断调用了一个回调函数,并传入触发中断的串口号

STM32CubeMX-串口中断实验_第21张图片

HAL_UART_IRQHandler(&huart1)内有一个回调函数-HAL_UART_RxCpltCallback,这个回调函数是一个weak定义函数,我们可以再次定义,通过判断传入的引脚来分辨哪一个串口发生中断,进一步配置中断,我们点击main.c,在如下位置注释中间插入自己编写的回调函数代码(一定要写在注释内部),判断串口,读取数据存到接收BUFF里面

回调函数代码:在进入回调函数后,判断一下串口号,然后将接收的数据(一个字节)存到BUFF内,接收到结尾帧(换行符0x0D)后把接收完成标志清零,同时在此调用使能RX中断,为下一次接收做准备,我这里使用的是每次接收一个字节,算法虽然复杂,但好处是可以接收不定长字节数据,更贴合工程应用,代码如下

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
     
    /* 判断是哪个串口触发的中断 */
    if(huart ->Instance == USART1)
    {
     
        		//处理接受到的数据
				if((USART1_RX_STA&0x8000)==0)//接收未完成
				{
     
					//读取接收到的数据
					if(Res==0x0D)
					{
     
						USART1_RX_STA|=0x8000;
						HAL_UART_Receive_IT(&huart1, &Res, 1);
					}
					else
					{
     
						USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ;
						USART1_RX_STA++;
						if(USART1_RX_STA>(USART_REC_LEN-1))
							USART1_RX_STA=0;
					}		 
				}
				//等待下一次接收中断
				HAL_UART_Receive_IT(huart,&Res,1);
    }
}
/* USER CODE END 4 */

到这串口接收部分的代码就基本完成了

下面是主函数部分代码,我们要启动RX接收中断准备接收数据,同时做一个发送提示,告诉我们串口已经初始化完成,代码如下

  /* USER CODE BEGIN 2 */
	
	//开启接收中断
	HAL_UART_Receive_IT(&huart1, &Res, 1);
	//发送初始化完成提示
	HAL_UART_Transmit_IT(&huart1,"USART1_Ready!",sizeof("USART1_Ready!"));
	//等待发送完成
	while(huart1.gState != HAL_UART_STATE_READY){
     };
		
  /* USER CODE END 2 */

主循环内则一直判断接收中断标志最高位有没有置1,置1表示有一帧数据来到,可以进行处理,处理内容为发送接收到的数据同时判断接收的第一位,为A点亮LED0,B点亮LED1,C熄灭LED,代码如下**(注意主循环体内要加延时)**

    /* USER CODE BEGIN 3 */
		if(USART1_RX_STA & 0x8000)
		{
     
			HAL_UART_Transmit_IT(&huart1,"Get_Dat:",sizeof("Get_Dat:"));
			//等待发送完成
			while(huart1.gState != HAL_UART_STATE_READY){
     };
			//发送接收到的字节
			HAL_UART_Transmit_IT(&huart1,USART1_RX_BUF,USART1_RX_STA&0x7FFF);
			while(huart1.gState != HAL_UART_STATE_READY){
     };
			
			if(USART1_RX_BUF[0]== 'A')
					HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
			if(USART1_RX_BUF[0]== 'B')
					HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
			if(USART1_RX_BUF[0]== 'C')
			{
     
					HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
					HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
			}
			USART1_RX_STA=0;
		}
		HAL_Delay(100);
  /* USER CODE END 3 */ 

程序编译通过

STM32CubeMX-串口中断实验_第22张图片

3.程序下载,观察现象

程序下载我一般用两种方式:

第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug

STM32CubeMX-串口中断实验_第23张图片

选择ST-link后,点击setting

STM32CubeMX-串口中断实验_第24张图片

添加对应F4的Flash

STM32CubeMX-串口中断实验_第25张图片

keil界面点击下载

STM32CubeMX-串口中断实验_第26张图片

第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载

打开软件,点击connect左边选择stlink后再点击connect连接下载器

STM32CubeMX-串口中断实验_第27张图片

点击open file,找到工程路径下MDK文件夹下工程生成的hex文件

STM32CubeMX-串口中断实验_第28张图片

之后点击downlo下载,下载结果如下

STM32CubeMX-串口中断实验_第29张图片

打开XCOM串口调试助手,发送指令测试现象:

STM32CubeMX-串口中断实验_第30张图片

发送B的时候绿灯点亮:

STM32CubeMX-串口中断实验_第31张图片

三、源码仓库

Github链接:link

博文原链接-我的个人博客

你可能感兴趣的:(#,STM32,stm32,嵌入式,cubemx,串口通信,单片机)