STM32
直播中

徐伟

7年用户 906经验值
私信 关注
[问答]

求助,关于stm8l151k4 ad采样的问题求解

//初始化函数
void ADC_Periph_Init(void)
{
  u8 idx;

  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//使能ADC时钟
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);//使能DMA1时钟

  GPIO_Init(GPIOB,GPIO_Pin_5,GPIO_Mode_In_FL_No_IT);//浮空输入

  ADC_Cmd(ADC1,ENABLE);//打开ADC

  for (idx = 0;idx < 50;idx++);//adc上电需要一段时间

  ADC_VrefintCmd(ENABLE);//使能内部参考电压

  ADC_DMACmd(ADC1,ENABLE);//使用ADC的DMA功能

  //连续转换模式
  ADC_Init(ADC1, ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_1);

  //ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_192Cycles);
  //ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_192Cycles);
   ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);                        

  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);//内部参考电压
  ADC_ChannelCmd(ADC1, ADC_Channel_13, ENABLE);//通道13   PB5

  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

  DMA_Init(DMA1_Channel0,//通道0
          (uint32_t) ADC_ConvertedValue,//缓冲区地址
          (uint16_t)ADC1_DR_Address,//ADC数据寄存器地址
          DMA_BUF_SIZE,//缓冲区大小
          DMA_DIR_PeripheralToMemory,//外设到内存
          DMA_Mode_Circular,//循环转换
          DMA_MemoryIncMode_Inc,//内存地址自增
          DMA_Priority_High,//优先级为高
          DMA_MemoryDataSize_HalfWord);//内存数据是半字位宽

  DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//设置转速的数据个数

  DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, ENABLE);//使能传输完成中断
  DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);

  DMA_Cmd(DMA1_Channel0,ENABLE);//使能通道0   

  DMA_GlobalCmd(ENABLE);//打开DMA

  ADC_SoftwareStartConv(ADC1);//software trigger
}
//DMA中断
INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{uint16_t *p;
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  if(DMA_GetITStatus(DMA1_IT_TC0) != RESET)
  {
    p= ADC_ConvertedValue[0];
    Data_Pack_handle(p);

    DMA_ClearITPendingBit(DMA1_IT_TC0);
  }
}
//数据打包函数。
void Data_Pack_handle(uint16_t *P_DMA_data)
{uint8_t i;
  for(i=0;i

回帖(1)

王彬

2024-5-13 18:00:28
您好!看起来您正在使用STM8L151K4微控制器进行ADC采样,并希望了解如何初始化ADC。以下是您提供的初始化函数的详细解释:

1. `CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);`:这行代码启用了ADC1的时钟。在进行ADC采样之前,需要确保ADC的时钟已经开启。

2. `CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);`:这行代码启用了DMA1的时钟。DMA(Direct Memory Access)是一种硬件特性,可以允许外设直接与内存进行数据传输,而不需要CPU干预。在ADC采样过程中,可以使用DMA来提高数据传输的效率。

3. `GPIO_Init(GPIOB,GPIO_Pin_5,GPIO_Mode_In_FL_No_IT);`:这行代码配置了GPIOB的第5个引脚(PB5)为浮空输入模式。这意味着该引脚将作为ADC的输入通道。

4. `ADC_Cmd(ADC1,ENABLE);`:这行代码启用了ADC1模块。

5. `for (idx = 0; idx < 50; idx++);`:这个循环提供了一个延时,以确保ADC模块在上电后有足够的时间稳定。通常,ADC模块在上电后需要一段时间来稳定其内部参数。

6. `ADC_VrefintCmd(ENABLE);`:这行代码启用了内部参考电压。在进行ADC采样时,需要一个参考电压来确定模拟信号的量化级别。

在完成这些初始化步骤后,您可以开始配置ADC的采样参数,例如采样速率、分辨率等。然后,您可以启动ADC采样过程,并使用DMA将采样数据传输到内存中。

如果您有任何关于STM8L151K4 ADC采样的问题或需要进一步的帮助,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分