[技术问答] 为何**作mini58的ADC寄存器全部是0.

[复制链接]
1271|6
 楼主| yyglucky 发表于 2017-8-13 15:40 | 显示全部楼层 |阅读模式
我在处理mini58的ADC,操作ADC->CHEN,ADC->STATUS,ADC->CTL几个寄存器都是0,我用的是Keil MDK5.23.
难道ADC的寄存器很特殊。
初始化
        CLK_EnableModuleClock(ADC_MODULE);
     CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADCSEL_HIRC,CLK_CLKDIV_ADC(5));//用的片内晶振。


/* Set P5.3 to ADC channel 0 input pin */
    SYS->P3_MFP |= SYS_MFP_P30_ADC_CH6;
                SYS->P3_MFP |= SYS_MFP_P31_ADC_CH7;
          SYS->P1_MFP |= SYS_MFP_P14_ADC_CH4;  
    /* To update the variable SystemCoreClock */
          P3->DINOFF |= (1 << 0) << GP_DINOFF_DINOFF6_Pos;
                P3->DINOFF |= (1 << 1) << GP_DINOFF_DINOFF7_Pos;
                P1->DINOFF |= (1 << 4) << GP_DINOFF_DINOFF4_Pos;
               
//        ADC->CHEN=BAadc_channel;
                switch(BAadc_channel)
                {
                        case 0:
                                        ADC->CHEN=0x01;
                                break;
                        case 1:
                                  ADC->CHEN=0x02;
                                break;
                        case 2:
                                  ADC->CHEN=0x04;
                                break;
                        case 3:
                                 ADC->CHEN=0x08;
                                break;
                        case 4:
                                 ADC->CHEN=0x10;
                                break;
                        case 5:
                                 ADC->CHEN=0x20;
                                break;
                        case 6:
                                 ADC->CHEN=0x40;
                                break;
                        case 7:
                                 ADC->CHEN=0x80;
                                break;
                        case 8:
                                 ADC->CHEN=0x180;
                                break;
                        default:
                                break;
                }
               
    // Power on ADC
    ADC_POWER_ON(ADC);
               
                //ADC_SET_INPUT_CHANNEL(ADC,BAadc_channel);
          ADC_EnableInt(ADC, ADC_ADIF_INT);
    NVIC_EnableIRQ(ADC_IRQn);
                  if(!ADC_IS_BUSY(ADC)) {
            ADC_START_CONV(ADC);
        }

无论怎么操作ADC->CHEN,ADC->STATUS,ADC->CTL几个寄存器都是0,请高手指点迷津



huangcunxiake 发表于 2017-8-13 19:37 | 显示全部楼层
不是很懂,你看看官方的例程吧,我都是看着改。
yiy 发表于 2017-8-14 21:30 | 显示全部楼层
  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: 2 $
  5. * $Date: 15/09/24 5:50p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate ADC function by repeatedly convert the input of ADC
  7. *           channel 5 (P1.5) and shows the result on UART console.
  8. *
  9. * @note
  10. * Copyright (C) 2015 Nuvoton Technology Corp. All rights reserved.
  11. *****************************************************************************/
  12. #include <stdio.h>
  13. #include "Mini51Series.h"

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

  17.     // Get ADC comparator interrupt flag
  18.     u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);

  19.     // Get ADC convert result
  20.     printf("Convert result is %x\n", (uint32_t)ADC_GET_CONVERSION_DATA(ADC, 0));

  21.     ADC_CLR_INT_FLAG(ADC, u32Flag);
  22. }


  23. void SYS_Init(void)
  24. {
  25.     /*---------------------------------------------------------------------------------------------------------*/
  26.     /* Init System Clock                                                                                       */
  27.     /*---------------------------------------------------------------------------------------------------------*/

  28.     /* Unlock protected registers */
  29.     SYS_UnlockReg();

  30.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  31.     SYS->P5_MFP = SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2;

  32.     /* Enable external 12MHz XTAL, HIRC */
  33.     CLK->PWRCON = CLK_PWRCON_OSC22M_EN_Msk | CLK_PWRCON_HXT;

  34.     /* Waiting for clock ready */
  35.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk | CLK_CLKSTATUS_XTL_STB_Msk);

  36.     /* Switch HCLK clock source to XTL */
  37.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_XTAL,CLK_CLKDIV_HCLK(1));

  38.     /* Enable IP clock */
  39.     CLK_EnableModuleClock(UART_MODULE);
  40.     CLK_EnableModuleClock(ADC_MODULE);

  41.     /* Select IP clock source */
  42.     CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_XTAL,CLK_CLKDIV_UART(1));
  43.     CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADC_S_XTAL,CLK_CLKDIV_ADC(6));

  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init I/O Multi-function                                                                                 */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Set P0 multi-function pins for UART RXD, TXD */
  48.     SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;

  49.     /* Set P1 multi-function pin ADC channel 5 input*/
  50.     SYS->P1_MFP = SYS_MFP_P15_AIN5;

  51.     /* Analog pin OFFD to prevent leakage */
  52.     P1->OFFD |= (1 << 5) << GPIO_OFFD_OFFD_Pos;

  53.     /* To update the variable SystemCoreClock */
  54.     SystemCoreClockUpdate();

  55.     /* Lock protected registers */
  56.     SYS_LockReg();
  57. }

  58. int32_t main (void)
  59. {
  60.     /* Init System, IP clock and multi-function I/O
  61.        In the end of SYS_Init() will issue SYS_LockReg()
  62.        to lock protected register. If user want to write
  63.        protected register, please issue SYS_UnlockReg()
  64.        to unlock protected register if necessary */
  65.     SYS_Init();

  66.     /* Init UART to 115200-8n1 for print message */
  67.     UART_Open(UART0, 115200);

  68.     printf("\nThis sample code demonstrate ADC channel 5 conversion and printf the result on UART\n");

  69.     // Enable channel 5
  70.     ADC_Open(ADC, 0, 0, 0x01 << 5);

  71.     // Power on ADC
  72.     ADC_POWER_ON(ADC);


  73.     // Enable ADC convert complete interrupt
  74.     ADC_EnableInt(ADC, ADC_ADF_INT);
  75.     NVIC_EnableIRQ(ADC_IRQn);

  76.     while(1) {
  77.         // Trigger ADC conversion if it is idle
  78.         if(!ADC_IS_BUSY(ADC)) {
  79.             ADC_START_CONV(ADC);
  80.         }
  81.     }

  82. }

  83. /*** (C) COPYRIGHT 2015 Nuvoton Technology Corp. ***/

yiy 发表于 2017-8-14 21:30 | 显示全部楼层

  1. /******************************************************************************
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Revision: 6 $
  5. * $Date: 15/10/06 1:19p $
  6. * @brief    Demonstrate ADC conversion and comparison function by monitoring
  7. *           the conversion result of channel 0.
  8. *
  9. * @note
  10. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  11. *****************************************************************************/
  12. #include <stdio.h>
  13. #include "Mini51Series.h"


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

  17.     // Get ADC comparator interrupt flag
  18.     u32Flag = ADC_GET_INT_FLAG(ADC, ADC_CMP0_INT | ADC_CMP1_INT);

  19.     if(u32Flag & ADC_CMP0_INT)
  20.         printf("Channel 0 input < 0x200\n");
  21.     if(u32Flag & ADC_CMP1_INT)
  22.         printf("Channel 0 input >= 0x200\n");

  23.     ADC_CLR_INT_FLAG(ADC, u32Flag);
  24. }


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

  30.     /* Unlock protected registers */
  31.     SYS_UnlockReg();

  32.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  33.     SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
  34.     SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

  35.     /* Enable external 12MHz XTAL (UART), internal 22.1184MHz */
  36.     CLK->PWRCON = CLK_PWRCON_XTL12M | CLK_PWRCON_IRC22M_EN_Msk;

  37.     /* Waiting for clock ready */
  38.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

  39.     /* Enable UART and ADC clock */
  40.     CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_ADC_EN_Msk;

  41.     /* Select UART clock source from external crystal*/
  42.     CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_XTAL;

  43.     /* ADC clock source is 22.1184MHz, set divider to (3 + 1), ADC clock is 22.1184/4 MHz */
  44.     CLK->CLKDIV |= (3 << CLK_CLKDIV_ADC_N_Pos);

  45.     /* Update System Core Clock */
  46.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and CycylesPerUs automatically. */
  47.     SystemCoreClockUpdate();


  48.     /*---------------------------------------------------------------------------------------------------------*/
  49.     /* Init I/O Multi-function                                                                                 */
  50.     /*---------------------------------------------------------------------------------------------------------*/
  51.     /* Set P1 multi-function pins for UART RXD, TXD */
  52.     SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;

  53.     /* Set P5.3 to ADC channel 0 input pin */
  54.     SYS->P5_MFP = SYS_MFP_P53_AIN0;
  55.     /* Analog pin OFFD to prevent leakage */
  56.     P5->OFFD |= (1 << 3) << GPIO_OFFD_OFFD_Pos;

  57.     /* Lock protected registers */
  58.     SYS_LockReg();
  59. }


  60. int32_t main (void)
  61. {
  62.     /* Init System, IP clock and multi-function I/O
  63.        In the end of SYS_Init() will issue SYS_LockReg()
  64.        to lock protected register. If user want to write
  65.        protected register, please issue SYS_UnlockReg()
  66.        to unlock protected register if necessary */
  67.     SYS_Init();

  68.     /* Init UART to 115200-8n1 for print message */
  69.     UART_Open(UART, 115200);

  70.     printf("\nThis sample code demonstrate ADC conversion and comparison function\n");
  71.     printf("by monitoring the conversion result of channel 0 (P5.3)\n");

  72.     // Enable channel 0
  73.     ADC_Open(ADC, 0, 0, 0x01);

  74.     // Power on ADC
  75.     ADC_POWER_ON(ADC);

  76.     // Configure and enable Comparator 0 to monitor channel 0 input less than 0x200
  77.     ADC_ENABLE_CMP0(ADC, 0, ADC_CMP_LESS_THAN, 0x200, 16);
  78.     // Configure and enable Comparator 1 to monitor channel 0 input greater or equal to 0x200
  79.     ADC_ENABLE_CMP1(ADC, 0, ADC_CMP_GREATER_OR_EQUAL_TO, 0x200, 16);

  80.     // Enable ADC comparator 0 and 1 interrupt
  81.     ADC_EnableInt(ADC, ADC_CMP0_INT);
  82.     ADC_EnableInt(ADC, ADC_CMP1_INT);
  83.     NVIC_EnableIRQ(ADC_IRQn);

  84.     while(1) {
  85.         // Trigger ADC conversion if it is idle
  86.         if(!ADC_IS_BUSY(ADC)) {
  87.             ADC_START_CONV(ADC);
  88.         }
  89.     }

  90. }

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

huangcunxiake 发表于 2017-8-14 22:11 | 显示全部楼层
不要使用寄存器搞。
21mengnan 发表于 2017-8-14 22:31 | 显示全部楼层
mini51好像可以用PIN tool配置管脚
21mengnan 发表于 2017-8-14 22:32 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

260

帖子

3

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