打印
[应用相关]

STM32定时器触发ADC采样+DMA模式参考程序

[复制链接]
11283|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mmuuss586|  楼主 | 2014-7-20 18:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mmuuss586 于 2014-7-20 18:13 编辑

:)
DMA采用:循环模式,在程序查询DMA完成标志即可判断一组数据有没有转换完成;

中断:定时器,DMA,ADC中断未使用;

参考程序:
main.rar (2.6 KB)
评分
参与人数 1威望 +3 收起 理由
yoghen + 3
沙发
mmuuss586|  楼主 | 2014-7-20 18:13 | 只看该作者
#define ADC1_DR_Address    ((uint32_t)0x4001244C)

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ADC_InitTypeDef           ADC_InitStructure;
DMA_InitTypeDef           DMA_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
TIM_OCInitTypeDef         TIM_OCInitStructure;
__IO uint16_t ADC_RegularConvertedValueTab[32], ADC_InjectedConvertedValueTab[32];

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
  
/* Private functions ---------------------------------------------------------*/

/**
  * @brief   Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
      
  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
//  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  /* TIM1 configuration ------------------------------------------------------*/
  /* Time Base configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 1000;         
  TIM_TimeBaseStructure.TIM_Prescaler = 71;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  /* TIM1 channel1 configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
  TIM_OCInitStructure.TIM_Pulse = 500;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  /* DMA1 Channel1 Configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 16;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel14 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_71Cycles5);
  /* Set injected sequencer length */
  ADC_InjectedSequencerLengthConfig(ADC1, 1);
       
////  /* ADC1 injected channel Configuration */
////  ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_71Cycles5);
////  /* ADC1 injected external trigger configuration */
////  ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

  /* Enable automatic injected conversion start after regular one */
  ADC_AutoInjectedConvCmd(ADC1, ENABLE);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 external trigger */
  ADC_ExternalTrigConvCmd(ADC1, ENABLE);

////  /* Enable JEOC interrupt */
////  ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

  /* TIM1 main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  
  while (1)
        {
                TIM_Cmd(TIM1, ENABLE);
                /* Test on channel1 transfer complete flag */
                while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
                /* Clear channel1 transfer complete flag */
                DMA_ClearFlag(DMA1_FLAG_TC1);
                /* TIM1 counter disable */
                TIM_Cmd(TIM1, DISABLE);
        }
}

使用特权

评论回复
板凳
keji1| | 2014-7-20 18:27 | 只看该作者
谢谢分享;

使用特权

评论回复
地板
yzzly| | 2014-7-21 10:19 | 只看该作者
还要查询DMA完成标志?不浪费CPU资源吗?DMA传输结束中断不是更好?

使用特权

评论回复
5
mmuuss586|  楼主 | 2014-7-21 12:09 | 只看该作者
yzzly 发表于 2014-7-21 10:19
还要查询DMA完成标志?不浪费CPU资源吗?DMA传输结束中断不是更好?

你可以看我其它**啊;
不同的需要吧;

使用特权

评论回复
6
liuss620| | 2014-9-16 09:26 | 只看该作者
搞不太明白。唉

使用特权

评论回复
7
liuss620| | 2014-9-16 09:27 | 只看该作者
不是TIM1中断么?中断怎么处理的?

使用特权

评论回复
8
picasso101| | 2014-9-25 15:54 | 只看该作者
需要更高级的方式

使用特权

评论回复
9
sjxkaxisi| | 2015-4-3 20:55 | 只看该作者
谢谢楼主了

使用特权

评论回复
10
qt_litao| | 2015-4-20 17:42 | 只看该作者
谢谢。

使用特权

评论回复
11
ylhdy| | 2015-8-28 15:23 | 只看该作者
谢谢楼主分享,各人有各人的方式。

使用特权

评论回复
12
zhai_hong_tao| | 2015-8-28 21:06 | 只看该作者
不错的咚咚,学习一下

使用特权

评论回复
13
wxhwdh| | 2015-12-13 21:30 | 只看该作者
mmuuss586 发表于 2014-7-20 18:13
#define ADC1_DR_Address    ((uint32_t)0x4001244C)

/* Private macro -------------------------------- ...

楼主,我有两个问题
1.TIM1为什么要用pwm
2.还有定时器的周期到一次,是不是触发一次adc,也就是采集一个点?

使用特权

评论回复
14
天灵灵地灵灵| | 2015-12-29 23:19 | 只看该作者
也就是说可以通过定时器中断触发ADC进行转换后直接DMA自动传送?

使用特权

评论回复
15
DFH| | 2016-3-8 12:31 | 只看该作者
你好  楼主  刚刚我也在接触这一块,遇到了好多问题 想向你请教一下     1.配置的时候要不要配置NVIC   2.要不要配置中断服务函数    3.使用定时器触发ADC转换,是不是每个一个PWM脉冲转换一次   小白一个,求助。

使用特权

评论回复
16
绝地战枭| | 2016-5-11 15:00 | 只看该作者
感谢楼主无私分享,长知识了

使用特权

评论回复
17
夕照| | 2016-6-8 09:27 | 只看该作者

使用特权

评论回复
18
lywer8888| | 2017-2-26 09:14 | 只看该作者
谢谢分享学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入21IC论坛 游名科技:提供直流无刷电机驱动整体解决方案

696

主题

32653

帖子

437

粉丝