[CW32F030系列] ADC单通道转换

[复制链接]
599|2
 楼主| 51xlf 发表于 2022-9-11 20:40 | 显示全部楼层 |阅读模式
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] ADC I/O初始化
  3. *
  4. */
  5. void ADC_PortInit(void)
  6. {
  7.     //打开GPIO时钟
  8.     REGBITS_SET( CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk );
  9.     //打开ADC时钟
  10.     REGBITS_SET( CW_SYSCTRL->APBEN2, SYSCTRL_APBEN2_ADC_Msk );

  11.     //set PA01 as AIN1 INPUT
  12.     PA01_ANALOG_ENABLE();
  13. }

  14. /**
  15. * @brief Main function of project
  16. *
  17. * [url=home.php?mod=space&uid=266161]@return[/url] int
  18. */
  19. int main(void)
  20. {
  21.     ADC_InitTypeDef ADC_InitStructure;
  22.     ADC_WdtTypeDef ADC_WdtStructure;
  23.     ADC_SingleChTypeDef ADC_SingleChStructure;
  24.    
  25.        
  26.         //LED初始化
  27.         LED_Init();

  28.     //配置ADC测试IO口
  29.     ADC_PortInit();

  30.     //ADC默认值初始化
  31.     ADC_StructInit(&ADC_InitStructure);
  32.     //ADC工作时钟配置
  33. #ifdef SGL_MORE_MODE_EN
  34.     ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4;
  35. #else
  36.     ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div1;
  37. #endif

  38.     //ADC模拟看门狗通道初始化
  39.     ADC_WdtInit(&ADC_WdtStructure);
  40.    
  41.     //配置单通道转换模式
  42.     ADC_SingleChStructure.ADC_DiscardEn = ADC_DiscardNull;
  43.     ADC_SingleChStructure.ADC_Chmux = ADC_ExInputCH1;        //选择ADC转换通道,AIN1:PA01
  44.     ADC_SingleChStructure.ADC_InitStruct = ADC_InitStructure;
  45.     ADC_SingleChStructure.ADC_WdtStruct = ADC_WdtStructure;

  46. #ifdef SGL_ONE_MODE_EN
  47.     ADC_SingleChOneModeCfg(&ADC_SingleChStructure);
  48.     ADC_ITConfig(ADC_IT_EOC, ENABLE);

  49. #elif defined (SGL_MORE_MODE_EN)
  50.     cntSample = 0xFF; //转换次数为0xFF + 1次.
  51.     ADC_SingleChMoreModeCfg(&ADC_SingleChStructure, cntSample);
  52.         ADC_ITConfig(ADC_IT_EOC | ADC_IT_EOA, ENABLE);

  53. #elif defined (SGL_CONTINUOUS_MODE_EN)
  54.     ADC_SingleChContinuousModeCfg(&ADC_SingleChStructure);
  55.     ADC_ITConfig(ADC_IT_EOC, ENABLE);
  56. #else
  57.     #error "Please select ADC's running mode first in main.h!"   
  58. #endif

  59.     //ADC_ITConfig(ADC_IT_EOC | ADC_IT_EOA, ENABLE);
  60.     ADC_EnableIrq(ADC_INT_PRIORITY);
  61.     ADC_ClearITPendingAll();

  62.     //ADC使能
  63.     ADC_Enable();
  64.     ADC_SoftwareStartConvCmd(ENABLE);

  65.     while(1)
  66.     {
  67. #ifdef SGL_MORE_MODE_EN
  68.             while(!(gFlagIrq & ADC_ISR_EOA_Msk));
  69.             gFlagIrq = 0u;
  70.             ADC_GetAccResult(&valueAdcAcc);
  71.                        
  72.                 if(gCntEoc != (cntSample + 1))
  73.                 {
  74.                         PB08_SETHIGH();
  75.                         PB09_SETHIGH();
  76.                         while(1);        //error issue.
  77.                 }
  78.                 gCntEoc = 0u;

  79. #else
  80.         while(!(gFlagIrq & ADC_ISR_EOC_Msk));
  81.         gFlagIrq = 0u;
  82.         valueAdc = ADC_GetConversionValue();
  83. #endif

  84.         PB09_TOG();

  85. #ifndef SGL_CONTINUOUS_MODE_EN
  86.             ADC_SoftwareStartConvCmd(ENABLE);        //启动下一次ADC转换
  87. #endif

  88.     }

  89. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

551

主题

9987

帖子

24

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