你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H750的串口DMA接受不到数据

[复制链接]
assassin007 提问时间:2019-10-11 20:00 /
悬赏1ST金币未解决
使用的是UART7的RX端接收25字节长度的数据 代码如下UART_HandleTypeDef UART1_InitStructure;
UART_HandleTypeDef UART7_InitStructure;
DMA_HandleTypeDef DMA_UART7_RX;

u8 aRxBuffer[25];
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传给电脑 现在是传回来的数据全是空的 不知如何是好

收藏 评论6 发布时间:2019-10-11 20:00

举报

6个回答
mylovemcu 回答时间:2019-10-12 09:25:33
你这个波特率是32位的吗  和上位机的波特率匹配不
有奇偶校验  那么数据位应该写9位的

找不到问题的时候  可以先用仿真看看  数据接收情况  还有寄存器


慎微 回答时间:2019-10-12 11:22:14
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;
assassin007 回答时间:2019-10-12 17:32:35
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中断就行了
assassin007 回答时间:2019-10-12 17:34:48
mylovemcu 发表于 2019-10-12 09:25
你这个波特率是32位的吗  和上位机的波特率匹配不
有奇偶校验  那么数据位应该写9位的

波特率是100K 发送端就是这个波特率
仿真看数据接受缓存全是0x00
streamlee 回答时间:2020-3-12 10:10:07
遇到了相同的问题,第一次用H750,使用cube创建的工程,串口DMA收发遇到问题,调试发现是DMA传输错误,最好发现是内存问题,也就是说你分配那块内存DMA用不了,从0x24000000开始内存DMA可用,你可以在程序中指定分配内存的地址,或者把keil配置里的IRAM2勾上,IRAM1取消
butterflyspring 回答时间:2020-3-18 17:24:33
可以参照cube 库中 743样板下的串口例程
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版