本帖最后由 tear086 于 2011-4-4 00:24 编辑
寄存器的设置是参考应用笔记和TRM做得。现在还没有对ADC的输出做滤波。#ifndef __MAIN_H__
#define __MAIN_H__
#include <stdio.h>
/*********************************************************
* 系统寄存器映射及库头文件
*********************************************************/
#include "NUC1xx.h" // 系统寄存器映射
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "DrvUART.h"
/**********************************************************
* 自定义头文件
**********************************************************/
/**********************************************************
* 自定义宏
**********************************************************/
#define APP_DEBUG
#ifdef APP_DEBUG
#define PRINT printf
#else
#define PRINT
#endif
#endif /* __MAIN_H__ */
#include "main.h"
volatile int32_t ad_X[2] = {0}; // ADC采样值
typedef enum{NO=0, YES=!NO}bool;
bool tmr0_5ms_flag = YES;
void MAIN_INIT(void)
{
UNLOCKREG();
/* 配置系统时钟 */
SYSCLK->WRCON.XTL12M_EN = 1; // 设定12M外部晶振
DrvSYS_Delay(5000); // 等待时钟就绪
DrvSYS_SelectPLLSource(E_SYS_EXTERNAL_12M); // 选择12MHz为PLL输入
DrvSYS_Open(50000000); // 打开50MHz
/* 配置串口 */
{
STR_UART_T param;
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); //使能UART时钟
DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置
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超时设定
DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值
}
/* 配置GPIO */
NVIC_DisableIRQ(GPAB_IRQn);
NVIC_DisableIRQ(GPCDE_IRQn);
DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);
DrvGPIO_ClrBit(E_GPB, 10); // 关蜂鸣器
/* 配置TMR0 */
NVIC_DisableIRQ(TMR0_IRQn);
// 第一步 使能和选择定时器时钟源及使能定时器模块
SYSCLK->CLKSEL1.TMR0_S = 0; // 选择12Mhz作为定时器时钟源
SYSCLK->APBCLK.TMR0_EN =1; // 使能定时器0
TIMER0->TCSR.CEN = 1; // 使能定时器模块
// 第二步 选择操作模式
TIMER0->TCSR.MODE = 1; // 选择周期模式
TIMER0->TCSR.CRST = 1; // 清加1计数器
// 第三步 输出时钟周期 = 定时器时钟源周期*(8位预分频因子 + 1) * (24位比较因子TCMP)
TIMER0->TCSR.PRESCALE = 11; // 12分频
TIMER0->TCMPR = 5000; // 1/12M * 12 * 5000 = 5ms
// 第四步 使能中断
TIMER0->TISR.TIF = 1; // 清中断
TIMER0->TCSR.IE = 1; // 使能中断
NVIC_EnableIRQ(TMR0_IRQn); // 使能TMR0中断
// 第五步 使能定时器模块
TIMER0->TCSR.CRST = 1; // 复位向上计数器
TIMER0->TCSR.CEN = 1; // 使能TMR0
//TIMER0->TCSR.TDR_EN=1; // 无需读取加1计数器值
/* 配置ADC */
NVIC_DisableIRQ(ADC_IRQn);
// 第一步 GPIO初始化
SYS->IPRSTC2.ADC_RST = 1; // 复位ADC
SYS->IPRSTC2.ADC_RST = 0;
GPIOA->OFFD |= 0x03 << 16; // 失能数字输入路径
SYS->GPAMFP.ADC0 = 1; // 设置ADC函数
SYS->GPAMFP.ADC1_AD12 = 1;
// 第二步 使能及选择ADC时钟源 然后使能ADC模块
SYSCLK->CLKSEL1.ADC_S = 0; // 选择12MHz
SYSCLK->CLKDIV.ADC_N = 0; // 时钟源=12M/1=12MHz
SYSCLK->APBCLK.ADC_EN = 1; // 使能时钟源
ADC->ADCR.ADEN = 1; // 使能AD模块
// 第三步 选择操作模式
ADC->ADCR.DIFFEN = 0; // 单端输入
ADC->ADCR.ADST = 0; // 失能ADST
ADC->ADCR.ADMD = 2; // 单周期扫描
// 第四步 选择ADC通道
ADC->ADCHER.CHEN = 0x03 ; // 使能ADC CH0、1
ADC->ADCHER.PRESEL = 0; // 模拟输入通道选择:外部模拟输入
// 第五步 使能ADC中断
ADC->ADSR.ADF = 1; // 清AD中断标志
ADC->ADCR.ADIE = 1; // 使能AD中断
NVIC_EnableIRQ(ADC_IRQn);
// 第六步 启动ADC转换
ADC->ADCR.ADST = 1;
// 第八步 使能PDMA
//ADC->ADCR.PTEN = 1; // PDMA传送使能
LOCKREG();
}
void TMR0_IRQHandler(void) __irq
{
TIMER0->TISR.TIF = 1;// 清TMR0中断标志
tmr0_5ms_flag = YES;
}
void ADC_IRQHandler(void) __irq
{
int i;
ADC->ADSR.ADF = 1; // 清AD中断标志
ADC->ADCR.ADST = 0; // 停止ADC转换
i=0;
do{
if(0 == ADC->ADDR.VALID) return;
}while(++i < 2);
i=0;
do{
ad_X = (ADC->ADDR.RSLT);
}while(++i < 2);
ADC->ADCR.ADST = 1; // 重新启动ADC转换
}
int main(void)
{
MAIN_INIT(); // 上电初始化系统
while(1)
{
if(YES == tmr0_5ms_flag)
{
tmr0_5ms_flag = NO;
PRINT("%d, %d\r", ad_X[0], ad_X[1]);
}
if(0) break;
}
DrvUART_Close(UART_PORT0);
return 0;
}
|