tanic 发表于 2017-4-14 15:56:59

STM8L151 ADC 定时器TRGO触发

本帖最后由 tanic 于 2017-5-5 17:10 编辑

0123456

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搬移数据
定时器500HZ2ms触发一次。


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

等硬件出来了试试,不知道有没有问题哎!:dizzy:

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);
别人小白,想向楼主学习学习
页: [1] 2
查看完整版本: STM8L151 ADC 定时器TRGO触发