stm32HAL库中断模式编程

1、使用HAL库采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。

(1)引脚配置

A4输出控制灯的亮灭,设置为GPIO_Output
A1持续输出高电平,设置同上
A7持续输出低电平,设置同上
B5模拟开关,设置为GPIO_EXTI5

stm32HAL库中断模式编程_第1张图片

(2)配置exit
stm32HAL库中断模式编程_第2张图片

(3)配置SYS

stm32HAL库中断模式编程_第3张图片

(4)配置GPIO

把A1配置为高电平、A7配置为低电平
把B5中断配置为上升沿和下降沿都触发

stm32HAL库中断模式编程_第4张图片

(5)勾选并创建项目

stm32HAL库中断模式编程_第5张图片

stm32HAL库中断模式编程_第6张图片

(6)通过keil打开项目,并找到往下找到HAL_GPIO_EXTI_Callback

该函数是给用户自己重写的,可以在这里根据不同的中断来执行不同的处理。在这里我们需要根据B5的不同中断来实现A4的亮灭。

使用下面的代码重写该函数

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
      if(GPIO_Pin == SWITCH_Pin){
        //获取B5的电位
        GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);

        //低电位
        if(pinState==GPIO_PIN_RESET)
        HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);//把A4变为低电位
        //高电位
        else
            HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);//把A4变为高电位
        }
    }

(7)编译生成.hex文件,并且mcuisp进行烧录

stm32HAL库中断模式编程_第7张图片

(8)结果

2、采用串口中断方式进行串口通信

(1)设置RCC

stm32HAL库中断模式编程_第8张图片

(2)设置sys

stm32HAL库中断模式编程_第9张图片

(3)设置usart

stm32HAL库中断模式编程_第10张图片

(4)设置NVIC

stm32HAL库中断模式编程_第11张图片

(5)创建项目

stm32HAL库中断模式编程_第12张图片

(6)再keil中配置项目

再main.c文件中定义全局变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esyqHkUT-1666657745452)(C:\Users\HP\AppData\Local\Temp\1666525462309.png)]

char c;//指令 0:停止  1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
#define COUNTOF(a) (sizeof(a)/sizeof(*(a)))

再main.c文件中设置接受中断

函数原型:

 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

功能:

 功能:串口中断接收,以中断方式接收指定长度数据。
 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
 接收到数据时,会触发串口中断。
 再然后,串口中断函数处理,直到接收到指定长度数据
 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

在main.c函数中的while循环中加入下面的代码:

if(flag==1){
			//发送信息
			HAL_UART_Transmit(&huart1, (uint8_t *)&message, COUNTOF(message),0xFFFF); 
			
			//延时
			HAL_Delay(1000);
		}

在main.c文件中重写中断处理函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	//当输入的指令为0时,发送提示并改变flag
	if(c=='s'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, COUNTOF(tips2),0xFFFF); 
	}
	
	//当输入的指令为1时,发送提示并改变flag
	else if(c=='t'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, COUNTOF(tips1),0xFFFF); 
	}
	
	//当输入不存在指令时,发送提示并改变flag
	else {
	
	}

	//重新设置中断
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}

(7)编译并进行烧录

stm32HAL库中断模式编程_第13张图片

(8)使用串口调试工具进行运行

stm32HAL库中断模式编程_第14张图片
stm32HAL库中断模式编程_第15张图片

3、使用字符串进行中断

找到HAL_UART_RxCpltCallback函数,修改下列内容:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart1){
	HAL_UART_IRQHandler(huart1);
	getBuffer[countofGetBuffer++]=value;
	if(strcmp(getBuffer,str1)==0){
		flag = 1;
		HAL_UART_Transmit(huart1, (uint8_t *)&tips1, COUNTOF(tips1),0xFFFF);
		countofGetBuffer = 0;
		memset(getBuffer,0,COUNTOF(getBuffer));
	}else if(strcmp(getBuffer,str2)==0){
	    flag = 0;
		HAL_UART_Transmit(huart1, (uint8_t *)&tips2, COUNTOF(tips2),0xFFFF); 
		countofGetBuffer = 0;
		memset(getBuffer,0,COUNTOF(getBuffer));
	}
	HAL_UART_Receive_IT(huart1, (uint8_t *)&value,1);
}

当我们执行 HAL_UART_Receive_IT(&huart1, (uint8_t *)&value, 1)这个函数的时候,表示我们接收到一个字符,并且之后将会HAL_UART_RxCpltCallback,所以我们可以使用一个全局变量数组进行,每进行一次运算。就添加一个字符进入数组。当积累到一定值就会进入if语句中。执行语句,从而达到发送字符串接受的效果。

添加一下全局变量:

char getBuffer[100]; //用户自定义的缓冲区
char value;
char str1[] = "gostm32";
char str2[] = "stopstm32";
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
int countofGetBuffer=0;

编译并进行烧录,使用野火串口调试运行

stm32HAL库中断模式编程_第16张图片

stm32HAL库中断模式编程_第17张图片

4、STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据

(1)使用sm32cubemx创建项目

设置RCC:

stm32HAL库中断模式编程_第18张图片

设置串口USART1,同时可查看波特率等设置是否正确:

stm32HAL库中断模式编程_第19张图片

使能中断选择:

stm32HAL库中断模式编程_第20张图片

DMA设置点击DMA Settings,点击Add添加通道,传输速率设置为中速Medium:

stm32HAL库中断模式编程_第21张图片

分别点击两个通道,查看模式设置是否为Normal,右侧Memory是否选中:

stm32HAL库中断模式编程_第22张图片

在System view下选择DMA,并ADD通道MEMTOMEM:

stm32HAL库中断模式编程_第23张图片

时钟设置:

stm32HAL库中断模式编程_第24张图片

工程文件配置
Project配置:

stm32HAL库中断模式编程_第25张图片

Code Generator配置:

stm32HAL库中断模式编程_第26张图片

Open Project:

stm32HAL库中断模式编程_第27张图片

(2)Keil环境下进行代码编写:

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组

stm32HAL库中断模式编程_第28张图片

在main函数中的while循环里添加:

  HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
  HAL_Delay(1000);

stm32HAL库中断模式编程_第29张图片

(3)工作代码进行编译和烧录

stm32HAL库中断模式编程_第30张图片

(4)运行

stm32HAL库中断模式编程_第31张图片

你可能感兴趣的:(stm32,单片机,arm)