OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2121|回复: 2

基于STM32F103的定时DMA数据发送

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-24
在线时间
3 小时
发表于 2019-7-1 13:05:17 | 显示全部楼层 |阅读模式
1金钱

实现功能: STM32每间隔1秒,串口采用DMA方式发送一帧数据。

硬件:STM32F103、485接口
我的构思:开启定时器定时1秒,计数器溢出触发DMA,而后DMA发送一帧数据, DMA发送完成产生发送完成中断,重新配置DMA再次
问题:我写完之后采用串口调试助手调试,结果发现数据是1秒个字节发送出去的,而非一秒- 帧发送出去的,然后等数据全部发送完之后进入的DMA中断服务函数。看了许久不知道有什么毛病。求各路大神帮助,不胜感激。以下是相关外设配置程序。
  1. maim.c:
  2. int main(void)
  3. {        
  4.                 uint16_t i;
  5.         /*填充将要发送的数据*/        
  6.   for(i=0;i<SENDBUFF_SIZE;i++)
  7.   {
  8.     SendBuff[i]         = 'P';
  9.                 if(i == SENDBUFF_SIZE-1)        
  10.                         SendBuff[i]         = 'Q';
  11.   }
  12.         

  13.         LED_GPIO_Config();

  14.   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  15.   USART3_Config(); //串口配置
  16.         /* 发送使能 */
  17.         USART3_DMA_Config();//DMA配置
  18.         RS485_TX_EN();//485发送使能
  19.         BASIC_TIM_Init();//定时器配置
  20.         TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);//定时器发送DMA请求

  21.         while(1)
  22.         {

  23.         }
  24. }
复制代码
  1. DMA与串口的配置:
  2. void USART3_DMA_Config(void)
  3. {
  4.                 DMA_InitTypeDef DMA_InitStructure;
  5.         
  6.                 // 开启DMA时钟
  7.                 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  8.                 /* 复位初始化 DMA 数据流 */
  9.                 DMA_DeInit(DMA1_Channel2);
  10.                 // 设置DMA外设地址:串口数据寄存器地址*/
  11.     DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
  12.                 // 内存地址(要传输的变量的指针)
  13.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
  14.                 // 方向:从内存到外设        
  15.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  16.                 // 传输大小        
  17.                 DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
  18.                 // 外设地址不增            
  19.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  20.                 // 内存地址自增
  21.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  22.                 // 外设数据单位        
  23.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  24.                 // 内存数据单位
  25.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
  26.                 // DMA模式,一次或者循环模式
  27.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
  28.                 //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        
  29.                 // 优先级:中        
  30.                 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  31.                 // 禁止内存到内存的传输
  32.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  33.                 // 配置DMA通道                  
  34.                 DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);        
  35.                
  36.                 DMA_SetCurrDataCounter(DMA1_Channel2, SENDBUFF_SIZE);
  37.                 NVIC_DMA1_2_Configuration();

  38.                 //开启DMA通道的TC中断:传输完成中断
  39.     DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
  40.                 // 使能DMA
  41.                 DMA_Cmd (DMA1_Channel2,ENABLE);
  42. }

  43. void DMA1_Ch2_IRQ(void)//DMA中断服务函数
  44. {
  45.            if(DMA_GetITStatus(DMA1_IT_TC2))
  46.                  {                        
  47.                                  DMA_ClearITPendingBit(DMA1_IT_GL2); //清除全部中断标志 //DMA_ClearFLAG(DMA1_FLAG_TC2); //清除全部中断标志(这种写法也可以)
  48. //                                 RS485_RX_EN();
  49.                                 // 使能串口接收中断
  50. //                                USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  51. //                                // 使能串口空闲中断(用于检测一帧数据接收完毕)
  52. //                                USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);        
  53.                 }
  54. //                         //清TC标志
  55. //   DMA_ClearFlag(DMA1_FLAG_TC4);
  56.    //关闭DMA通道
  57. //   DMA_Cmd(DMA1_Channel2, DISABLE);
  58.         USART3_DMA_Config();
  59. //        RS485_TX_EN();               
  60.         }
复制代码
  1. 定时器的配置:
  2. static void BASIC_TIM_Mode_Config(void)
  3. {
  4.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.                
  6.                 // 开启定时器时钟,即内部时钟CK_INT=72M
  7.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  8.         
  9.                 // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  10.     TIM_TimeBaseStructure.TIM_Period = 9000-1;        

  11.           // 时钟预分频数为71,则驱动计数器的时钟 为CLK/(71+1)=1M
  12.     TIM_TimeBaseStructure.TIM_Prescaler= 8000-1;
  13.         
  14.                 // 时钟分频因子 ,基本定时器没有,不用管
  15.     //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  16.                
  17.                 // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
  18.     //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  19.                
  20.                 // 重复计数器的值,基本定时器没有,不用管
  21.                 //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  22.         
  23.           // 初始化定时器
  24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  25.                
  26.                 // 清除计数器中断标志位
  27.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);
  28.          
  29. //                // 开启计数器中断
  30. //                TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
  31.                
  32.                 //UDE:更新DMA请求使能 (Update DMA request enable) */
  33. //        TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);//定时器发送DMA请求
  34.                 // 使能计数器
  35.     TIM_Cmd(TIM2, ENABLE);        

  36. }

  37. void BASIC_TIM_Init(void)
  38. {
  39.         BASIC_TIM_NVIC_Config();
  40.         BASIC_TIM_Mode_Config();
  41. }

复制代码




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-7-1 18:51:13 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-24
在线时间
3 小时
 楼主| 发表于 2019-7-2 09:15:51 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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