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

[复制链接]
 楼主| tear086 发表于 2011-3-31 02:00 | 显示全部楼层 |阅读模式
本帖最后由 tear086 于 2011-4-4 00:24 编辑

寄存器的设置是参考应用笔记和TRM做得。现在还没有对ADC的输出做滤波。
  1. #ifndef __MAIN_H__
  2. #define __MAIN_H__

  3. #include <stdio.h>

  4. /*********************************************************
  5. * 系统寄存器映射及库头文件
  6. *********************************************************/
  7. #include "NUC1xx.h" // 系统寄存器映射
  8. #include "DrvSYS.h"
  9. #include "DrvGPIO.h"
  10. #include "DrvUART.h"

  11. /**********************************************************
  12. * 自定义头文件
  13. **********************************************************/


  14. /**********************************************************
  15. * 自定义宏
  16. **********************************************************/
  17. #define APP_DEBUG

  18. #ifdef APP_DEBUG
  19. #define PRINT printf
  20. #else
  21. #define PRINT
  22. #endif

  23. #endif /* __MAIN_H__ */

  1. #include "main.h"

  2. volatile int32_t ad_X[2] = {0}; // ADC采样值

  3. typedef enum{NO=0, YES=!NO}bool;
  4. bool tmr0_5ms_flag = YES;

  5. void MAIN_INIT(void)
  6. {
  7.     UNLOCKREG();

  8.     /* 配置系统时钟 */
  9.     SYSCLK->WRCON.XTL12M_EN = 1; //  设定12M外部晶振
  10.     DrvSYS_Delay(5000);              //  等待时钟就绪
  11.     DrvSYS_SelectPLLSource(E_SYS_EXTERNAL_12M); // 选择12MHz为PLL输入
  12.     DrvSYS_Open(50000000); // 打开50MHz

  13.    
  14.      /* 配置串口 */
  15.     {
  16.         STR_UART_T param;
  17.         
  18.         DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); //使能UART时钟
  19.         DrvGPIO_InitFunction(E_FUNC_UART0);    // 复用功能引脚设置
  20.                                                          
  21.         param.u32BaudRate        = 115200;    // 波特率
  22.         param.u8cDataBits        = DRVUART_DATABITS_8;  // 数据位
  23.         param.u8cStopBits        = DRVUART_STOPBITS_1;  // 停止位
  24.         param.u8cParity          = DRVUART_PARITY_NONE;    // 校验位
  25.         param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;    // FIFO存储深度1字节
  26.         param.u8TimeOut             = 0; // FIFO超时设定
  27.         DrvUART_Open(UART_PORT0, &param); // 串口开启、结构体整体赋值
  28.     }

  29.     /* 配置GPIO */
  30.     NVIC_DisableIRQ(GPAB_IRQn);
  31.     NVIC_DisableIRQ(GPCDE_IRQn);
  32.     DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);
  33.     DrvGPIO_ClrBit(E_GPB, 10); // 关蜂鸣器


  34.     /* 配置TMR0 */
  35.     NVIC_DisableIRQ(TMR0_IRQn);
  36.     // 第一步 使能和选择定时器时钟源及使能定时器模块         
  37.     SYSCLK->CLKSEL1.TMR0_S = 0; // 选择12Mhz作为定时器时钟源
  38.     SYSCLK->APBCLK.TMR0_EN =1;  // 使能定时器0
  39.     TIMER0->TCSR.CEN = 1;       // 使能定时器模块
  40.     // 第二步 选择操作模式   
  41.     TIMER0->TCSR.MODE = 1; // 选择周期模式
  42.     TIMER0->TCSR.CRST = 1; // 清加1计数器   
  43.     // 第三步 输出时钟周期 = 定时器时钟源周期*(8位预分频因子 + 1) * (24位比较因子TCMP)
  44.     TIMER0->TCSR.PRESCALE = 11; // 12分频
  45.     TIMER0->TCMPR = 5000;       // 1/12M * 12 * 5000 = 5ms
  46.     // 第四步 使能中断
  47.     TIMER0->TISR.TIF = 1; // 清中断  
  48.     TIMER0->TCSR.IE = 1; // 使能中断
  49.     NVIC_EnableIRQ(TMR0_IRQn);  // 使能TMR0中断
  50.     // 第五步 使能定时器模块
  51.     TIMER0->TCSR.CRST = 1; // 复位向上计数器
  52.         TIMER0->TCSR.CEN = 1; // 使能TMR0
  53.     //TIMER0->TCSR.TDR_EN=1; // 无需读取加1计数器值
  54.    

  55.     /* 配置ADC */
  56.     NVIC_DisableIRQ(ADC_IRQn);
  57.     // 第一步 GPIO初始化
  58.     SYS->IPRSTC2.ADC_RST = 1; // 复位ADC
  59.         SYS->IPRSTC2.ADC_RST = 0;
  60.     GPIOA->OFFD |= 0x03 << 16; // 失能数字输入路径
  61.     SYS->GPAMFP.ADC0 = 1; // 设置ADC函数
  62.     SYS->GPAMFP.ADC1_AD12 = 1;           
  63.     // 第二步 使能及选择ADC时钟源 然后使能ADC模块
  64.     SYSCLK->CLKSEL1.ADC_S = 0;    // 选择12MHz
  65.     SYSCLK->CLKDIV.ADC_N = 0;    // 时钟源=12M/1=12MHz
  66.     SYSCLK->APBCLK.ADC_EN = 1;    // 使能时钟源
  67.     ADC->ADCR.ADEN = 1;            // 使能AD模块
  68.     // 第三步 选择操作模式
  69.     ADC->ADCR.DIFFEN = 0;  // 单端输入
  70.     ADC->ADCR.ADST = 0; // 失能ADST
  71.     ADC->ADCR.ADMD = 2; // 单周期扫描         
  72.     // 第四步 选择ADC通道
  73.     ADC->ADCHER.CHEN = 0x03 ; // 使能ADC CH0、1
  74.     ADC->ADCHER.PRESEL = 0;   // 模拟输入通道选择:外部模拟输入      
  75.     // 第五步 使能ADC中断
  76.     ADC->ADSR.ADF = 1;  // 清AD中断标志
  77.     ADC->ADCR.ADIE = 1; // 使能AD中断
  78.     NVIC_EnableIRQ(ADC_IRQn);     
  79.     // 第六步 启动ADC转换
  80.     ADC->ADCR.ADST = 1;   
  81.     // 第八步 使能PDMA   
  82.     //ADC->ADCR.PTEN = 1; // PDMA传送使能

  83.     LOCKREG();
  84. }  

  85. void TMR0_IRQHandler(void) __irq
  86. {
  87.     TIMER0->TISR.TIF = 1;// 清TMR0中断标志
  88.     tmr0_5ms_flag = YES;  
  89. }

  90. void ADC_IRQHandler(void) __irq
  91. {
  92.     int i;

  93.     ADC->ADSR.ADF = 1;  // 清AD中断标志
  94.     ADC->ADCR.ADST = 0;  // 停止ADC转换

  95.     i=0;
  96.     do{
  97.         if(0 == ADC->ADDR.VALID) return;
  98.     }while(++i < 2);

  99.     i=0;
  100.     do{
  101.         ad_X = (ADC->ADDR.RSLT);
  102.     }while(++i < 2);
  103.    
  104.     ADC->ADCR.ADST = 1; // 重新启动ADC转换
  105. }

  106. int main(void)
  107. {
  108.     MAIN_INIT(); // 上电初始化系统
  109.    
  110.    
  111.     while(1)
  112.     {
  113.         if(YES == tmr0_5ms_flag)
  114.         {
  115.             tmr0_5ms_flag = NO;

  116.             PRINT("%d, %d\r", ad_X[0], ad_X[1]);
  117.         }
  118.         
  119.         

  120.         if(0) break;
  121.     }
  122.    
  123.     DrvUART_Close(UART_PORT0);

  124.     return 0;
  125. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
plc_avr 发表于 2011-3-31 08:52 | 显示全部楼层
好资料,看看,要真搞懂这些寄存器得花一段时间。
weshiluwei6 发表于 2011-3-31 09:40 | 显示全部楼层
不错 很详细 我是菜鸟 可惜了
Swallow_0322 发表于 2011-4-1 11:01 | 显示全部楼层
顶!:P
lixupengarm 发表于 2011-5-23 17:56 | 显示全部楼层
:victory:差不多啊mark!
电子write_cai 发表于 2011-8-17 23:08 | 显示全部楼层
dake1478 发表于 2014-3-20 14:32 | 显示全部楼层
寄存器操作看着就是头晕
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

120

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:個人博客:yuphone.cnblogs.com 聯絡方式:張亞峰 15013013265@qq.com

0

主题

120

帖子

3

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