最近在调H750的DMA串口接收 串口和DMA的中断都要开吗?还是只要开一个DMA中断 我只开DMA中断程序并没有进DMA中断 使能了I_CACHE和D_CACHE以后是不是要做字节对齐 以下是代码 把UART7接受到的25字节数据通过串口1传出来 什么都没有 UART_HandleTypeDef UART1_InitStructure; UART_HandleTypeDef UART7_InitStructure; DMA_HandleTypeDef DMA_UART7_RX; u8 aRxBuffer[25]; void My_Usart_Init(void) { UART1_InitStructure.Instance=USART1; UART1_InitStructure.Init.BaudRate=115200; UART1_InitStructure.Init.WordLength=UART_WORDLENGTH_8B; UART1_InitStructure.Init.StopBits=UART_STOPBITS_1; UART1_InitStructure.Init.Parity=UART_PARITY_NONE; UART1_InitStructure.Init.HwFlowCtl=UART_HWCONTROL_NONE; UART1_InitStructure.Init.Mode=UART_MODE_TX_RX; HAL_UART_Init(&UART1_InitStructure); UART7_InitStructure.Instance=UART7; UART7_InitStructure.Init.BaudRate=100000; UART7_InitStructure.Init.WordLength=UART_WORDLENGTH_8B; UART7_InitStructure.Init.StopBits=UART_STOPBITS_2; UART7_InitStructure.Init.Parity=UART_PARITY_EVEN; UART7_InitStructure.Init.HwFlowCtl=UART_HWCONTROL_NONE; UART7_InitStructure.Init.Mode=UART_MODE_RX; HAL_UART_Init(&UART7_InitStructure); HAL_UART_Receive_DMA(&UART7_InitStructure, (u8 *)aRxBuffer, 25); } void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef GPIO_InitStructure; if(huart->Instance==USART1) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); GPIO_InitStructure.Pin=GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStructure.Mode=GPIO_MODE_AF_PP; GPIO_InitStructure.Pull=GPIO_NOPULL; GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStructure.Alternate=GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA,&GPIO_InitStructure); } if(huart->Instance==UART7) { __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_UART7_CLK_ENABLE(); GPIO_InitStructure.Pin=GPIO_PIN_7; GPIO_InitStructure.Mode=GPIO_MODE_AF_PP; GPIO_InitStructure.Pull=GPIO_NOPULL; GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStructure.Alternate=GPIO_AF7_UART7; HAL_GPIO_Init(GPIOE,&GPIO_InitStructure); __HAL_RCC_DMA1_CLK_ENABLE(); DMA_UART7_RX.Instance=DMA1_Stream0; DMA_UART7_RX.Init.Request=DMA_REQUEST_UART7_RX; DMA_UART7_RX.Init.Direction=DMA_PERIPH_TO_MEMORY; DMA_UART7_RX.Init.PeriphInc=DMA_PINC_DISABLE; DMA_UART7_RX.Init.MemInc=DMA_MINC_ENABLE; DMA_UART7_RX.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; DMA_UART7_RX.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; DMA_UART7_RX.Init.Mode=DMA_CIRCULAR; DMA_UART7_RX.Init.Priority=DMA_PRIORITY_VERY_HIGH; DMA_UART7_RX.Init.FIFOMode=DMA_FIFOMODE_DISABLE; DMA_UART7_RX.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL; DMA_UART7_RX.Init.MemBurst=DMA_MBURST_SINGLE; DMA_UART7_RX.Init.PeriphBurst=DMA_PBURST_SINGLE; HAL_DMA_Init(&DMA_UART7_RX); __HAL_LINKDMA(&UART7_InitStructure,hdmarx,DMA_UART7_RX); HAL_NVIC_SetPriority(DMA1_Stream0_IRQn,0,0); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); } } |
usart接收中断负责每次接收1个字节数据。中断是必不可少的。否则接收缓冲区一直未满,无法触发DMA中断 |
我是来学习的 |
uart中断一定要开,串口的NVIC总中断,和RXNE中断,都要开 |
wenyangzeng 的见解是对的,不过 DMA 收一个就中断,跟 DMA中断的本意冲突了。可加 定时【大于单个字的3~5倍】中断,后续接收时间 超过定时时间,就算是本次结束。 |
一般来说,看你是否需要用到中断。如果只收一次数据,延时或查询完成后就结束了。如果后面还要继续收,可以使能DMA完成中断,在中断中知道下次接收可以再开始了(再调用这个函数了)。 一般有DMA帮助及时搬运就不用使能缓冲区了,反正硬件自动搬运,又不占用软件资源。 个人认为如果使用DMA方式,串口接收中断就没什么事需要做了,所以不使能也行。总之以你的需要为主,测试一下实际是否满足你的需求 |
STM32H7432 串口采用DMA方式接收不定长数据重复问题
STM32H750使用FMC控制LCD数据异常
STM32H7 CANFD过滤问题
关于STM32H750采用DMA方式发送数据到DAC产生正弦波
STM32H7配置成USB DEVICE时,连接电脑时不进入中断
STM32H753XIH6运行时发热达到五六十度
STM32H750电池供电后AD采样的电容板子电压变化异常
STM32H750VB芯片整片无法擦出
STM32H743IIT6Flash擦除问题
STM32H750 ADC 发现结果跳动很严重