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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版