找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1766|回复: 0
打印 上一主题 下一主题
收起左侧

STM32 USART DMA方式配置

[复制链接]
跳转到指定楼层
楼主
ID:821217 发表于 2020-9-20 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #define USART1_BUFF_SIZE 1024

  2. uint8_t  usart1_tx_buffer[USART1_BUFF_SIZE];   /* 串口发送缓存 */

  3. uint8_t  usart1_rx_buffer[USART1_BUFF_SIZE];   /* 串口接受缓存 */

  4. uint16_t usart1_tx_flag = 0;       /* 接收一帧数据标志,并记录接收数据个数 */



  5. /********************************************************************************************************

  6. ** 函数: USART1_Init,  串口1初始化

  7. **------------------------------------------------------------------------------------------------------

  8. ** 参数:bound 波特兰

  9. ** 返回: 无                                                                                          

  10. ********************************************************************************************************/

  11. void USART1_Init(uint32_t bound)

  12. {

  13.         GPIO_InitTypeDef GPIO_InitStructure;

  14.         USART_InitTypeDef USART_InitStructure;

  15.         NVIC_InitTypeDef NVIC_InitStructure;



  16.         /* 打开GPIO和USART部件的时钟 */

  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);



  19.         /* 配置GPIO的模式和IO口 */

  20.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                       // 串口输出PA9(TX)

  21.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    // IO口频率

  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;           // 复用推挽输出

  23.         GPIO_Init(GPIOA,&GPIO_InitStructure);                             // 初始化

  24.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;                   // 串口输入PA10(RX)

  25.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;// 浮空输入

  26.         GPIO_Init(GPIOA,&GPIO_InitStructure);                            // 初始化



  27.         /* 配置串口硬件参数 */

  28.         USART_InitStructure.USART_BaudRate = bound;    /* 波特率 */

  29.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  30.         USART_InitStructure.USART_StopBits = USART_StopBits_1;

  31.         USART_InitStructure.USART_Parity = USART_Parity_No ;

  32.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  33.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  34.         USART_Init(USART1, &USART_InitStructure);



  35.         USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);    /* 使能串口空闲中断 */

  36.         USART_ClearFlag(USART1, USART_FLAG_TC | USART_FLAG_IDLE);

  37.         USART_Cmd(USART1, ENABLE);        /* 使能串口 */

  38.         /* 开启串口收发DMA请求 */

  39.         USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);



  40.         /* 使能串口1中断 */

  41.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  42.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  43.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  44.         NVIC_Init(&NVIC_InitStructure);

  45. }



  46. /********************************************************************************************************

  47. ** 函数: USART1_DMA_Init,  串口1初始化。 配置串口1的DMA,并开启DMA接收中断。

  48. **------------------------------------------------------------------------------------------------------

  49. ** 参数: 无

  50. ** 返回: 无                                                                                          

  51. ********************************************************************************************************/

  52. void USART1_DMA_Init(void)

  53. {

  54.         DMA_InitTypeDef DMA_InitStructure;



  55.         /* 打开DMA通道时钟 */

  56.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);



  57.         DMA_DeInit(DMA1_Channel4);//TX 通道

  58.         DMA_DeInit(DMA1_Channel5);//RX 通道



  59.         /* TX 通道 配置*/

  60.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);

  61.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_tx_buffer;

  62.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  63.         DMA_InitStructure.DMA_BufferSize = 0;

  64.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  65.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  66.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  67.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  68.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  69.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

  70.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  71.         DMA_Init(DMA1_Channel4,&DMA_InitStructure);



  72.         /* RX 通道 配置*/

  73.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);

  74.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_rx_buffer;

  75.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  76.         DMA_InitStructure.DMA_BufferSize = USART1_BUFF_SIZE;

  77.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  78.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  79.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  80.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  81.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  82.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

  83.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  84.         DMA_Init(DMA1_Channel5,&DMA_InitStructure);



  85.         /* 使能DMA收发通道 */

  86.         DMA_Cmd(DMA1_Channel4,ENABLE);

  87.         DMA_Cmd(DMA1_Channel5,ENABLE);



  88.         /* 这里没有使用DMA接收完成或者发送完成中断,如需要,可以在这里添加 */

  89. }



  90. /**

  91.   * @brief  This function handles usart1 interrupt request.

  92.   * @param  None

  93.   * @retval None

  94.   */

  95. void USART1_IRQHandler(void)

  96. {

  97.         uint8_t  ClearFlag;

  98.         uint16_t Count = 0;



  99.         /* 处理接收空闲中断  */

  100.         if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

  101.         {

  102.                 /* 清除标志:先读SR,再读DR */

  103.                 ClearFlag = USART1->SR;

  104.                 ClearFlag = USART1->DR;

  105.                

  106.                 /* 获取接收数据个数 */

  107.                 Count = DMA_GetCurrDataCounter(DMA1_Channel5);

  108.                 usart1_tx_flag = USART1_BUFF_SIZE - Count;



  109.                 /* 处理数据,这里用于演示,将收到的数据使用DMA发送出去 */

  110.                 memcpy((uint8_t *)usart1_tx_buffer, (uint8_t *)usart1_rx_buffer, usart1_tx_flag);



  111.                 /* DMA接收复位 */

  112.                 DMA_Cmd(DMA1_Channel5,DISABLE);

  113.                 DMA_SetCurrDataCounter(DMA1_Channel5,USART1_BUFF_SIZE);

  114.                 DMA_Cmd(DMA1_Channel5,ENABLE);

  115.         }

  116. }

复制代码




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表