ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

STM32中断与DMA通信编程

2021-11-08 21:58:58  阅读:170  来源: 互联网

标签:DMA HAL UART Rx 编程 Uart1 uint8 STM32 USER


文章目录

一.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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有