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

STM32H750的串口DMA接受

[复制链接]
assassin007 提问时间:2019-10-12 17:29 /
最近在调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);
        }
}

收藏 评论5 发布时间:2019-10-12 17:29

举报

5个回答
wenyangzeng 回答时间:2019-10-12 19:11:39
usart接收中断负责每次接收1个字节数据。中断是必不可少的。否则接收缓冲区一直未满,无法触发DMA中断
vanzero 回答时间:2019-10-12 20:36:45
我是来学习的
飞跃-344154 回答时间:2019-10-12 22:02:30
uart中断一定要开,串口的NVIC总中断,和RXNE中断,都要开
慎微 回答时间:2019-10-14 09:47:23
wenyangzeng 的见解是对的,不过 DMA 收一个就中断,跟 DMA中断的本意冲突了。可加 定时【大于单个字的3~5倍】中断,后续接收时间 超过定时时间,就算是本次结束。
butterflyspring 回答时间:2019-10-28 19:01:00
一般来说,看你是否需要用到中断。如果只收一次数据,延时或查询完成后就结束了。如果后面还要继续收,可以使能DMA完成中断,在中断中知道下次接收可以再开始了(再调用这个函数了)。 一般有DMA帮助及时搬运就不用使能缓冲区了,反正硬件自动搬运,又不占用软件资源。 个人认为如果使用DMA方式,串口接收中断就没什么事需要做了,所以不使能也行。总之以你的需要为主,测试一下实际是否满足你的需求
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版