[DemoCode下载] NANO100系列的ADC参考电压选择

[复制链接]
766|10
 楼主| yiy 发表于 2020-5-13 21:52 | 显示全部楼层 |阅读模式
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url] Set the reference voltage selection.
  3.   * @param[in] adc Base address of ADC module
  4.   * @param[in] u32Ref The reference voltage selection. Valid values are:
  5.   *                 - \ref ADC_REFSEL_POWER
  6.   *                 - \ref ADC_REFSEL_INT_VREF
  7.   *                 - \ref ADC_REFSEL_VREF
  8.   * [url=home.php?mod=space&uid=266161]@return[/url] None
  9.   * \hideinitializer
  10.   */
  11. #define ADC_SET_REF_VOLTAGE(adc, u32Ref) (ADC->CR = (ADC->CR & ~ADC_CR_REFSEL_Msk) | u32Ref)
那个例子中的是出自这个文件。

 楼主| yiy 发表于 2020-5-13 21:53 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 10 $
  5. * $Date: 15/06/16 7:22p $
  6. * @brief    Convert ADC channel 0, 1, 2 in Continuous Scan mode and print conversion results.
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"

  13. volatile uint8_t u8ADF;

  14. void ADC_IRQHandler(void);

  15. void ADC_IRQHandler(void)
  16. {
  17.     uint32_t u32Flag;

  18.     // Get ADC conversion finish interrupt flag
  19.     u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);

  20.     if(u32Flag & ADC_ADF_INT)
  21.     {
  22.         uint32_t u32Result;

  23.         u32Result = ADC_GET_CONVERSION_DATA(ADC, 0);
  24.         printf("Channel 0 conversion result is 0x%x\n",u32Result);
  25.         u32Result = ADC_GET_CONVERSION_DATA(ADC, 1);
  26.         printf("Channel 1 conversion result is 0x%x\n",u32Result);
  27.         u32Result = ADC_GET_CONVERSION_DATA(ADC, 2);
  28.         printf("Channel 2 conversion result is 0x%x\n",u32Result);
  29.     }

  30.     ADC_CLR_INT_FLAG(ADC, u32Flag);
  31. }

  32. /*---------------------------------------------------------------------------------------------------------*/
  33. /* Init System Clock                                                                                       */
  34. /*---------------------------------------------------------------------------------------------------------*/
  35. void SYS_Init(void)
  36. {
  37.     /* Unlock protected registers */
  38.     SYS_UnlockReg();

  39.     /* Set HCLK source form HXT and HCLK source divide 1  */
  40.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT,CLK_HCLK_CLK_DIVIDER(1));

  41.     /* Enable external 12MHz HXT, 32KHz LXT and HIRC */
  42.     CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk | CLK_PWRCTL_LXT_EN_Msk | CLK_PWRCTL_HIRC_EN_Msk);

  43.     /* Waiting for clock ready */
  44.     CLK_WaitClockReady(CLK_CLKSTATUS_HXT_STB_Msk | CLK_CLKSTATUS_LXT_STB_Msk | CLK_CLKSTATUS_HIRC_STB_Msk);

  45.     /*  Set HCLK frequency 42MHz */
  46.     CLK_SetCoreClock(42000000);

  47.     /* Enable IP clock */
  48.     CLK_EnableModuleClock(UART0_MODULE);

  49.     /* Enable ADC clock */
  50.     CLK_EnableModuleClock(ADC_MODULE);

  51.     /* Select IP clock source */
  52.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_HXT,CLK_UART_CLK_DIVIDER(1));

  53.     /*---------------------------------------------------------------------------------------------------------*/
  54.     /* Init I/O Multi-function                                                                                 */
  55.     /*---------------------------------------------------------------------------------------------------------*/
  56.     /* Set PA multi-function pins for UART0 RXD and TXD */
  57.     SYS->PB_L_MFP &= ~( SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
  58.     SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB0_MFP_UART0_RX | SYS_PB_L_MFP_PB1_MFP_UART0_TX );

  59.     /* Set PB multi-function pins for Clock Output */
  60.     SYS->PB_H_MFP = ( SYS->PB_H_MFP & ~SYS_PB_H_MFP_PB12_MFP_Msk ) |  SYS_PB_H_MFP_PB12_MFP_CKO;

  61.     /* Set PA multi-function pins for ADC */
  62.     SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA0_MFP_Msk | SYS_PA_L_MFP_PA1_MFP_Msk | SYS_PA_L_MFP_PA2_MFP_Msk);
  63.     SYS->PA_L_MFP |= SYS_PA_L_MFP_PA0_MFP_ADC_CH0 | SYS_PA_L_MFP_PA1_MFP_ADC_CH1 | SYS_PA_L_MFP_PA2_MFP_ADC_CH2;

  64.     /* Disable PA.0 PA.1 PA.2 digital input path */
  65.     PA->OFFD |= (((1<<0)|(1<<1)|(1<<2)) << GP_OFFD_OFFD_Pos);

  66.     /* Lock protected registers */
  67.     SYS_LockReg();
  68. }

  69. void UART0_Init()
  70. {
  71.     /*---------------------------------------------------------------------------------------------------------*/
  72.     /* Init UART                                                                                               */
  73.     /*---------------------------------------------------------------------------------------------------------*/
  74.     UART_Open(UART0, 115200);
  75. }

  76. int32_t main (void)
  77. {
  78.     /* Init System, IP clock and multi-function I/O
  79.        In the end of SYS_Init() will issue SYS_LockReg()
  80.        to lock protected register. If user want to write
  81.        protected register, please issue SYS_UnlockReg()
  82.        to unlock protected register if necessary */
  83.     SYS_Init();

  84.     /* Init UART0 for printf */
  85.     UART0_Init();

  86.     printf("\nThis sample code demonstrate ADC continuous scan conversion\n");
  87.     printf("It convert channel 0,1,2 continuously and print conversion result\n");

  88.     // Enable channel 0,1,2
  89.     ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_CONTINUOUS, (ADC_CH_0_MASK | ADC_CH_1_MASK | ADC_CH_2_MASK));

  90.     // Set reference voltage to AVDD
  91.     ADC_SET_REF_VOLTAGE(ADC, ADC_REFSEL_POWER);

  92.     // Power on ADC
  93.     ADC_POWER_ON(ADC);

  94.     // Enable ADC ADC_IF interrupt
  95.     ADC_EnableInt(ADC, ADC_ADF_INT);
  96.     NVIC_EnableIRQ(ADC_IRQn);

  97.     ADC_START_CONV(ADC);

  98.     while(1);
  99. }

  100. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


 楼主| yiy 发表于 2020-5-13 22:01 | 显示全部楼层
而其他系列的跟这个不同。其他的这个设置是在SYS_T结构体成员里。
 楼主| yiy 发表于 2020-5-13 22:03 | 显示全部楼层
意在使能ADC功能之前,这些用作ADC模拟输入的IO口必须被设置成输入模式,并且要关闭数字功能(GPIOA_OFFD) 。
 楼主| yiy 发表于 2020-5-13 22:05 | 显示全部楼层
115045ebbfe94071bf.png
NANO系列的VREF选择有限。所以库函数不同。
wahahaheihei 发表于 2020-5-20 22:55 | 显示全部楼层
主函数需要一个返回值吧
643757107 发表于 2020-5-20 23:15 | 显示全部楼层
原来如此啊,以为所有系统都统一呢。
598330983 发表于 2020-5-21 15:49 | 显示全部楼层
这个贴很有货
zhuomuniao110 发表于 2020-5-24 21:23 | 显示全部楼层
很不错,以后用的时候要注意了。
xinxianshi 发表于 2020-5-24 21:27 | 显示全部楼层
不是同一个时期的芯片
zhuotuzi 发表于 2020-5-25 14:49 | 显示全部楼层
总结的不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

yiy

114

主题

1954

帖子

4

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