高级会员

- 积分
- 685
- 金钱
- 685
- 注册时间
- 2019-4-24
- 在线时间
- 43 小时
|
1金钱
想着用串口DMA,每两秒发一次数据。结果是上电之后只发一次,之后就不发了,一直找不到原因。
DMA配置为从存储到外设,这里用的是串口1的DMA发送,主函数里面是每个两秒发送调用一次DMA发送。下面是串口DMA的配置
- void HAL_UART_MspInit(UART_HandleTypeDef* huart)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(huart->Instance==USART1)
- {
- /* USER CODE BEGIN USART1_MspInit 0 */
- /* USER CODE END USART1_MspInit 0 */
- /* Peripheral clock enable */
- __HAL_RCC_USART1_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /**USART1 GPIO Configuration
- PA9 ------> USART1_TX
- PA10 ------> USART1_RX
- */
- GPIO_InitStruct.Pin = GPIO_PIN_9;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* USART1 DMA Init */
- /* USART1_TX Init */
- hdma_usart1_tx.Instance = DMA1_Channel4;
- hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
- hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
- hdma_usart1_tx.Init.Mode = DMA_NORMAL;
- hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
- if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
- {
- Error_Handler();
- }
- __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
- /* USART1 interrupt Init */
- HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(USART1_IRQn);
- /* USER CODE BEGIN USART1_MspInit 1 */
- /* USER CODE END USART1_MspInit 1 */
- }
- }
主函数里面
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- if(TimeCtrl1.IsTXTime)//每隔两秒发一次;
- {
- TimeCtrl1.IsTXTime=0;
-
- MYDMA_USART_Transmit(&huart1,src,14);
-
- // HAL_UART_Transmit(&huart1,src,14,0xffffffff);//测试串口是否正常用的。
- }
- }
TimeCtrl1时间控制结构体定义
- typedef struct
- {
- unsigned char IsTXTime :1;
- unsigned int TimeCnt;
- }FlagType;
- void SysTick_Handler(void)
- {
- /* USER CODE BEGIN SysTick_IRQn 0 */
- TimeCtrl1.TimeCnt++;
- if(2000==TimeCtrl1.TimeCnt)
- {
- TimeCtrl1.IsTXTime=1;
- TimeCtrl1.TimeCnt=0;
-
- }
- /* USER CODE END SysTick_IRQn 0 */
- HAL_IncTick();
- /* USER CODE BEGIN SysTick_IRQn 1 */
- /* USER CODE END SysTick_IRQn 1 */
- }
DMA发送函数:
- void MYDMA_USART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- {
- HAL_DMA_Start(huart->hdmatx, (u32)pData, (uint32_t)&huart->Instance->DR, Size);//¿aÆôDMA′«êä
- huart->Instance->CR3 |= USART_CR3_DMAT;//ê1Äü′®¿úDMA·¢Ëí
- }
DMA初始化函数:
- static void MX_DMA_Init(void)
- {
- /* DMA controller clock enable */
- __HAL_RCC_DMA1_CLK_ENABLE();
- /* DMA interrupt init */
- /* DMA1_Channel4_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
|
|