打印
[菜农助学交流]

菜农M0助学板ADC小练(寄存器操作方式)

[复制链接]
4869|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tear086|  楼主 | 2011-3-31 02:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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, &param); // 串口开启、结构体整体赋值
    }

    /* 配置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;
}

Snap2.jpg (15.94 KB )

Snap2.jpg

相关帖子

沙发
plc_avr| | 2011-3-31 08:52 | 只看该作者
好资料,看看,要真搞懂这些寄存器得花一段时间。

使用特权

评论回复
板凳
weshiluwei6| | 2011-3-31 09:40 | 只看该作者
不错 很详细 我是菜鸟 可惜了

使用特权

评论回复
地板
Swallow_0322| | 2011-4-1 11:01 | 只看该作者
顶!:P

使用特权

评论回复
5
lixupengarm| | 2011-5-23 17:56 | 只看该作者
:victory:差不多啊mark!

使用特权

评论回复
6
电子write_cai| | 2011-8-17 23:08 | 只看该作者

使用特权

评论回复
7
dake1478| | 2014-3-20 14:32 | 只看该作者
寄存器操作看着就是头晕

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:個人博客:yuphone.cnblogs.com 聯絡方式:張亞峰 15013013265@qq.com

0

主题

120

帖子

3

粉丝