编程语言
首页 > 编程语言> > STM32中断与DMA通信编程

STM32中断与DMA通信编程

作者:互联网

文章目录

一.STM32中断

打开cubeMX,点击PB5,选择GPIO_EXTI5
在这里插入图片描述
打开GPIO模块,双击PB5,然后在MODE中选择Rising/Falling这个
在这里插入图片描述
打开PA1,默认level为low,灯为亮状态
在这里插入图片描述
选择NVIC,点击最后一个,进行中断

在这里插入图片描述
RCC配置:配置时钟源为外部时钟源
在这里插入图片描述
时钟树设置:
在这里插入图片描述
在这里插入图片描述
打开工程:
在项目代码中,打开stm32f1xx_hal_gpio.c文件可以找到中断服务函数
在这里插入图片描述
根据我们前面的设置,上升沿就会触发这个函数,在这个函数中调用了另外一个名为HAL_GPIO_EXTI_Callback()函数
在这里插入图片描述
这个函数是回调函数,前面__weak表示此函数为虚函数,需要用户重写。
在main.c文件中添加如下代码:

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

CubeMX配置:

配置USART1为异步通信模式:
在这里插入图片描述
使能USART1中断:
在这里插入图片描述
生成代码,打开项目。

编写代码:
在main.c中添加定义

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

在main函数如下位置处添加代码:

/* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */

`

```python
/* USER CODE BEGIN 4 */
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		for(int i=0;i<255;i++)
		{
			Uart1_RxBuff[i]=0;
		}
		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;
			for(int i=0;i<255;i++)
		    {
			    Uart1_RxBuff[i]=0;
		    } //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
/* USER CODE END 4 */c

在这里插入图片描述

二.DMA通信编程

CubeMX

RCC设置外部高速时钟HSE 选择外部时钟源

设置串口
在这里插入图片描述
DMA设置:
在这里插入图片描述
点击add:
在这里插入图片描述
在这里插入图片描述
生成代码
在main.c中添加代码:

  /* USER CODE BEGIN Init */
  uint8_t Senbuff[] = "HELLO WORLD!!!";  //定义数据发送数组
  /* USER CODE END Init */

在while循环中添加代码:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)-1);  //串口发送Senbuff数组
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

如果不开启中断,程序只能发送一次数据,程序无法判断DMA传输是否完成。

参考文献:https://blog.csdn.net/qq_45659777/article/details/121111629?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_45659777/article/details/121110712?spm=1001.2014.3001.5501

标签:DMA,HAL,UART,Rx,编程,Uart1,uint8,STM32,USER
来源: https://blog.csdn.net/xieyang929/article/details/121214118