/**************************************************************************//**
*实验名称:ADC实验
*描 述:通过对ADC,UART设置,实现ADC数据通过UART转USB在PC串口助手显示
*作 者:何新建
*实验日期:2015/3/12
*实验说明:串口通讯实验通过,每按一次复位键,串口助手收到一个ADC转换值,ADC实验通过
*硬件连接:UART/USB:PL2303,MUC:M058SSAN晶振12MHz,P1.0ADC输入,参考电压输入端56脚Vref接55脚AVDD,RXD/P3.0,TXD/P3.1程序下载Nu-Link-Me.
*代码说明:
*
******************************************************************************/
/* 本程序由 NuSmart 工具自动产生 */
#include <stdio.h>
#include "M051Series.h"
#include "initialization.h"
//#define _ADC_IS_CONVERSION_DONE() ((ADC->ADSR & ADC_ADSR_ADF_Msk) >> ADC_ADSR_ADF_Pos)
/*-----------------------------------------------------------------*/
/* 初始化系统时钟 */
/*-----------------------------------------------------------------*/
void SYS_Init(void)
{
/* 解锁保护的寄存器 */
SYS_UnlockReg();
/* 使能 XTL12M */
SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;
/* 等待时钟稳定 */
SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_XTL12M_STB_Msk);
/* 切换HCLK和SysTick的时钟源 */
SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;
/* 切换IP模块的时钟源 */
SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_UART_XTAL
| SYSCLK_CLKSEL1_ADC_HCLK;
SYSCLK->CLKDIV = (0 << SYSCLK_CLKDIV_HCLK_N_Pos)
| (0 << SYSCLK_CLKDIV_UART_N_Pos)
| (0 << SYSCLK_CLKDIV_ADC_N_Pos);
/* !!! SysTick被设定为来自"CPU", 当开始该时钟时,
请在SysTick->CTRL中使用SysTick_CTRL_CLKSOURCE_Msk位。*/
/* PLL掉电模式 */
SYSCLK->PLLCON = 0x0005C22E;
/* 现在可以安全的关闭没使用的时钟了! */
SYSCLK->PWRCON &= ~(SYSCLK_PWRCON_OSC22M_EN_Msk
| SYSCLK_PWRCON_OSC10K_EN_Msk);
/* 使能外围设备时钟 */
SYSCLK->APBCLK = SYSCLK_APBCLK_UART0_EN_Msk
| SYSCLK_APBCLK_ADC_EN_Msk;
/* 重置外围设备 */
SYS->IPRSTC2 = SYS_IPRSTC2_UART0_RST_Msk
| SYS_IPRSTC2_ADC_RST_Msk
| SYS_IPRSTC2_GPIO_RST_Msk;
SYS->IPRSTC2 = 0;
/* 锁定保护的寄存器 */
SYS_LockReg();
}
/*-----------------------------------------------------------------*/
/* 初始化IO引脚 */
/*-----------------------------------------------------------------*/
void IO_Init(void)
{
/* 设定引脚复用功能 */
SYS->P1_MFP = SYS_MFP_P10_AIN0;
SYS->P3_MFP = SYS_MFP_P30_RXD0
| SYS_MFP_P31_TXD0;
/* 配置引脚输入输出模式 */
P1->PMD = 0x0000FFFC;
P1->DBEN = 0x00000001;
}
/*-----------------------------------------------------------------*/
/* 初始化UART0 */
/*-----------------------------------------------------------------*/
void UART0_Init(void)
{
/* UART0设定 */
UART0->BAUD = UART_BAUD_MODE0 | UART_BAUD_DIV_MODE0(__XTAL, 19200);//115200不可用
_UART_SET_DATA_FORMAT(UART0, UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1);
UART0->FCR = UART_FCR_RTS_TRI_LEV_1BYTE
| UART_FCR_RFITL_1BYTE
| UART_FCR_RX_DIS_Msk;
}
/*-----------------------------------------------------------------*/
/* 初始化ADC */
/*-----------------------------------------------------------------*/
void ADC_Init()
{
/* 设定ADC控制寄存器 */
ADC->ADCR = ADC_ADCR_DMOF_UNSIGNED_OUTPUT //选择二进制的格式作为转换结果的输出格
| ADC_ADCR_DIFFEN_SINGLE_END //单端输入模式
| ADC_ADCR_TRGCOND_LOW_LEVEL //STADC Low 活动的级别
| ADC_ADCR_ADMD_SINGLE //单模式
| ADC_ADCR_ADEN_CONVERTER_ENABLE; //ADC 转换器启用
/* 使能模拟输入通道 */
ADC->ADCHER = 0x01;
}
/*-----------------------------------------------------------------*/
/* 主程序 */
/*-----------------------------------------------------------------*/
int32_t main(void)
{
int32_t i32ConversionData;
SYS_Init();//调用系统时钟初始化函数
IO_Init();//调用I/O口初始化函数
UART0_Init();//串口初始化函数
ADC_Init();//ADC初始化函数
_ADC_START_CONVERT(); // 启动 ADC 转换
_ADC_WAIT_COVERSION_DONE();//等待转换完成
i32ConversionData = _ADC_GET_CONVERSION_DATA(0);//获取0通道转换数据
printf("ADC通道0 %d: 0x%X (%d V)\n", 0, i32ConversionData, i32ConversionData);//串口助手显示"ADC通道0 0x0 (0V)"
ADC->ADSR = ADC_ADSR_ADF_Msk; /* 清除A/D转换结束标记 */
ADC_ResetIP();//调用 ADC IP 重置
_ADC_DISABLE_CLOCK();//调用 禁用 IP ADC 时钟函数
NVIC_DisableIRQ(ADC_IRQn);
while(1);
}
|