本帖最后由 缥缈九哥 于 2012-9-14 12:07 编辑
- /**************************************************
- ** 文件名称:NUC120_HOT_ADC.c
- ** 文件说明:NUC120助学板练习程序
- ** 创建日期:2011-03-30
- ** 修改日期:
- ** 备 注:ADC程序练习
- **************************************************/
- #include <stdio.h>
- #include "NUC1xx.h"
- #include "Driver\DrvGPIO.h"
- #include "Driver\DrvSYS.h"
- #include "Driver\DrvUART.h"
- #include "Driver\DrvADC.h"
- #define Run_Led 2 //2----LED1 3----LED2 4----LED3 5----LED4
- #define IDLE 0
- #define BUSY 1
- uint8_t ADC_Status = IDLE;
- uint8_t ADC_Cnt = 0;
- /***************
- ** 函数声明 **
- ***************/
- void Init_System (void);
- void Init_Uart (void);
- void UART_INT_HANDLE(uint32_t u32IntStatus);
- /*****************************
- ** Name: UART_INT_HANDLE
- ** Function: UART Callback function
- ** Input: u32IntStatus
- ** OutPut: None
- ** Data: 2011-03-17
- ** Note:
- ****************************/
- void UART_INT_HANDLE(uint32_t u32IntStatus)
- {
- uint8_t bInChar[1]={0xFF};
- if(u32IntStatus & DRVUART_RDAINT)
- {
- /* Get all the input characters */
- while(UART0->ISR.RDA_IF==1)
- {
- /* Get the character from UART Buffer */
- DrvUART_Read(UART_PORT0,bInChar,1);
- if ((ADC_Status==IDLE)&&(bInChar[0]<='9')&&(bInChar[0]>'0'))
- {
- ADC_Status = BUSY;
- ADC_Cnt = (bInChar[0]-0x30);
- }
- }
- }
- }
- /*****************************
- ** Name: Init_System
- ** Function: 系统初始化函数
- ** Input: None
- ** OutPut: None
- ** Data: 2011-03-17
- ** Note:
- ****************************/
- void Init_System(void)
- {
- /* Unlock the locked registers before access */
- UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
- //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
- /* Enable the 12MHz oscillator oscillation */
- DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->WRCON.XTL12M_EN = 1;
- /* Waiting for 12M Xtal stable */
- //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
- /*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
- // Note: Only some of NuMicro NUC100 Series support this function.
- DrvSYS_Delay(5000);
- LOCKREG(x);
- //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
- }
- /*****************************
- ** Name: Init_Uart
- ** Function: UART初始化函数
- ** Input: None
- ** OutPut: None
- ** Data: 2011-03-17
- ** Note:
- ****************************/
- void Init_Uart(void)
- {
- STR_UART_T param;
- /*
- 声明 UART设置的结构体 位于DRVUART.H
- 结构体如下
- typedef struct DRVUART_STRUCT
- {
- uint32_t u32BaudRate;
- E_DATABITS_SETTINS u8cDataBits;
- E_STOPBITS_SETTINS u8cStopBits;
- E_PARITY_SETTINS u8cParity;
- E_FIFO_SETTINGS u8cRxTriggerLevel;
- uint8_t u8TimeOut ;
- }STR_UART_T;
- */
- DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); //使能UART时钟
- //SYSCLK->CLKSEL1.UART_S = 0; //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器
- DrvGPIO_InitFunction(E_FUNC_UART0); //GPB_MFP0-1-2-3置位 GPIO使能UART功能
- //outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<0));
- param.u32BaudRate = 115200; // 波特率
- param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
- param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
- param.u8cParity = DRVUART_PARITY_NONE; // 校验位
- param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
- param.u8TimeOut = 0; // FIFO超时设定
- /* Set UART Configuration */
- if(DrvUART_Open(UART_PORT0,¶m) != E_SUCCESS) // 串口开启、结构体整体赋值
- printf("UART0 open failed\n");
- /* u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2 */
- /* sParam -[in] the struct parameter to configure UART */
- /* Enable Interrupt and install the call back function */
- DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT,UART_INT_HANDLE);
- /*u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2 */
- /*u32InterruptFlag -[in] DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSINT */
- /* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT */
- /*pfncallback -[in] A function pointer for callback function */
- }
- int main (void)
- {
- uint8_t test = 250;
- uint8_t tmp;
- uint32_t i32ConversionData;
- uint32_t i32ConversionData_Sum;
- uint8_t IsFirst = 1;
-
- Init_System();
-
- Init_Uart();
- DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT); //程序运行指示
- DrvGPIO_ClrBit(E_GPA,Run_Led);
- printf("\n");
- printf("/*===========================\n");
- printf("======菜农 %d 助学计划=======\n",test);
- printf("========NUC120助学板========\n");
- printf("==程序参考Cube教程及BSP例程=\n");
- printf("=======2010年03月30日=======\n");
- printf("===========ADC实验==========\n");
- printf("====ADC_Driver version: %x===\n", DrvADC_GetVersion());
- printf("请输入1~9(转换次数)开始测试!\n");
- printf("==========================*/\n\n");
-
- while(1)
- {
- if ( ADC_Status == BUSY)
- {
- DrvGPIO_InitFunction(E_FUNC_ADC1); //注:使能 ADC功能前,模拟输入引脚输入类型. 助学板上与电位器相连
- DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_OP, 0x02, EXTERNAL_12MHZ, 3);
- // 单端输入 单一转换 通道1 外部12M 分频3
- /* Parameters: */
- /*InputMode[in]: 模拟信号输入类型 It might be ADC_SINGLE_END or ADC_DIFFERENTIAL. */
- /*OpMode [in]: 操作模式 It might be ADC_SINGLE_OP、ADC_SINGLE_CYCLE_OP or ADC_CONTINUOUS_OP. */
- /*u8ChannelSelBitwise[in]: 输入通道 For example, "u8ChannelSelBitwise=0x1(00000001b)" means the ADC channel 0 is enabled;
- "u8ChannelSelBitwise=0x19(00011001b)" means the ADC channel 0, 3 and 4 are enabled. */
- /*ClockSrc[in]: ADC时钟源 It might be EXTERNAL_12MHZ、INTERNAL_PLL or INTERNAL_RC22MHZ. */
- /*u8AdcDivisor[in]: 决定ADC时钟频率 ADC clock frequency = ADC clock source frequency / ( u8AdcDivisor + 1 ) */
- /* 最大 ADC 时钟频率 20MHz */
- if (IsFirst)
- {
- DrvADC_EnableSelfCalibration(); //使能自校正功能
- while(DrvADC_IsCalibrationDone()==FALSE); //检查是否自校正功能已经完成
- DrvADC_DisableSelfCalibration(); //关闭自校正功能
- IsFirst = 0;
- }
-
- tmp = ADC_Cnt;
- i32ConversionData_Sum = 0;
- for (;tmp>0;tmp--)
- {
- DrvADC_StartConvert(); //Set the ADST bit of ADCR to start the A/D conversion action
-
- while(DrvADC_IsConversionDone()==FALSE); // Check whether the conversion action is finished or not
- i32ConversionData = DrvADC_GetConversionData(1); //Get the conversion result of the specified ADC channel
- /* Parameters: */
- /* u8ChannelNum [in]: Specify the ADC channel. */
- i32ConversionData_Sum += i32ConversionData;
-
- printf("第%d次转换结果为: 0x%X (%d)\n",(ADC_Cnt-tmp+1) ,i32ConversionData, i32ConversionData);
- }
-
- i32ConversionData = i32ConversionData_Sum/ADC_Cnt;
- printf("%d次转换结果的平均值为: 0x%X (%d)\n\n",ADC_Cnt ,i32ConversionData, i32ConversionData);
- printf("计算输入的电压为%dmV!\n\n",(i32ConversionData*5000/4096));
- printf("========共%d次转换结束!========\n\n",ADC_Cnt);
- printf("请输入1~9(转换次数)再次开始测试!\n");
- ADC_Status = IDLE;
- i32ConversionData_Sum = 0;
- DrvADC_Close();
- }
- }
- }
第一次打开ADC时增加延时即可解决第一次测试时数据波动比较大的问题。
工程文件(内含1~4贴的源文件)
|