设为首页 加入收藏

TOP

STM32F429 Discovery开发板应用:使用FreeRTOS队列+DMA双缓存实现串口数据接收(三)
2023-07-23 13:25:35 】 浏览:59
Tags:STM32F429 Discovery 应用 使用 FreeRTOS 队列 DMA 双缓存
SART1_IRQn, 5, 0); 135 HAL_NVIC_EnableIRQ(USART1_IRQn); 136 /* USER CODE BEGIN USART1_MspInit 1 */ 137 138 /* USER CODE END USART1_MspInit 1 */ 139 } 140 } 141 142 void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) 143 { 144 145 if(uartHandle->Instance==USART1) 146 { 147 /* USER CODE BEGIN USART1_MspDeInit 0 */ 148 149 /* USER CODE END USART1_MspDeInit 0 */ 150 /* Peripheral clock disable */ 151 __HAL_RCC_USART1_CLK_DISABLE(); 152 153 /**USART1 GPIO Configuration 154 PA9 ------> USART1_TX 155 PA10 ------> USART1_RX 156 */ 157 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); 158 159 /* USART1 DMA DeInit */ 160 HAL_DMA_DeInit(uartHandle->hdmarx); 161 162 /* USART1 interrupt Deinit */ 163 HAL_NVIC_DisableIRQ(USART1_IRQn); 164 /* USER CODE BEGIN USART1_MspDeInit 1 */ 165 166 /* USER CODE END USART1_MspDeInit 1 */ 167 } 168 } 169 170 /* USER CODE BEGIN 1 */ 171 //使能DMA 172 void UART_DMA_MultiBuffer(void) 173 { 174 uint32_t u32wk0; 175 176 SET_BIT(huart1.Instance->CR3,USART_CR3_DMAR); 177 HAL_DMAEx_MultiBufferStart_IT(&hdma_usart1_rx, 178 (uint32_t)(&huart1.Instance->DR), 179 (uint32_t)&uart_buf[0].data[0], 180 (uint32_t)&uart_buf[1].data[0], 181 UART_BUFF_SIZE); 182 183 //这里是解决DMA在启动时,如果接收到大量数据会出现死机的问题 184 u32wk0 = huart1.Instance->SR; 185 u32wk0 = huart1.Instance->DR; 186 UNUSED(u32wk0); 187 } 188 189 /* USER CODE END 1 */

在main函数中,加入内容。

 1 /**
 2   * @brief  The application entry point.
 3   * @retval int
 4   */
 5 int main(void)
 6 {
 7   /* USER CODE BEGIN 1 */
 8 
 9   /* USER CODE END 1 */
10 
11   /* MCU Configuration--------------------------------------------------------*/
12 
13   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
14   HAL_Init();
15 
16   /* USER CODE BEGIN Init */
17 
18   /* USER CODE END Init */
19 
20   /* Configure the system clock */
21   SystemClock_Config();
22 
23   /* USER CODE BEGIN SysInit */
24 
25   /* USER CODE END SysInit */
26 
27   /* Initialize all configured peripherals */
28   MX_GPIO_Init();
29   MX_DMA_Init();
30   MX_USART1_UART_Init();
31   /* USER CODE BEGIN 2 */
32     queue_mes = xQueueCreate(10, sizeof(usart_multibuffer_data));
33     UART_DMA_MultiBuffer(); 
34   /* USER CODE END 2 */
35 
36   /* Init scheduler */
37   osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
38   MX_FREERTOS_Init();
39   /* Start scheduler */
40   osKernelStart();
41 
42   /* We should never get here as control is now taken by the scheduler */
43   /* Infinite loop */
44   /* USER CODE BEGIN WHILE */
45   while (1)
46   {
47     /* USER CODE END WHILE */
48 
49     /* USER CODE BEGIN 3 */
50   }
51   /* USER CODE END 3 */
52 }

在freertos.c文件中

 1 extern usart_multibuffer_data uart_buf[2];
 2 extern QueueHandle_t queue_mes;  
 3 usart_multibuffer_data queue_data;
 4 
 5 /* USER CODE BEGIN Header_StartDefaultTask */
 6 /**
 7   * @brief  Function implementing the defaultTask thread.
 8   * @param  argument: Not used
 9   * @retval None
10   */
11 /* USER CODE END Header_StartDefaultTask */
12 void StartDefaultTask(void *argument)
13 {
14   /* USER CODE BEGIN StartDefaultTask */
15     BaseType_t ret = pdFALSE;
16   /* Infinite loop */
17   for(;;)
18   {
19     ret = xQueueReceive(queue_mes,&queue_data,portMAX_DELAY);
20     if(ret == pdTRUE)
21     {
22         HAL_UART_Transmit(&huart1,queue_data.data,queue_data.len,100);
23     }
24   }
25   /* USER CODE END StartDefaultTask */
26 }

 

实验效果

 

时代越来越好,开

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇树莓派+阿里云+frp 实现内网穿透 下一篇微控制器实时操作系统实践4选择正..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目