本帖最后由 jxc827 于 2012-6-23 16:51 编辑
新手学习笔记。上电后,流水灯闪烁,当看门狗定时器溢出后,中断中使另外一个灯闪烁一次,然后系统复位重启。
心得1:调试过程中时钟稳定状态寄存器始终为0,耽误了一段时间,最后发现是助学板上芯片不支持,不明白厂家为什么这个地方还搞点差异化,如果大家想使用这个功能得小心了。
心得2:PLL寄存器配置值可以直接调用库函数,然后反写入寄存器,不用自己计算。感觉还是挺方便的。
心得3:M0的时钟设置很灵活,但也导致比较繁琐,一开始让人有点晕。总结下来也就如下几步:选择CPU时钟源(内部或者外部);配置PLL;选择外设时钟源;使能该外设时钟源。
心得4:有些库函数封装的不是很合理,必须查看源码才能确认到底实现了啥功能,简单的程序还是习惯操作寄存器,呵呵。
源代码:- #include <stdio.h>
- #include "NUC1xx.h"
- #include "DrvSYS.h"
- #include "DrvGPIO.h"
- #include "DrvTIMER.h"
- void delay(uint32_t i)
- {
- uint32_t j;
- while(i--)
- {
- for(j=0;j<1000;j++);
- }
- }
- uint32_t tmp = 0;
- void WDT_Callback(void)
- {
- DrvWDT_Ioctl(E_WDT_IOC_RESET_TIMER, 0); //复位看门狗定时器
- tmp++;
- if(tmp%2)
- DrvGPIO_ClrBit(E_GPA,5);
- else
- DrvGPIO_SetBit(E_GPA,5);
- }
- void WDT_test(void)
- {
- UNLOCKREG();
- DrvSYS_SetOscCtrl(E_SYS_OSC10K, 1); // 使能内部10KHz晶振
- // while (DrvSYS_GetChipClockSourceStatus (E_SYS_OSC10K) != 1); //等待内部时钟源稳定, 该器件不支持此功能
- delay(1000); //延迟一段时间,等待时钟稳定
- DrvSYS_SelectIPClockSource (E_SYS_WDT_CLKSRC , 0x03); //选择WDT时钟源为内部10KHz
- DrvSYS_SetIPClock(E_SYS_WDT_CLK,1); //使能WDT外设时钟
- DrvWDT_Ioctl(E_WDT_IOC_SET_INTERVAL, 0x05); //设置复位间隔
- DrvWDT_Ioctl(E_WDT_IOC_ENABLE_RESET_FUNC, 1); //使能复位
- DrvWDT_Ioctl(E_WDT_IOC_ENABLE_INT, 1); //使能中断
- DrvWDT_InstallISR((WDT_CALLBACK)WDT_Callback); //注册中断函数
- DrvWDT_Ioctl(E_WDT_IOC_START_TIMER, 1); //启动看门狗
- LOCKREG();
- }
- void PLL_config(void)
- {
- UNLOCKREG();
- DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); // 使能外部12M时钟源
- LOCKREG();
- tmp = DrvSYS_GetExtClockFreq(); //返回外部时钟频率: 0x00b71b00——12MHZ
- DrvSYS_SelectPLLSource(E_SYS_EXTERNAL_12M); //选择外部12M时钟源PLL
- DrvSYS_SetPLLMode(0); //PLL 正常模式
- tmp = DrvSYS_GetPLLContent(E_SYS_EXTERNAL_12M, 50000000); //设置PLL输出50M
- DrvSYS_SetPLLContent(tmp);
- tmp = DrvSYS_GetPLLClockFreq(); //回读PLL输出频率
- UNLOCKREG();
- DrvSYS_SelectHCLKSource(2); //0:12M;1:32K;2LL;
- LOCKREG();
- tmp = DrvSYS_GetHCLKFreq(); //回读HCLK时钟频率
- }
- int main ()
- {
- uint32_t count=0;
- PLL_config(); //配置系统时钟
- WDT_test(); //看门狗测试
- DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);
- DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
- DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
- DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);
- while(1)
- {
- count=(count+1)%8;
- delay(100);
- switch(count)
- {
- case 0: DrvGPIO_ClrBit(E_GPA,2); break;
- case 1: DrvGPIO_SetBit(E_GPA,2); break;
- case 2: DrvGPIO_ClrBit(E_GPA,3); break;
- case 3: DrvGPIO_SetBit(E_GPA,3); break;
- case 4: DrvGPIO_ClrBit(E_GPA,4); break;
- case 5: DrvGPIO_SetBit(E_GPA,4); break;
- default: break;
- }
- }
- }
|