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

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

暂无评论

发表评论

相关推荐

笔记3:STM32F103与STM32F030的区别

在替换芯片时,发现STM32f103与STM32F030的区别: 内部结构 下图是103的IO口内部结构: 下图是030的IO口内部结构图: 通过上面的比较可以看出: 两个

2、STM32点亮LED灯

一、寄存器操作 1、新建工程,新建一个目录存放以后所有的工程stmproject,在这个目录下新建文件夹寄存器点灯,文件名为LED。 接下来选择所用的软件包,之前安装软件时安装的&#xff

【零基础学STM32】CubeMx+HAL配置按键点灯实验

主要内容 上一篇文章中采用了EXTI中断的方式控制小灯的亮灭。其实也可以不采用中断,直接使用GPIO配置即可实现按键对应小灯的状态,且效果几乎相同。同样本次例程试验采用正点原子阿波罗STM32F429IGT6开发板

STM32 HAL库学习笔记-(SPI驱动ADXL345)

STM32 HAL库学习笔记-(SPI驱动ADXL345) 最近有项目需要需要用到ADXL345,网上转了一圈都是IIC驱动为主,正好最近在学习HAL库,所以本文将使用SPI驱动ADXL345 CU