stm32cubeMX学习四、DMA串口接收

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

一、DMA配置

stm32cubeMX学习四、DMA串口接收_第4张图片
注意:如果在cubemx设置为循环接收模式,该函数可以不放在while循环里;如果没有设置为循环接收模式(即设置为normal模式),需要放在while里循环使能DMA接收中断。
参考:https://www.cnblogs.com/sovagxa/p/9135653.html

二、UART端配置

stm32cubeMX学习四、DMA串口接收_第5张图片

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

stm32cubeMX学习四、DMA串口接收_第6张图片

四、DMA选项配置

stm32cubeMX学习四、DMA串口接收_第7张图片

五、TXGPIO设定

stm32cubeMX学习四、DMA串口接收_第8张图片

六、RXGPIO设定

stm32cubeMX学习四、DMA串口接收_第9张图片
生成工程后添加业务逻辑代码:

#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的信号强度,然后通过上一节配置的串口二将数据打印出来。

七、实验现象

stm32cubeMX学习四、DMA串口接收_第10张图片

你可能感兴趣的:(stm32cubeMX)