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

【经验分享】STM32 DMA 应用之 DMA 串口 数据传输--发送

[复制链接]
STMCU小助手 发布时间:2022-5-23 22:00
一、DMA请求映像

1YLUE2RBGHV5F8@~8WSCQKK.png
1VJ8YBP37AR3OVN}HCXSYI4.png


由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1_Channel4

使用串口1的接收功能需要用到的是DMA1_Channel5


二、怎样配置软件来使用DMA  把数据传到串口发送?


(1)配置dma

  1. /**************************************************************************
  2. *函数名称:  Dma_Init
  3. *功能描述: 利用DMA 把内存的数据传输到串口发送达到高速传输的目的
  4. *  
  5. *输入参数:无
  6. *返回值  :无
  7. *其他说明:无
  8. *当前版本:v1.0
  9. *作者     :尹宣
  10. *完成时间:2013年12月1日
  11. *修改日期              版本号              修改人              修改内容
  12. *-----------------------------------------------------------------
  13. *
  14. ******************************************************************/
  15. #define UART_RX_LEN     5
  16. u8 Uart_Send_Buffer[UART_RX_LEN] = {0x12,0x34,0x56,0x78,0x90};
  17. u8 i=0;
  18. u8 Flag_Uart_Send=0;

  19. void Dma_Init(void)
  20. {
  21.   DMA_InitTypeDef  DMA_InitStructure;

  22. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  23.        /* DMA channel6configuration */
  24.   DMA_DeInit(DMA1_Channel1);
  25. DMA_InitStructure.DMA_PeripheralBaseAddr       = (u32)(&USART1->DR);  //外设地址
  26. DMA_InitStructure.DMA_MemoryBaseAddr                    =(u32)Uart_Send_Buffer;
  27.   DMA_InitStructure.DMA_DIR                                      =DMA_DIR_PeripheralDST;   //外设作为目的地址   //DMA_DIR_PeripheralSRC;   //外设作为DMA的源端
  28. DMA_InitStructure.DMA_BufferSize                          =5; //BufferSize;      //传输大小
  29.   DMA_InitStructure.DMA_PeripheralInc                   =DMA_PeripheralInc_Disable; //外设递增模式禁止   DMA_PeripheralInc_Enable;            //外设地址增加
  30. DMA_InitStructure.DMA_MemoryInc                       =DMA_MemoryInc_Enable;   //内存地址自增
  31. DMA_InitStructure.DMA_PeripheralDataSize         = DMA_PeripheralDataSize_Byte; //传输方式:字节   DMA_PeripheralDataSize_Word;    //字(32位)
  32. DMA_InitStructure.DMA_MemoryDataSize            =DMA_PeripheralDataSize_Byte;  //内存存储方式:字节  DMA_MemoryDataSize_Word;
  33.   DMA_InitStructure.DMA_Mode                                  =DMA_Mode_Circular;  //DMA_Mode_Normal 正常模式,只传送一次;  DMA_Mode_Circular:循环模式,不停的传送;
  34. DMA_InitStructure.DMA_Priority                      =DMA_Priority_High;
  35.   DMA_InitStructure.DMA_M2M                                   =DMA_M2M_Disable;             //DMA_M2M_Enable;   
  36.   DMA_Init(DMA1_Channel4,&DMA_InitStructure);

  37.   /* Enable DMA Channel4Transfer Complete interrupt */
  38.   DMA_ITConfig(DMA1_Channel4,DMA_IT_TC, ENABLE);
  39. //
  40. // USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);                                                                    //串口接收器DMA
  41. //采用DMA方式发送
  42.        USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
  43.        //启动串口   
  44.        USART_Cmd(USART1,ENABLE);


  45.   DMA_ITConfig(DMA1_Channel4,DMA_IT_TC, ENABLE);
  46. 传输完成则进入DMA1_Channel4中断;
复制代码

注意这句话:USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  这是使能指定USART的DMA请求;(不同的外设都有这个  xxx_DMACmd()请求;)

USART_DMAReq_Tx:发送DMA请求

USART_DMAReq_Rx:接收DMA请求


串口配置

  1. /*****************************************************************
  2. *函数名称: USART1_Init
  3. *功能描述:   配置串口1初始化
  4. *  
  5. *输入参数:无
  6. *返回值  :无
  7. *其他说明:无
  8. *当前版本:v1.0
  9. *作者     :尹宣
  10. *完成时间:2013年12月1日
  11. *修改日期              版本号              修改人              修改内容
  12. *-----------------------------------------------------------------
  13. *
  14. ******************************************************************/
  15. void USART1_Init(uint32 baud)
  16. {
  17.        GPIO_InitTypeDef       GPIO_InitStructure;
  18.        USART_InitTypeDef      USART_InitStructure;
  19.        USART_ClockInitTypeDefUSART_ClockInitStructure;



  20.        //使能串口1,PA,AFIO总线
  21.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
  22.                           RCC_APB2Periph_AFIO |
  23.                           RCC_APB2Periph_USART1 ,
  24.                           (FunctionalState)ENABLE);

  25.        // A9 USART1_Tx
  26.    GPIO_InitStructure.GPIO_Pin   =GPIO_Pin_9;
  27.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.    GPIO_InitStructure.GPIO_Mode  =GPIO_Mode_AF_PP;
  29.     GPIO_Init(GPIOA,&GPIO_InitStructure);

  30.     // A10 USART1_Rx
  31.    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
  32.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  33.     GPIO_Init(GPIOA,&GPIO_InitStructure);

  34.        USART_InitStructure.USART_BaudRate            = baud;
  35.        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
  36.        USART_InitStructure.USART_StopBits            = USART_StopBits_1;
  37.        USART_InitStructure.USART_Parity              = USART_Parity_No;
  38.        USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;
  39.        USART_InitStructure.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;

  40.        USART_ClockInitStructure.USART_Clock   = USART_Clock_Disable;
  41.        USART_ClockInitStructure.USART_CPOL    = USART_CPOL_Low;
  42.        USART_ClockInitStructure.USART_CPHA    = USART_CPHA_2Edge;
  43.        USART_ClockInitStructure.USART_LastBit= USART_LastBit_Disable;
  44.     USART_ClockInit(USART1,&USART_ClockInitStructure);

  45.     USART_Init(USART1,&USART_InitStructure);
  46.     USART_Cmd(USART1,(FunctionalState)ENABLE);
  47. //  USART_ClearFlag(USART3, USART_FLAG_TC);  
  48.        //串口1使用接收中断
  49.        USART_ITConfig(USART1,USART_IT_RXNE,(FunctionalState)ENABLE);
  50. }
复制代码

2.设置DMA优先级

  1. /*****************************************************************
  2. *函数名称:  NVIC_Config
  3. *功能描述:   配置DMA的中断优先级
  4. *  
  5. *输入参数:无
  6. *返回值  :无
  7. *其他说明:无
  8. *当前版本:v1.0
  9. *作者     :尹宣
  10. *完成时间:2013年12月1日
  11. *修改日期              版本号              修改人              修改内容
  12. *-----------------------------------------------------------------
  13. *
  14. ******************************************************************/
  15. void NVIC_Config(void)
  16. {
  17.          NVIC_InitTypeDefNVIC_InitStructure;  

  18.          //DMA优先级        
  19.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
  20.          NVIC_InitStructure.NVIC_IRQChannel= DMA1_Channel4_IRQn;
  21.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;
  22.          NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  23.          NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  24.          NVIC_Init(&NVIC_InitStructure);


  25.          /*Configure one bit for preemption priority -------------------------------- */
  26.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  27.          /*UART1 -------------------------------------------------------------------- */
  28.          NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;
  29.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
  30.          NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  31.          NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  32.          NVIC_Init(&NVIC_InitStructure);   

  33. }
复制代码


3.在stm3210x_it.c 文件中添加 DMA中断处理函数

  1. /*******************************************************************************
  2. * Function Name  : DMAChannel1_IRQHandler
  3. * Description    : This function handles DMA Stream 1interrupt request.
  4. * Input          : None
  5. * Output         : None
  6. * Return         : None
  7. *******************************************************************************/
  8. //串口1  DMA方式发送中断
  9. void DMA1_Channel4_IRQHandler(void)
  10. {

  11.           //清除标志位
  12.    DMA_ClearFlag(DMA1_FLAG_TC4);
  13.    //关闭DMA
  14.    DMA_Cmd(DMA1_Channel4,DISABLE);
  15.           Flag_Uart_Send = 0;

  16. }
复制代码


如果DMA是正常模式DMA_Mode_Normal时,传输结束后将不再产生DMA操作;所以需要在传输完成的中断中暂时把DMA关闭—即:DMA_Cmd(DMA1_Channel4,DISABLE);

之后在main函数的while(1)循环中打开DMA_Cmd(DMA1_Channel4,ENABLE);进行下一次的传输;


测试:

数据源地址为数组Uart_Send_Buffer ,它的定义如下:

#define UART_RX_LEN     5

u8 Uart_Send_Buffer[UART_RX_LEN] ={0x12,0x34,0x56,0x78,0x90};



当程序开始全速运行时,串口助手打印

QH}2)5_)3TT88A}I$CW3B}I.png


收藏 评论0 发布时间:2022-5-23 22:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版