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

【经验分享】STM32F103使用串口DMA接收发送数据源码分享

[复制链接]
STMCU小助手 发布时间:2022-4-24 17:00
  1. u8 gprsTxBuf[100];
  2. u8 gprsRxBuf[1500];
  3. //接收DMA初始化
  4. void tx_dma_init(void)
  5. {
  6.         DMA_InitTypeDef         DMA_InitStructure;
  7.        
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  9.        
  10.         DMA_Cmd(DMA1_Channel7, DISABLE);  
  11.         DMA_DeInit(DMA1_Channel7);
  12.         DMA_InitStructure.DMA_BufferSize=sizeof(gprsTxBuf);                                //ÏÈÉèÖÃΪ1K´óС
  13.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
  14.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;               
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)gprsTxBuf;
  16.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  17.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  18.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
  19.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  21.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  22.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;
  23.         DMA_Init(DMA1_Channel7,&DMA_InitStructure);                //³õʼ»¯TXµÄDMA
  24. }
  25. //发送DMA初始化
  26. void rx_dma_init(void)
  27. {
  28.         DMA_InitTypeDef DMA_InitStructure;

  29.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  30.         DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
  31.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gprsRxBuf;
  32.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  33.         DMA_InitStructure.DMA_BufferSize = sizeof(gprsRxBuf);
  34.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  35.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  36.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  37.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
  38.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
  39.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  40.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;          
  41.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);
  42.         DMA_Cmd (DMA1_Channel6,ENABLE);
  43. }


  44. //串口初始化
  45. void uart_init(void)
  46. {
  47.         GPIO_InitTypeDef   GPIO_InitStructure;   
  48.         USART_InitTypeDef  USART_InitStructure;         
  49.         NVIC_InitTypeDef   NVIC_InitStructure;       
  50.        
  51.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA        , ENABLE);
  52.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  53.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  54.        
  55.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  57.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  58.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  59.        
  60.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  61.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  62.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  63.        
  64.         NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
  65.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  66.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  67.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  68.         NVIC_Init(&NVIC_InitStructure);
  69.        
  70.         USART_InitStructure.USART_BaudRate = 115200;
  71.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;       
  72.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  73.         USART_InitStructure.USART_Parity = USART_Parity_No;
  74.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  75.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  76.         USART_Init(USART2, &USART_InitStructure);
  77.        
  78.         USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
  79.         USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
  80.        
  81.         USART_ClearFlag(USART2,USART_FLAG_RXNE);
  82.         USART_ClearFlag(USART2, USART_FLAG_TC);
  83.         USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
  84.        
  85.         USART_Cmd(USART2, ENABLE);
  86. }
  87. //DMA发送数据
  88. void send_commend(u8 *buf,u16 size)
  89. {
  90.         memset(gprsTxBuf,0,100);
  91.         memcpy(gprsTxBuf,buf,size);
  92.        
  93.         DMA_Cmd(DMA1_Channel7,DISABLE);
  94.         DMA_SetCurrDataCounter(DMA1_Channel7,size);
  95.         DMA_Cmd(DMA1_Channel7,ENABLE);
  96. }

  97. void gprs_dma_reset()
  98. {
  99.     DMA_Cmd(DMA1_Channel6, DISABLE );
  100.     DMA_SetCurrDataCounter(DMA1_Channel6, sizeof(gprsRxBuf));
  101.     DMA_Cmd(DMA1_Channel6, ENABLE);  
  102. }

  103. extern u8 gprsRecOverFlag;
  104. extern u16 gprsRecCnt;
  105. void USART2_IRQHandler(void)            
  106. {

  107.         u16 uartRecCnt=0;

  108.         if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
  109.         {
  110.                 USART_ReceiveData(USART2);
  111.                 uartRecCnt = sizeof(gprsRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel6);
  112.                 //**********************//
  113.                 gprsRecOverFlag=1;
  114.                 gprsRecCnt=uartRecCnt;
  115.                 //*************************************//
  116.                 gprs_dma_reset();              
  117.                 USART_ClearITPendingBit(USART2,USART_IT_IDLE);   
  118.         }
  119. }



复制代码

收藏 评论0 发布时间:2022-4-24 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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