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

STM8L151 ADC 定时器TRGO触发

[复制链接]
tanic 提问时间:2017-4-14 15:56 /
1ST金币
本帖最后由 tanic 于 2017-5-5 17:10 编辑

0123456

收藏 1 评论10 发布时间:2017-4-14 15:56

举报

10个回答
tanic 回答时间:2017-4-14 16:23:58
本帖最后由 tanic 于 2017-5-5 17:00 编辑

我现在要做的是
系统时钟16M;
ADC用了5通道   采样率500Hz,开启一次采样采集100个数据
ADC时钟2分频  2M/2=1M    转换时间48Cycles,   0.48us *5=0.24us
DMA搬移数据
定时器500HZ  2ms触发一次。


tanic 回答时间:2017-4-14 16:26:33
本帖最后由 tanic 于 2017-5-5 16:59 编辑

/*系统时钟*/
static void CLK_Config(void)
{
  /* Select HSE as system clock source */
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);
  /*High speed external clock prescaler: 1*/
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);/*16M*/

  while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSE)
  {}


/*TIM1*/
static void Timer1_Config()
{
  /*
  - TIM1CLK = 16 MHz
  - TIM1 counter clock = TIM1CLK / TIM1_PRESCALER+1 = 16 MHz/159+1 = 100kHz
  */
  /* Time base configuration */  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, ENABLE);
  TIM1_TimeBaseInit(9, TIM1_CounterMode_Up, 199, 0);
}
tanic 回答时间:2017-4-14 16:27:45
本帖最后由 tanic 于 2017-5-5 17:11 编辑

/*ADC初始化*/
static void ADC_Config(void)
{
   /* Enable ADC1 clock */
   CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
  /* Initialize and configure ADC1
   */
  ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_2);
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_48Cycles);
  ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_48Cycles);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
   /* Enable ADC1 Channels 7 */
  ADC_ChannelCmd(ADC1, ADC_Channel_7, ENABLE); /* connected to 通道5 */
  /* Enable ADC1 Channels 8 */
  ADC_ChannelCmd(ADC1, ADC_Channel_8, ENABLE); /* connected to 通道4 */
    /* Enable ADC1 Channels 9 */
  ADC_ChannelCmd(ADC1, ADC_Channel_9, ENABLE); /* connected to 通道3 */
  /* Enable ADC1 Channels 10 */
  ADC_ChannelCmd(ADC1, ADC_Channel_10, ENABLE); /* connected to 通道2 */
  /* Enable ADC1 Channels 24 */
  ADC_ChannelCmd(ADC1, ADC_Channel_24, ENABLE); /* connected to 通道1 */
}
tanic 回答时间:2017-4-14 16:28:41
#define ADC1_DR_ADDRESS        ((uint16_t)0x5344)
#define BUFFER_SIZE            ((uint8_t) SERSOR_MUN)
#define BUFFER_ADDRESS         ((uint16_t)(&Buffer))
/*DMA*/
static void DMA_Config(void)
{
    /* Enable DMA1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  /* Connect ADC to DMA channel 0 */
  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

  DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
           ADC1_DR_ADDRESS,
           BUFFER_SIZE,
           DMA_DIR_PeripheralToMemory,
           DMA_Mode_Circular,
           DMA_MemoryIncMode_Inc,
           DMA_Priority_High,
           DMA_MemoryDataSize_HalfWord);

  /* DMA Channel0 enable */
  DMA_Cmd(DMA1_Channel0, ENABLE);

  /* Enable DMA1 channel0 Transfer complete interrupt */
  DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);

  /* DMA enable */
  DMA_GlobalCmd(ENABLE);
}
tanic 回答时间:2017-4-14 16:30:22
本帖最后由 tanic 于 2017-5-5 17:10 编辑

/*初始化*/
void ADC_DMA_Init()
{
        ADC_Config();
        DMA_Config();
        Timer1_Config();
        /* Enable ADC1 DMA requests*/
        ADC_DMACmd(ADC1, ENABLE);
        /* Start ADC1 Conversion using TIM1 TRGO*/
        ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger2,
                                                 ADC_ExtTRGSensitivity_Rising);
        
        /* Master Mode selection: Update event */
        TIM1_SelectOutputTrigger(TIM1_TRGOSource_Update);
        

//        TIM1_Cmd(ENABLE);

}
tanic 回答时间:2017-4-14 16:32:12
等硬件出来了试试,不知道有没有问题哎!
tanic 回答时间:2017-5-5 17:01:23
本帖最后由 tanic 于 2017-5-5 17:09 编辑

012345
tanic 回答时间:2017-5-5 17:04:26
本帖最后由 tanic 于 2017-5-5 17:09 编辑

调试通过
WOFY 回答时间:2017-7-12 13:02:15
请问一下楼主定时器这样配置不是8KHz吗?TIM1_TimeBaseInit(9, TIM1_CounterMode_Up, 199, 0);
怎么达到2ms触发一次呢?定时器触发与DMA_ADC有倍数关系吗?
还是跟这种方式有关?TIM1_SelectOutputTrigger(TIM1_TRGOSource_Update);
别人小白,想向楼主学习学习
tanic 回答时间:2017-7-28 17:45:45
WOFY 发表于 2017-7-12 13:02
请问一下楼主定时器这样配置不是8KHz吗?TIM1_TimeBaseInit(9, TIM1_CounterMode_Up, 199, 0);
怎么达到2ms ...

#define TIM1_PERIOD                  199
#define TIM1_PRESCALER                  159
#define TIM1_REPTETION_COUNTER          0
/*500
信号频率 50Hz   0.02
采样率   500Hz  0.002  5个通道一次转换0.24us
*/
static void Timer1_Config()
{
  /*
  - TIM1CLK = 16 MHz
  - TIM1 counter clock = TIM1CLK / TIM1_PRESCALER+1 = 16 MHz/(159+1) = 100kHz
  */
  /* Time base configuration */
  TIM1_DeInit();
  adcDelay();  
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, ENABLE);
  TIM1_TimeBaseInit(TIM1_PRESCALER, TIM1_CounterMode_Up, TIM1_PERIOD, TIM1_REPTETION_COUNTER);
}
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版