关与TIM3定时触发ADC1采样两通道DMA传输的问题

[复制链接]
1885|3
 楼主| xiashengcheng 发表于 2018-4-23 20:35 | 显示全部楼层 |阅读模式
首先程序我是调好了,不过有个地方我没有明白,定时器间隔500US采样一次数据,每次采样100个数据(两通道每通道50 个数据)
问题是当然触发后500MS内这100个数据会采样完成吗,或是如果100个数据没有采样完成,然后定时器的时间又到了再次触发会怎么样呢。。
 楼主| xiashengcheng 发表于 2018-4-23 20:39 | 显示全部楼层
  1. void TIM3_Int_Init(u16 arr,u16 psc)
  2. {
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;

  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

  6.     //定时器TIM3初始化
  7.     TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的重装载寄存器周期的值
  8.     TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMX时钟频率除数的分频值
  9.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  10.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  11.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMX的时间基数单位

  12.     TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  13.     TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清中断以免一启用中断后立即产生中断
  14.     TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);           //
  15.    
  16.     //?????NVIC??
  17.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  18.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //占先优先级
  19.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级
  20.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ中断通道使能
  21.     NVIC_Init(&NVIC_InitStructure);  //初始化NVIC

  22. //    TIM_Cmd(TIM3, ENABLE);  //使能TIMX
  23. }
  24. //ADC_DMA初始化配置  
  25. void ADC_DMA_Config(void)  
  26. {  
  27.   DMA_InitTypeDef DMA_InitStructure; // 注:ADC为12位模数转换器,只有ADCConvertedValue的低12位有效  
  28.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟  
  29.   DMA_DeInit(DMA1_Channel1);//开启DMA1的第一通道   
  30.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//DMA对应的外设基地址  
  31.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue[0]; //内存存储基地址  
  32.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA的转换模式为SRC模式,由外设搬移到内存  
  33.   DMA_InitStructure.DMA_BufferSize = 100;//DMA缓存大小,1个  
  34.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移  
  35.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //关闭接收一次数据后,目标内存地址后移  
  36.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度为16位  
  37.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位  
  38.   DMA_InitStructure.DMA_Mode =DMA_Mode_Circular;//循环转换模式  
  39.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA优先级高  
  40.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//M2M模式禁用  
  41.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);           
  42.   DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);//使能传输完成中断  
  43. //        DMA_Cmd(DMA1_Channel1, ENABLE);
  44. }   
  45. *******************************************************************************
  46. * 函数名  : ADC1_Init_Config
  47. * 描述    : ADC1初始化配置
  48. * 输入    : 无
  49. * 输出    : 无
  50. * 返回    : 无
  51. * 说明    : 只是初始化了ADC1但未启动ADC1转换
  52. *******************************************************************************/                                                                                                                                  
  53. void ADC1_Init_Config(void)
  54. {        
  55.         ADC_InitTypeDef ADC_InitStructure;
  56.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE ); //使能ADC1和GPIOA外设时钟
  57.         RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟分频因子为6(72M/6=12M),ADC最大工作频率为14M
  58.         /*初始化配置ADC1*/
  59.         ADC_DeInit(ADC1); //复位ADC1,即将ADC1的所有寄存器设置为缺省值
  60.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
  61.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                                        //ADC1工作在独立模式
  62.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                //扫描模式设置,多通道下使用使能,单通道下使用失能
  63.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                        //模数转换工作在单次转换模式
  64.         ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T3_TRGO;//ADC_ExternalTrigConv_None;//定时器3TRGO触发ADC_ExternalTrigConv_None;        //由软件来触发转换启动,也可以设置成外设启动
  65.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                //ADC数据右对齐
  66.         ADC_InitStructure.ADC_NbrOfChannel = 2;                                                                //顺序进行规则转换的ADC通道的数目
  67.         ADC_Init(ADC1, &ADC_InitStructure);                                                                        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  

  68.         ADC_ExternalTrigConvCmd(ADC1,ENABLE);
  69.         ADC_RegularChannelConfig(ADC1, 5, 1, ADC_SampleTime_239Cycles5 );
  70.         ADC_RegularChannelConfig(ADC1, 6, 2, ADC_SampleTime_239Cycles5 );
  71.         ADC_DMACmd(ADC1,ENABLE);//开启DMA请求
  72.         ADC_Cmd(ADC1, ENABLE);                                                        //使能ADC1,但还没启动ADC1
  73.         ADC_ResetCalibration(ADC1);                                        //使能ADC1复位校准寄存器         
  74.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位完成       
  75.         ADC_StartCalibration(ADC1);                                        //开启AD校准
  76.         while(ADC_GetCalibrationStatus(ADC1));                //等待校准完成
  77.         TIM_Cmd(TIM3, ENABLE);//??????????  
  78.   DMA_Cmd(DMA1_Channel1, ENABLE);//??DMA  
  79. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
  80. }
 楼主| xiashengcheng 发表于 2018-4-23 20:41 | 显示全部楼层

以上是,TIM3定时器初始化配置
adc dma初始化配置
adc初始化配置。。。

求大神指点这个

定时器间隔500US采样一次数据,每次采样100个数据(两通道每通道50 个数据)
问题是当然触发后500MS内这100个数据会采样完成吗,或是如果100个数据没有采样完成,然后定时器的时间又到了再次触发会怎么样呢。。
dirtwillfly 发表于 2018-4-23 21:57 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

107

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部