[其他ST产品] stm32 ADC单次中断采集

[复制链接]
376|2
 楼主| 是你的乱码 发表于 2023-1-15 19:08 | 显示全部楼层 |阅读模式

本例程平台是STM32F103VCT6, 标准库配置PA7ADC2的第8个模数转换通道。

初始化如下

  1. u16 AdcValue = 0;

  2. static void ADC_NVIC_Config(void)
  3. {
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     // 优先级分组
  6.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  7.     // 配置中断优先级
  8.     NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  9.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  10.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  11.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.     NVIC_Init(&NVIC_InitStructure);
  13. }

  14. void  AdcInit(void)//治疗头温度传感器
  15. {
  16.     ADC_InitTypeDef ADC_InitStructure;
  17.     GPIO_InitTypeDef GPIO_InitStructure;

  18.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC2, ENABLE );

  19.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  20.     //PA7 作为模拟通道输入引脚
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;   //模拟输入引脚
  23.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  24.     ADC_DeInit(ADC2);  //复位ADC2

  25.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC工作模式:ADC2工作在独立模式
  26.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;       //模数转换工作在单通道模式
  27.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
  28.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  29.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //ADC数据右对齐
  30.     ADC_InitStructure.ADC_NbrOfChannel = 1;                     //顺序进行规则转换的ADC通道的数目
  31.     ADC_Init(ADC2, &ADC_InitStructure);                         

  32.     ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);
  33.    
  34.     ADC_Cmd(ADC2, ENABLE);                          //使能指定的ADC2
  35.     ADC_ResetCalibration(ADC2);                     //使能复位校准
  36.     while(ADC_GetResetCalibrationStatus(ADC2));     //等待复位校准结束
  37.     ADC_StartCalibration(ADC2);                            //开启AD校准
  38.     while(ADC_GetCalibrationStatus(ADC2));          //等待校准结束

  39.     ADC_NVIC_Config();//中断配置
  40. }


 楼主| 是你的乱码 发表于 2023-1-15 19:09 | 显示全部楼层
单次启动时和中断处理接口

  1. void StartAdcSample(u8 Ch)
  2. {
  3.     ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);

  4.     //设置指定ADC的规则组通道,一个序列,采样时间
  5.     ADC_RegularChannelConfig(ADC2, Ch, 1, ADC_SampleTime_239Cycles5 );  //ADC1,ADC通道,采样时间为239.5周期

  6.     ADC_SoftwareStartConvCmd(ADC2, ENABLE);       //使能指定的ADC1的软件转换启动功能
  7. }

  8. void ADC1_2_IRQHandler(void)
  9. {
  10.     if (ADC_GetITStatus(ADC2,ADC_IT_EOC)==SET)
  11.     {
  12.         // 读取ADC的转换值
  13.         AdcValue = ADC_GetConversionValue(ADC2);
  14.     }
  15.     ADC_ClearITPendingBit(ADC2,ADC_IT_EOC);

  16. }
 楼主| 是你的乱码 发表于 2023-1-15 19:10 | 显示全部楼层
调用时可以直接使用
  1. int  main(void)
  2. {
  3.     AdcInit();

  4.     while(1)
  5.     {
  6.         StartAdcSample(7);
  7.     }
  8. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

490

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部