[DemoCode下载] NUC230的ADC模块

[复制链接]
 楼主| zhuotuzi 发表于 2019-4-12 22:22 | 显示全部楼层 |阅读模式
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V2.0
  4. * $Revision: 2 $
  5. * $Date: 15/04/10 4:41p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC230_240 Series ADC Interface Controller Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "NUC230_240.h"


  14. #define PLL_CLOCK       72000000

  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* Define Function Prototypes                                                                              */
  17. /*---------------------------------------------------------------------------------------------------------*/
  18. void SYS_Init(void);
  19. void UART0_Init(void);
  20. void AdcSingleModeTest(void);


  21. /*---------------------------------------------------------------------------------------------------------*/
  22. /* Define global variables and constants                                                                   */
  23. /*---------------------------------------------------------------------------------------------------------*/
  24. volatile uint32_t g_u32AdcIntFlag;


  25. void SYS_Init(void)
  26. {
  27.     /*---------------------------------------------------------------------------------------------------------*/
  28.     /* Init System Clock                                                                                       */
  29.     /*---------------------------------------------------------------------------------------------------------*/

  30.     /* Enable Internal RC 22.1184MHz clock */
  31.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  32.     /* Waiting for Internal RC clock ready */
  33.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  34.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  35.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  36.     /* Enable external XTAL 12MHz clock */
  37.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  38.     /* Waiting for external XTAL clock ready */
  39.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  40.     /* Set core clock as PLL_CLOCK from PLL */
  41.     CLK_SetCoreClock(PLL_CLOCK);

  42.     /* Enable UART module clock */
  43.     CLK_EnableModuleClock(UART0_MODULE);

  44.     /* Enable ADC module clock */
  45.     CLK_EnableModuleClock(ADC_MODULE);

  46.     /* Select UART module clock source */
  47.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

  48.     /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */
  49.     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));

  50.     /*---------------------------------------------------------------------------------------------------------*/
  51.     /* Init I/O Multi-function                                                                                 */
  52.     /*---------------------------------------------------------------------------------------------------------*/

  53.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  54.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  55.     SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  56.     /* Disable the GPA0 - GPA3 digital input path to avoid the leakage current. */
  57.     GPIO_DISABLE_DIGITAL_PATH(PA, 0xF);

  58.     /* Configure the GPA0 - GPA3 ADC analog input pins */
  59.     SYS->GPA_MFP &= ~(SYS_GPA_MFP_PA0_Msk | SYS_GPA_MFP_PA1_Msk | SYS_GPA_MFP_PA2_Msk | SYS_GPA_MFP_PA3_Msk) ;
  60.     SYS->GPA_MFP |= SYS_GPA_MFP_PA0_ADC0 | SYS_GPA_MFP_PA1_ADC1 | SYS_GPA_MFP_PA2_ADC2 | SYS_GPA_MFP_PA3_ADC3 ;
  61.     SYS->ALT_MFP1 = 0;

  62. }

  63. /*---------------------------------------------------------------------------------------------------------*/
  64. /* Init UART                                                                                               */
  65. /*---------------------------------------------------------------------------------------------------------*/
  66. void UART0_Init()
  67. {
  68.     /* Reset IP */
  69.     SYS_ResetModule(UART0_RST);

  70.     /* Configure UART0 and set UART0 Baudrate */
  71.     UART_Open(UART0, 115200);
  72. }

  73. /*---------------------------------------------------------------------------------------------------------*/
  74. /* Function: AdcSingleModeTest                                                                             */
  75. /*                                                                                                         */
  76. /* Parameters:                                                                                             */
  77. /*   None.                                                                                                 */
  78. /*                                                                                                         */
  79. /* Returns:                                                                                                */
  80. /*   None.                                                                                                 */
  81. /*                                                                                                         */
  82. /* Description:                                                                                            */
  83. /*   ADC single mode test.                                                                                 */
  84. /*---------------------------------------------------------------------------------------------------------*/
  85. void AdcSingleModeTest()
  86. {
  87.     uint8_t  u8Option;
  88.     int32_t  i32ConversionData;

  89.     printf("\n");
  90.     printf("+----------------------------------------------------------------------+\n");
  91.     printf("|                      ADC single mode sample code                     |\n");
  92.     printf("+----------------------------------------------------------------------+\n");

  93.     while(1) {
  94.         printf("Select input mode:\n");
  95.         printf("  [1] Single end input (channel 2 only)\n");
  96.         printf("  [2] Differential input (channel pair 1 only)\n");
  97.         printf("  Other keys: exit single mode test\n");
  98.         u8Option = getchar();
  99.         if(u8Option == '1') {

  100.             /* Set the ADC operation mode as single, input mode as single-end and enable the analog input channel 2 */
  101.             ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE, 0x1 << 2);

  102.             /* Power on ADC module */
  103.             ADC_POWER_ON(ADC);

  104.             /* Clear the A/D interrupt flag for safe */
  105.             ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  106.             /* Enable the ADC interrupt */
  107.             ADC_EnableInt(ADC, ADC_ADF_INT);
  108.             NVIC_EnableIRQ(ADC_IRQn);

  109.             /* Reset the ADC interrupt indicator and Start A/D conversion */
  110.             g_u32AdcIntFlag = 0;

  111.             ADC_START_CONV(ADC);

  112.             /* Wait ADC interrupt (g_u32AdcIntFlag will be set at IRQ_Handler function)*/
  113.             while(g_u32AdcIntFlag == 0);

  114.             /* Disable the ADC interrupt */
  115.             ADC_DisableInt(ADC, ADC_ADF_INT);

  116.             /* Get the conversion result of the ADC channel 2 */
  117.             i32ConversionData = ADC_GET_CONVERSION_DATA(ADC, 2);
  118.             printf("Conversion result of channel 2: 0x%X (%d)\n\n", i32ConversionData, i32ConversionData);
  119.         } else if(u8Option == '2') {

  120.             /* Set the ADC operation mode as single, input mode as differential and
  121.                enable analog input channel 2 for differential input channel pair 1 */
  122.             ADC_Open(ADC, ADC_ADCR_DIFFEN_DIFFERENTIAL, ADC_ADCR_ADMD_SINGLE, 0x1 << 2);

  123.             /* Power on ADC module */
  124.             ADC_POWER_ON(ADC);

  125.             /* Clear the A/D interrupt flag for safe */
  126.             ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  127.             /* Enable the ADC interrupt */
  128.             ADC_EnableInt(ADC, ADC_ADF_INT);
  129.             NVIC_EnableIRQ(ADC_IRQn);

  130.             /* Reset the ADC interrupt indicator and Start A/D conversion */
  131.             g_u32AdcIntFlag = 0;
  132.             ADC_START_CONV(ADC);

  133.             /* Wait ADC interrupt (g_u32AdcIntFlag will be set at IRQ_Handler function)*/
  134.             while(g_u32AdcIntFlag == 0);

  135.             /* Disable the ADC interrupt */
  136.             ADC_DisableInt(ADC, ADC_ADF_INT);

  137.             /* Get the conversion result of the specified ADC channel */
  138.             i32ConversionData = ADC_GET_CONVERSION_DATA(ADC, 2);
  139.             printf("Conversion result of channel pair 1: 0x%X (%d)\n\n", i32ConversionData, i32ConversionData);
  140.         } else
  141.             return ;

  142.     }
  143. }



  144. /*---------------------------------------------------------------------------------------------------------*/
  145. /* ADC interrupt handler                                                                                   */
  146. /*---------------------------------------------------------------------------------------------------------*/
  147. void ADC_IRQHandler(void)
  148. {
  149.     g_u32AdcIntFlag = 1;
  150.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT); /* clear the A/D conversion flag */
  151. }

  152. /*---------------------------------------------------------------------------------------------------------*/
  153. /* MAIN function                                                                                           */
  154. /*---------------------------------------------------------------------------------------------------------*/

  155. main(void)
  156. {

  157.     /* Unlock protected registers */
  158.     SYS_UnlockReg();

  159.     /* Init System, IP clock and multi-function I/O */
  160.     SYS_Init();

  161.     /* Lock protected registers */
  162.     SYS_LockReg();

  163.     /* Init UART0 for printf */
  164.     UART0_Init();

  165.     /*---------------------------------------------------------------------------------------------------------*/
  166.     /* SAMPLE CODE                                                                                             */
  167.     /*---------------------------------------------------------------------------------------------------------*/

  168.     printf("\nSystem clock rate: %d Hz", SystemCoreClock);

  169.     /* Single Mode test */
  170.     AdcSingleModeTest();

  171.     /* Disable ADC module */
  172.     ADC_Close(ADC);

  173.     /* Disable ADC IP clock */
  174.     CLK_DisableModuleClock(ADC_MODULE);

  175.     /* Disable External Interrupt */
  176.     NVIC_DisableIRQ(ADC_IRQn);

  177.     printf("\nExit ADC sample code\n");

  178.     while(1);

  179. }





 楼主| zhuotuzi 发表于 2019-4-12 22:23 | 显示全部楼层
我们看到这个配置跟其他系列是一样的,而且ADC模块是有自己的电源开关,可以不用的时候关闭实现低功耗。
 楼主| zhuotuzi 发表于 2019-4-12 22:24 | 显示全部楼层
如果不用ADC直接
ADC_POWER_DOWN(adc)
 楼主| zhuotuzi 发表于 2019-4-12 22:57 | 显示全部楼层
好多设置其实都是一样 ,比如这个例子中的两个情况。
zhuomuniao110 发表于 2019-4-13 16:47 | 显示全部楼层
新唐的ADC设计非常合理
heisexingqisi 发表于 2019-4-14 21:07 | 显示全部楼层
230支持LCDMA
734774645 发表于 2019-4-15 11:27 | 显示全部楼层
NUC系列的非常好用
huangcunxiake 发表于 2019-4-15 19:01 | 显示全部楼层
新唐系列 单片机大部分库函数都是一致的。
幸福小强 发表于 2019-4-15 23:13 | 显示全部楼层
有了这个可以省好几块钱的ADC了
玛尼玛尼哄 发表于 2019-4-16 00:31 | 显示全部楼层
新唐的性价比很不错。130的支持LCD。
mintspring 发表于 2019-4-16 00:41 | 显示全部楼层
库函数做的好,可以方便移植到其他系列。
operating 发表于 2019-4-16 16:09 | 显示全部楼层
感谢分享!学习一下。
稳稳の幸福 发表于 2019-4-16 23:32 | 显示全部楼层
PLL用的是外部时钟?
xinxianshi 发表于 2019-4-17 13:26 | 显示全部楼层
ADC的常用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

3368

帖子

7

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