STM32H750的串口DMA接受
最近在调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;
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中断 :P 我是来学习的 uart中断一定要开,串口的NVIC总中断,和RXNE中断,都要开 wenyangzeng 的见解是对的,不过 DMA 收一个就中断,跟 DMA中断的本意冲突了。可加 定时【大于单个字的3~5倍】中断,后续接收时间 超过定时时间,就算是本次结束。 一般来说,看你是否需要用到中断。如果只收一次数据,延时或查询完成后就结束了。如果后面还要继续收,可以使能DMA完成中断,在中断中知道下次接收可以再开始了(再调用这个函数了)。 一般有DMA帮助及时搬运就不用使能缓冲区了,反正硬件自动搬运,又不占用软件资源。 个人认为如果使用DMA方式,串口接收中断就没什么事需要做了,所以不使能也行。总之以你的需要为主,测试一下实际是否满足你的需求
页:
[1]