STM32中断与DMA通信编程

一、原理介绍

(一)中断系统

中断系统

(二)串口通信

串口通信

二、STM32中断模式控制LED灯

1.新建STM32CubeMX工程(步骤与以往相同)
2.选择PA4设置为GPIO_Output输出模式,PB9设置为GPIO_EXTI9中断模式。
输出:
请添加图片描述
中断:
请添加图片描述
3.配置RCC和SYS。
RCC:请添加图片描述
SYS:
请添加图片描述
4.配置PA4与PB9
PA4:
请添加图片描述
PB9:
请添加图片描述
5.开启中断
请添加图片描述
6.时钟树设置
请添加图片描述
7.选择路径——生成代码——打开至Keil
8.修改代码
在main.c中加入以下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* Prevent unused argument(s) compilation warning */
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);  //翻转电平
    /* NOTE: This function Should not be modified, when the callback is needed,
             the HAL_GPIO_EXTI_Callback could be implemented in the user file
     */
}

9.编译并烧录运行
烧录时BOOT0置1,BOOT1置0

三、串口中断方式进行串口通信

1.新建STM32CubeMX工程
2.选择USART1位异步通信模式
请添加图片描述
3.RCC与SYS配置
请添加图片描述
4.串口配置:

波特率为115200 Bits/s
传输数据长度为8 Bit
奇偶检验无
停止位1 接收和发送都使能
请添加图片描述

5.设置使能中断
请添加图片描述
6.修改代码
在main.c中加入头文件:

uint8_t aRxBuffer;//接收缓冲中断
uint8_t Uart1_RxBuff[256];//接收缓冲
uint8_t Uart1_Rx_Cnt=0;//接收缓冲计数
uint8_t cAlmStr[]="数据溢出(大于256)";

main函数中加入中断函数:

int main(void)
{
 //初始化
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 
	
	
	//接收中断函数
	HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);
	
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

重写HAL_UART_RxCpltCallback函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)||(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断

}

四、参考

【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
中断系统
串口通信
通用输入输出接口
【STM32】2-STM32中断系统(NVIC)
【STM32CubeMX】HAL库中断方式UART串口通信

版权声明:本文为CSDN博主「学不会编程的XX」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30593663/article/details/122379927

一、原理介绍

(一)中断系统

中断系统

(二)串口通信

串口通信

二、STM32中断模式控制LED灯

1.新建STM32CubeMX工程(步骤与以往相同)
2.选择PA4设置为GPIO_Output输出模式,PB9设置为GPIO_EXTI9中断模式。
输出:
请添加图片描述
中断:
请添加图片描述
3.配置RCC和SYS。
RCC:请添加图片描述
SYS:
请添加图片描述
4.配置PA4与PB9
PA4:
请添加图片描述
PB9:
请添加图片描述
5.开启中断
请添加图片描述
6.时钟树设置
请添加图片描述
7.选择路径——生成代码——打开至Keil
8.修改代码
在main.c中加入以下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* Prevent unused argument(s) compilation warning */
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);  //翻转电平
    /* NOTE: This function Should not be modified, when the callback is needed,
             the HAL_GPIO_EXTI_Callback could be implemented in the user file
     */
}

9.编译并烧录运行
烧录时BOOT0置1,BOOT1置0

三、串口中断方式进行串口通信

1.新建STM32CubeMX工程
2.选择USART1位异步通信模式
请添加图片描述
3.RCC与SYS配置
请添加图片描述
4.串口配置:

波特率为115200 Bits/s
传输数据长度为8 Bit
奇偶检验无
停止位1 接收和发送都使能
请添加图片描述

5.设置使能中断
请添加图片描述
6.修改代码
在main.c中加入头文件:

uint8_t aRxBuffer;//接收缓冲中断
uint8_t Uart1_RxBuff[256];//接收缓冲
uint8_t Uart1_Rx_Cnt=0;//接收缓冲计数
uint8_t cAlmStr[]="数据溢出(大于256)";

main函数中加入中断函数:

int main(void)
{
 //初始化
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 
	
	
	//接收中断函数
	HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);
	
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

重写HAL_UART_RxCpltCallback函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)||(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断

}

四、参考

【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
中断系统
串口通信
通用输入输出接口
【STM32】2-STM32中断系统(NVIC)
【STM32CubeMX】HAL库中断方式UART串口通信

版权声明:本文为CSDN博主「学不会编程的XX」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30593663/article/details/122379927

生成海报
点赞 0

学不会编程的XX

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F4最小系统硬件设计

对于硬件工程师来讲,想要入门STM32相关的开发,我想除了深入阅读一下STM32的数据手册外,最实用且有效的方法就是自己实际做一个STM32的最小系统板了。本文将以一个小的STM32F427VG的电路最

STM32F1移植U8g2库

STM32移植U8g2库 MCU为STM32F1030C8T6最小系统,使用STM32CubeMX生成HAL库工程模板,采用硬件四线SPI连接0.96寸单色OLED(驱动芯片为SSD1306,128*

STM32智能小车------PWM驱动直流电机

大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生。进入正题,最近在做小车,目前已经可以跑起来了,然后就是加入各种各样的传感器,