打印
[STM32L1]

STM32L152 定时器TIM2的CC2触发ADC

[复制链接]
2939|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
三草木|  楼主 | 2015-7-10 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,本人之前一直用的是STM32F系列的,这次用L系列的,由于L系列库函数没有 TIM_CtrlPWMOutputs(TIM2, ENABLE);函数,且寄存器也不一样和F系列的,求解!
代码如下:
void AD_Config_Init(void)
{
  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable the HSI oscillator */
  RCC_HSICmd(ENABLE);

  /* Enable GPIOB clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);

  /* Configure PB.12 (ADC Channel18) in analog mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* Check that HSI oscillator is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  /* Enable ADC1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  /* ADC1 configuration */
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//DISABLE;//ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConv_T2_CC2;//ADC_ExternalTrigConvEdge_None;//ADC_ExternalTrigConv_T2_CC3;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 8;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel18 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_4Cycles); //ADC_SampleTime_4Cycles
  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 4, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_22, 5, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_23, 6, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_24, 7, ADC_SampleTime_4Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_25, 8, ADC_SampleTime_4Cycles);

  /* Enable the request after last transfer for DMA Circular mode */
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

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

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

  /* Wait until the ADC1 is ready */
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
  {
  }

  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConv(ADC1);
//  ADC_StartCalibration(ADC1);
//  ADC1->CR2 |= (uint32_t)0x00000004;

}

void TIME2_Init( uint16_t frq_cj)
{
   TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
   TIM_OCInitTypeDef         TIM_OCInitStructure;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   TIM_DeInit(TIM2);

   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
   TIM_TimeBaseStructure.TIM_Period = frq_cj;         
   TIM_TimeBaseStructure.TIM_Prescaler = 0;//零分频,设置定期为1/72us      
   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
   TIM_OCInitStructure.TIM_Pulse = frq_cj;//0x2BF2;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
   TIM_OC1Init(TIM2, &TIM_OCInitStructure);
//   TIM_CtrlPWMOutputs(TIM2, ENABLE);
//   TIM2->BDTR |= ((u16)0x8000);

   TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);//TIM_OPMode_Repetitive);

   TIM_Cmd(TIM2, ENABLE);
}                          



沙发
三草木|  楼主 | 2015-7-10 11:51 | 只看该作者
本帖最后由 三草木 于 2015-7-10 11:52 编辑

@香水城 帮忙stm32L 系列的如何定时器触发AD

使用特权

评论回复
板凳
香水城| | 2015-7-14 16:50 | 只看该作者
L152没有高级定时器,当然没有TIM_CtrlPWMOutputs(TIM2, ENABLE);
TIM2是通用寄存器,F和L系列都有差别应该不大。
楼主可以参考F1标准外设库里的TIMTrigger_AutoInjection例程。

另外,下面这句有错。ADC_ExternalTrigConvEdge 设置的是触发沿,ADC_ExternalTrigConv才是设置触发源。
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConv_T2_CC2;//ADC_ExternalTrigConvEdge_None;//ADC_ExternalTrigConv_T2_CC3;

使用特权

评论回复
地板
三草木|  楼主 | 2015-7-22 16:11 | 只看该作者
谢谢,谢谢版主,还是用了中断的形式做了,就是4K的RAM很惆怅啊:'(,

使用特权

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

本版积分规则

6

主题

39

帖子

2

粉丝