STM32H750的串口DMA接受不到数据
使用的是UART7的RX端接收25字节长度的数据 代码如下UART_HandleTypeDef UART1_InitStructure;UART_HandleTypeDef UART7_InitStructure;
DMA_HandleTypeDef DMA_UART7_RX;
u8 aRxBuffer;
void My_Usart_Init(void)
{
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_ENABLE_IT(&UART7_InitStructure,UART_IT_IDLE);
HAL_UART_Receive_DMA(&UART7_InitStructure, (u8 *)aRxBuffer, 25);
}
void DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,0,0);
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef 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);
DMA_UART7_RX.Instance=DMA2_Stream2;
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_EnableIRQ(UART7_IRQn);
HAL_NVIC_SetPriority(UART7_IRQn,0,0);
}
}
void Send_Data(u8 *data,u8 len)
{
HAL_UART_Transmit(&UART1_InitStructure,(u8 *)data,len,1000);
}
void UART7_IRQHandler(void)
{
u32 temp;
HAL_UART_IRQHandler(&UART7_InitStructure);
if(__HAL_UART_GET_FLAG(&UART7_InitStructure,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&UART7_InitStructure);
temp=UART7_InitStructure.Instance->ISR;
temp=UART7_InitStructure.Instance->RDR;
HAL_UART_DMAStop(&UART7_InitStructure);
temp=__HAL_DMA_GET_COUNTER(&DMA_UART7_RX);
Send_Data(aRxBuffer,25);
}
// HAL_UART_Receive_DMA(&UART7_InitStructure, (u8 *)aRxBuffer, 25);
}
UART7接受到的数据再用USART1传给电脑 现在是传回来的数据全是空的 不知如何是好
你这个波特率是32位的吗和上位机的波特率匹配不
有奇偶校验那么数据位应该写9位的
找不到问题的时候可以先用仿真看看数据接收情况还有寄存器
1)HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,0,0) 这里 改为 HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,3,2) 试下;
2)另外,中断处理要尽量快省,不要在UART7_IRQHandle 中处理Send_Data(aRxBuffer,25);
3)DMA2_Stream2_IRQn 中断有初始化吗?
4)main 在再初始化uart,DMA 后 调用HAL_UART_Receive_DMA(&UART7_InitStructure, (u8 *)aRxBuffer, 25) 一次 启动 DMA; mikecai 发表于 2019-10-12 11:22
1)HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,0,0) 这里 改为 HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,3,2) ...
DMA2_Stream2_IRQn有初始化 就这一个中断
只接受的话是不是不需要开串口中断 只开DMA中断就行了 mylovemcu 发表于 2019-10-12 09:25
你这个波特率是32位的吗和上位机的波特率匹配不
有奇偶校验那么数据位应该写9位的
波特率是100K 发送端就是这个波特率
仿真看数据接受缓存全是0x00 遇到了相同的问题,第一次用H750,使用cube创建的工程,串口DMA收发遇到问题,调试发现是DMA传输错误,最好发现是内存问题,也就是说你分配那块内存DMA用不了,从0x24000000开始内存DMA可用,你可以在程序中指定分配内存的地址,或者把keil配置里的IRAM2勾上,IRAM1取消 可以参照cube 库中 743样板下的串口例程:)
页:
[1]