stm32cubeMX学习四、DMA串口接收

上一节入门了stm32cubeMX串口的配置,这节我们来学习下编写一个串口DMA接收的程序
本程序编写基于秉火霸道STM32F103ZET6运行环境。在这里插入图片描述
这节我们配置多一路串口用来做NBIOT-BC28模块的发送和接收,这里我们配置为UART4。
在这里插入图片描述
在上一节工程的基础上,我们只需要再点点鼠标配置下UART4为DMA接收就可以了,很简单。
在这里插入图片描述

一、DMA配置

在这里插入图片描述
注意:如果在cubemx设置为循环接收模式,该函数可以不放在while循环里;如果没有设置为循环接收模式(即设置为normal模式),需要放在while里循环使能DMA接收中断。
参考:https://www.cnblogs.com/sovagxa/p/9135653.html

二、UART端配置

在这里插入图片描述

三、开启DMA全局中断以及串口全局中断

在这里插入图片描述

四、DMA选项配置

在这里插入图片描述

五、TXGPIO设定

在这里插入图片描述

六、RXGPIO设定

在这里插入图片描述
生成工程后添加业务逻辑代码:

#define RXBUF_SIZE 100
uint8_t buffer[RXBUF_SIZE] = {0};
void uart_dma_send(char *txbuf)
{
	HAL_UART_DMAStop(&huart4);
	HAL_Delay(100);
	
	HAL_UART_Receive_DMA(&huart4, buffer, RXBUF_SIZE);
	HAL_UART_Transmit(&huart4, (uint8_t *)txbuf, strlen(txbuf), HAL_MAX_DELAY);
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_UART4_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		uart_dma_send("AT+CSQ\r\n");
		printf("rx_buffer:%s\n",buffer);
		HAL_Delay(2000);
  }
  /* USER CODE END 3 */
}

这里用了AT+CSQ,用于获取NBIOT-BC28的信号强度,然后通过上一节配置的串口二将数据打印出来。

七、实验现象

在这里插入图片描述

Engineer-Bruce_Yang CSDN认证博客专家 嵌入式硬件 单片机 arm开发
本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页