[demo程序] NV32F100x 库文件adc.c中文注释

[复制链接]
1171|0
 楼主| jp_chen 发表于 2017-7-26 16:39 | 显示全部楼层 |阅读模式
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] providing APIs for configuring ADC module (ADC).
  3. *
  4. *******************************************************************************
  5. *
  6. * provide APIs for configuring ADC module (ADC)
  7. ******************************************************************************/
  8. #include "common.h"
  9. #include "adc.h"
  10. /******************************************************************************
  11. * Local function
  12. ******************************************************************************/
  13. ADC_CallbackType ADC_Callback[1] = {NULL};
  14. /******************************************************************************
  15. * Local variables
  16. ******************************************************************************/

  17. /******************************************************************************
  18. * Local function prototypes
  19. ******************************************************************************/

  20. /******************************************************************************
  21. * define ADC APIs
  22. *
  23. *//*! @addtogroup adc_api_list
  24. * @{
  25. *******************************************************************************/

  26. /*****************************************************************************//**
  27. *
  28. * @初始化ADC模块
  29. *
  30. * @输入       pADC   指向ADC模块的基址.
  31. * @输入       pADC   指向ADC配置参数的结构体.
  32. *
  33. * @无返回
  34. *
  35. *****************************************************************************/
  36. void ADC_Init(ADC_Type *pADC, ADC_ConfigTypePtr  pADC_Config)
  37. {
  38.     if( pADC == ADC)
  39.     {
  40.         SIM->SCGC |= SIM_SCGC_ADC_MASK;//选通ADC时钟
  41.     }

  42.     /* 设置ADC模块的时钟源 */
  43.     ADC_SelectClock(pADC,pADC_Config->u8ClockSource);

  44.     /* 设置时钟分频系数*/
  45.     ADC_SelectClockDivide(pADC,pADC_Config->u8ClockDiv);

  46.     /* 设置转换模式 */
  47.     ADC_SetMode(pADC,pADC_Config->u8Mode);

  48.     /* 设置FIFO深度 */
  49.     ADC_SetFifoLevel(pADC,pADC_Config->u8FiFoLevel);

  50.     /* 设置引脚控制 */
  51.     pADC->APCTL1 = pADC_Config->u16PinControl;//引脚控制1寄存器的设置

  52.     if( pADC_Config->sSetting.bCompareEn )
  53.     {
  54.         ADC_CompareEnable(pADC);//ADC比较功能使能
  55.     }
  56.    
  57.     if( pADC_Config->sSetting.bCompareGreaterEn )
  58.     {
  59.         ADC_CompareGreaterFunction(pADC);//输入大于或等于比较电平时,比较触发
  60.     }
  61.         
  62.     if( pADC_Config->sSetting.bContinuousEn )
  63.     {
  64.         ADC_ContinuousConversion(pADC);//使能ADC连续转换
  65.     }
  66.         
  67.     if( pADC_Config->sSetting.bCompareAndEn )
  68.     {
  69.         ADC_CompareFifoAnd(pADC);//比较功能选择,对所有比较触发作“与”运算
  70.     }
  71.    
  72.     if( pADC_Config->sSetting.bFiFoScanModeEn )
  73.     {
  74.         ADC_FifoScanModeEnable(pADC);//FIFO扫描模式使能
  75.     }
  76.    
  77.     if( pADC_Config->sSetting.bHardwareTriggerEn )
  78.     {
  79.         ADC_SetHardwareTrigger(pADC);//选择硬件触发
  80.     }

  81.     if( pADC_Config->sSetting.bIntEn )
  82.     {
  83.         ADC_IntEnable(pADC);//转换完成中断使能                               
  84.         NVIC_EnableIRQ( ADC0_IRQn );//开启ADC的IRQ中断
  85.     }

  86.     if( pADC_Config->sSetting.bLongSampleEn )
  87.     {
  88.         ADC_SetLongSample(pADC);//配置为长时间采样
  89.     }

  90.     if( pADC_Config->sSetting.bLowPowerEn )
  91.     {
  92.         ADC_SetLowPower(pADC);//进行低功耗配置
  93.     }


  94. #if !defined(CPU_NV32)

  95.     if( pADC_Config->sSetting.bHTRGMEn )
  96.     {
  97.         ADC_HardwareTriggerMultiple(pADC);
  98.     }
  99.     else
  100.     {
  101.                 ADC_HardwareTriggerSingle(pADC);
  102.     }
  103.     if( pADC_Config->sSetting.bHTRGMASKEn )
  104.     {
  105.         ADC_HardwareTriggerMaskEnable(pADC);
  106.     }
  107.     else
  108.     {
  109.                 ADC_HardwareTriggerMaskDisable(pADC);
  110.     }
  111.     if( pADC_Config->sSetting.bHTRGMASKSEL )
  112.     {
  113.         ADC_HardwareTriggerMaskAuto(pADC);
  114.     }
  115.     else
  116.     {
  117.                 ADC_HardwareTriggerMaskNonAuto(pADC);
  118.     }
  119. #endif
  120. }

  121. /*****************************************************************************//*!
  122. *
  123. * @还原ADC到默认值.
  124. *        
  125. * @输入     指向ADC模块的基址.
  126. *
  127. * @无返回.
  128. *
  129. *****************************************************************************/
  130. void ADC_DeInit( ADC_Type *pADC )
  131. {
  132.     ADC_SetChannel(pADC,ADC_CHANNEL_DISABLE);

  133.     SIM->SCGC &= ~SIM_SCGC_ADC_MASK;
  134. }
  135. /*****************************************************************************//*!
  136. *
  137. * @进行ADC转换,并返回转换结果
  138. *        
  139. * @输入        指向ADC模块的基址.
  140. * @输入        选择ADC通道进行转换,并返回转换结果.
  141. *
  142. * @返回ADC转换结果.
  143. *
  144. *****************************************************************************/
  145. unsigned int ADC_PollRead( ADC_Type *pADC, uint8_t u8Channel )
  146. {
  147.                 ADC_SetChannel(pADC,u8Channel);//进行通道
  148.                 while( !ADC_IsCOCOFlag(pADC) );//转换完成标志,转换完成则跳出while循环
  149.                 return ADC_ReadResultReg(pADC);//返回转换结果
  150. }

  151. /*****************************************************************************//*!
  152. *
  153. * @中断回调操作.
  154. *        
  155. * @输入       pADC_CallBack   指向ADC回调地址
  156. *
  157. * @无返回.
  158. *
  159. *****************************************************************************/
  160. void ADC_SetCallBack(ADC_CallbackType pADC_CallBack)
  161. {
  162.     ADC_Callback[0] = pADC_CallBack;
  163. }
  164. /*****************************************************************************//*!
  165. *
  166. * @设置ADC通道.
  167. *        
  168. * @输入      指向ADC模块的基址.
  169. * @输入      ADC通道的选择.
  170. *
  171. * @无返回
  172. *
  173. *****************************************************************************/
  174. void ADC_SetChannel( ADC_Type *pADC, uint8_t u8Channel )
  175. {
  176.     uint32_t u32temp;   
  177.     u32temp = pADC->SC1;
  178.     u32temp &= ~ADC_SC1_ADCH_MASK;
  179.     pADC->SC1 = u32temp|ADC_SC1_ADCH(u8Channel);      
  180. }
  181. /*****************************************************************************//*!
  182. *
  183. * @基准电压源的选择.
  184. *        
  185. * @输入      pADC       指向ADC模块的基址.
  186. * @输入      u8Vref adc   参考电压选择.
  187. *
  188. * @无返回
  189. *
  190. *****************************************************************************/
  191. void ADC_VrefSelect( ADC_Type *pADC, uint8_t u8Vref )
  192. {
  193.     uint32_t u32Temp;
  194.     u32Temp = pADC->SC2;
  195.     u32Temp &= ~ADC_SC2_REFSEL_MASK;
  196.     pADC->SC2 = u32Temp|ADC_SC2_REFSEL(u8Vref);
  197. }

  198. /*****************************************************************************//*!
  199. *
  200. * @选择时钟分频系数
  201. *        
  202. * @输入        指向ADC模块的基址.
  203. * @输入        选择时钟分频.
  204. *
  205. * @无返回
  206. *
  207. *****************************************************************************/
  208. void ADC_SelectClockDivide( ADC_Type *pADC, uint8_t u8Div )
  209. {
  210.     uint32_t u32Temp;
  211.     u32Temp = pADC->SC3;
  212.     u32Temp &= ~ADC_SC3_ADIV_MASK;
  213.     pADC->SC3 = u32Temp|ADC_SC3_ADIV(u8Div);
  214. }

  215. /*****************************************************************************//*!
  216. *
  217. * @设置ADC转换模式.
  218. *        
  219. * @输入       指向ADC模块的基址.
  220. * @输入       转换模式选择.
  221. *
  222. * @无返回
  223. *
  224. *****************************************************************************/
  225. void ADC_SetMode( ADC_Type *pADC, uint8_t u8Mode )
  226. {
  227.     uint32_t u32Temp;
  228.     u32Temp = pADC->SC3;
  229.     u32Temp &= ~ADC_SC3_MODE_MASK;
  230.     pADC->SC3 = u32Temp|ADC_SC3_MODE(u8Mode);
  231. }
  232. /*****************************************************************************//*!
  233. *
  234. * @输入时钟选择.
  235. *        
  236. * @输入       指向ADC模块的基址.
  237. * @输入       0x00:总线时钟; 0x01:总线时钟2分频;
  238. *              0x02:备用时钟ALTCLK;0x03:异步时钟ADACK         
  239. *
  240. * @无返回
  241. *
  242. *****************************************************************************/
  243. void ADC_SelectClock( ADC_Type *pADC, uint8_t u8Clock )
  244. {
  245.     uint32_t u32Temp;
  246.     u32Temp = pADC->SC3;
  247.     u32Temp &= ~ADC_SC3_ADICLK_MASK;
  248.     pADC->SC3 = u32Temp|ADC_SC3_ADICLK(u8Clock);
  249. }
  250. /*****************************************************************************//*!
  251. *
  252. * @设置FIFO深度并进行使能选择
  253. *        
  254. * @输入       指向ADC模块的基址.
  255. * @输入       设置选择FIFO深度.
  256. *
  257. * @无返回
  258. *
  259. *****************************************************************************/
  260. void ADC_SetFifoLevel( ADC_Type *pADC, uint8_t u8FifoLevel )
  261. {
  262.     uint32_t u32Temp;
  263.     u32Temp = pADC->SC4;
  264.     u32Temp &= ~ADC_SC4_AFDEP_MASK;
  265.     pADC->SC4 = u32Temp|ADC_SC4_AFDEP(u8FifoLevel);
  266. }

  267. /*! @} End of adc_api_list                                                                                               */


  268. /*****************************************************************************//*!
  269. *
  270. * @中断服务程序ISR
  271. *        
  272. * @无返回
  273. *
  274. *****************************************************************************/
  275. void ADC_Isr(void)
  276. {
  277.     if( ADC_Callback[0] )
  278.     {
  279.         ADC_Callback[0]();
  280.     }
  281. }
















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

本版积分规则

20

主题

113

帖子

0

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