历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2019年08月30日 | stm32串口HAL库的DMA发送问题

2019-08-30 来源:eefocus

本文使用stm32f411ret的串口1的DMA方式发送数据,刚开始调试的时候发现串口只能发送一次数据,之后就把系统hang住了。通过网上搜资料和不断尝试,发现问题是中断回调函数没有写的原因。


使用HAL库的DMA,需要同时实现DMA中断回调函数和串口中断回调函数。


void DMA2_Stream7_IRQHandler(void)

{

    HAL_DMA_IRQHandler(Uart1Handle.hdmatx);

}

 

void USART1_IRQHandler(void)

{

  HAL_NVIC_ClearPendingIRQ(USART1_IRQn);

  HAL_UART_IRQHandler(&Uart1Handle);

}

下面附上我的dma配置和串口配置函数


dma配置


void HAL_UART1_dma_Init(void)

{

  static DMA_HandleTypeDef hdma_tx;

 

  __HAL_RCC_DMA2_CLK_ENABLE();                //打开DMA2时钟

  /*##-3- Configure the DMA streams ##########################################*/

  /* Configure the DMA handler for Transmission process */

  hdma_tx.Instance                 = DMA2_Stream7;      

  hdma_tx.Init.Channel             = DMA_CHANNEL_4;        //串口1发送属于stream7、channel4,可在参考手册的DMA章节查到

  hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;    //数据发送方向:内存->外设

  hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;        //外设为串口,地址不需要增加

  hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;        //存储需要增加

  hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    //串口为字节

  hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;    //与串口设置要一致

  hdma_tx.Init.Mode                = DMA_NORMAL;              //一次发送,如果设置为循环模式,会一直不停的发 

  hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;        //低优先级

  hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    

  hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;

  hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;

  hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4;

  

  HAL_DMA_Init(&hdma_tx);   

  

  /* Associate the initialized DMA handle to the the UART handle */

  __HAL_LINKDMA(&Uart1Handle, hdmatx, hdma_tx);            //将dma的发送handle赋值给串口1的hdmatx成员

  /*##-4- Configure the NVIC for DMA #########################################*/

  /* NVIC configuration for DMA transfer complete interrupt (USARTx_TX) */

  HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 1);           //设置dma中断优先级

  HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);                   //使能dma中断

}

串口引脚配置


void Init_Usart1(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

  

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  __HAL_RCC_GPIOA_CLK_ENABLE();  

  /* Enable USARTx clock */

   __HAL_RCC_USART1_CLK_ENABLE();

  

  /*##-2- Configure peripheral GPIO ##########################################*/  

  /* UART TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = GPIO_PIN_9;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull      = GPIO_PULLUP;

  GPIO_InitStruct.Speed     = GPIO_SPEED_FAST;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

  

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    

  /* UART RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = GPIO_PIN_10;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

    

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_NVIC_SetPriority(USART1_IRQn,0,0);

HAL_NVIC_EnableIRQ(USART1_IRQn);

}

串口配置


void Usart1_Configuration(uint32_t BaudRate)

{    

  Uart1Handle.Instance          = USART1;

  

  Uart1Handle.Init.BaudRate     = BaudRate;

  Uart1Handle.Init.WordLength   = UART_WORDLENGTH_8B;

  Uart1Handle.Init.StopBits     = UART_STOPBITS_1;

  Uart1Handle.Init.Parity       = UART_PARITY_NONE;

  Uart1Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;

  Uart1Handle.Init.Mode         = UART_MODE_TX_RX;

  Uart1Handle.Init.OverSampling = UART_OVERSAMPLING_16;

    

  if(HAL_UART_Init(&Uart1Handle) != HAL_OK)

  {

    /* Initialization Error */

    Error_Handler(); 

  }

    

}

发送数据调用下面的函数即可


HAL_UART_Transmit_DMA(&Uart1Handle, (uint8_t*)aTxBuffer, 32)

实际操作时可以在串口中断中设置一个标志位,用来标记串口发送完成,在主程序中用标志位控制对发送函数的调用。

推荐阅读

史海拾趣

Curtis Instruments Inc公司的发展小趣事

随着全球市场的不断变化和竞争的加剧,Curtis不断加强全球布局和战略合作。公司与多家国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。此外,Curtis还积极参与国际展览和交流活动,展示公司的最新技术和产品成果,提高品牌知名度和影响力。这些全球布局和战略合作有助于Curtis更好地应对市场挑战、把握发展机遇。

屹晶微(EG)公司的发展小趣事

屹晶微的创始人黄米龙,原本在发电厂从事电气运营工作长达八年。这段经历让他对电子领域有了深入的了解和浓厚的兴趣。然而,他并没有满足于现状,而是看到了中国芯片产业的巨大潜力和发展空间。于是,在2007年,他毅然决定从发电厂辞职,利用自己的积蓄和借来的资金,在台州创立了屹晶微电子有限公司。

在创立初期,屹晶微面临着资金短缺、技术落后和市场竞争激烈的困境。但黄米龙凭借对电子行业的深刻理解和坚定的信念,带领团队克服了种种困难。他们不断引进先进技术和设备,加强研发力量,提升产品质量。经过几年的努力,屹晶微逐渐在芯片设计领域崭露头角,并成功推出了多款具有自主知识产权的芯片产品。

复旦微电子(FM)公司的发展小趣事

屹晶微的创始人黄米龙,原本在发电厂从事电气运营工作长达八年。这段经历让他对电子领域有了深入的了解和浓厚的兴趣。然而,他并没有满足于现状,而是看到了中国芯片产业的巨大潜力和发展空间。于是,在2007年,他毅然决定从发电厂辞职,利用自己的积蓄和借来的资金,在台州创立了屹晶微电子有限公司。

在创立初期,屹晶微面临着资金短缺、技术落后和市场竞争激烈的困境。但黄米龙凭借对电子行业的深刻理解和坚定的信念,带领团队克服了种种困难。他们不断引进先进技术和设备,加强研发力量,提升产品质量。经过几年的努力,屹晶微逐渐在芯片设计领域崭露头角,并成功推出了多款具有自主知识产权的芯片产品。

DBM Optix公司的发展小趣事

在竞争激烈的电子行业中,DBM Optix深知只有不断创新才能保持领先地位。因此,公司始终将研发作为核心竞争力之一,持续投入大量资金用于新技术、新产品的开发。通过与高校、研究机构等合作,DBM Optix不断引入新技术、新材料,并将其应用于产品中,从而不断提升产品的性能和品质。这些创新举措使得DBM Optix在光学通信领域始终保持领先地位。

Hi-G Relays公司的发展小趣事

随着全球对环保和可持续发展的重视,DBM Optix也积极响应这一趋势。公司在生产过程中注重节能减排、降低废弃物排放等措施,同时积极开发环保型产品,以满足客户对绿色环保的需求。此外,DBM Optix还积极参与各种环保活动和社会公益事业,为推动电子行业的可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

Digitron公司的发展小趣事

Digitron公司非常重视产品的品质和售后服务。公司建立了严格的质量控制体系,确保每一台出厂的设备都符合高标准的质量要求。同时,Digitron公司还提供全方位的售后服务,包括技术支持、维修保养等,确保客户在使用过程中得到及时、有效的帮助。这种对品质的坚持和对客户的关怀使Digitron公司在客户中树立了良好的口碑。

问答坊 | AI 解惑

与初学者谈电子制作

您一定玩过电子游戏机;使用过手电筒。如果让您亲手制作这些电子作品,您一定会感到很兴奋,很有趣。其实您只要花上几元钱,买几个电子元件,就可以通过自己的努力在几个小时内创造出自己的电子作品。通过一个小小电子产品的制作,不仅证明了您的智慧 ...…

查看全部问答>

WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错

如题: WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错, 痛苦啊! 而且EDB容量还是比较小的,这是烦死了 …

查看全部问答>

PIC16f877a 串口程序问题

各位老师好,我是惠州的小肖。^_^平时有空就搞一下单片机。。对单片机这一块我就一菜鸟。。这不我照着李学海老师的书上我测试了一串口通信程序。李学海老师写的串口程序是用的汇编语言。。我试着把这程序用C语言改写。。可就是不能实现同样的功能( ...…

查看全部问答>

我是一个新手,求教大虾们,给点建议

我是一个刚刚到公司实习的新手,由于之前没有学过wince有关的开发,所以想请大虾们帮忙,我有几个问题: 1.开发wince项目需要什么开发工具,什么开发工具是通用的 2.教我如何编写第一个wince程序 3.我需要重点学习wince的哪个部分 重重有赏啊各 ...…

查看全部问答>

关于F28335

请问F28335中的16路12bitAD是指可以同时对16路不同的模拟信号进行采样吗? [ 本贴由 xiancheng_2005 于 2008-5-11 02:53 PM 最后编辑 ]…

查看全部问答>

频率计

   求大神帮忙,本人刚学msp430. 用msp430g2553测量频率,显示在lcd1602上,有没有谁有c语言程序啊。…

查看全部问答>

KL25Z128开发板例程中的iic问题

我使用例程中的IIC程序,直接不改动例程,能在开发板上正常跑起来,但是,我现在要把数据写到EEPROM中去,如果使用例程中的读写函数: i2c0WriteNByte(0xA0, ONE_BYTE_SUBA, 0x00, ucData, 10);           &nb ...…

查看全部问答>

技术宅自制巨型A380遥控飞机 试飞视频窜红

对于航空迷来说,这个视频绝对俘虏了他们的心。该视频YouTube点击已超过270万次数据还在上涨当中。该A380飞模长约4.82米,侧翼长约为5.3米,重约70.8千克,飞机装配10升左右燃油,每分钟燃油1升左右,由四个Jetcat涡轮发动机驱动起飞 $(\'swf_XO8\ ...…

查看全部问答>

小知识:纹波和噪声的区别

     在电源问题中经常有人问起纹波和噪声上的问题,从牛人写的电源的书中也能找出一些二者的差异,实际测试中其实也能发现有所不同。输出纹波和输出电流和输出电压都有关系,主要是与电流的关系。通常输出纹波近似等于输出电流 ...…

查看全部问答>

MXCHIP open1081 WIFI_Link扫描不到wifi信号

1.open1081 WIFI_Link串口不显示扫描到到wifi信号,可以连接到目标wifi信号。Why?我的串口输出: 例程给出的结果: 2.根据例程,按键中断可以触发扫描wifi,但是我按照原理图的连接修改程序中按键的管脚连接,试了不行。Why? 以上请高手指导 ...…

查看全部问答>