本帖最后由 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;
}
}
}
|