本帖最后由 nixianmin 于 2011-9-13 19:33 编辑
先了解芯片的时钟系统,下午弄了个程序,通过函数设置系统的时钟10K,32K,12M,22M,50M五种,通过流水灯的速度来测试下时钟设置是不是都可以实现,当设置为12M以上时要修改delay函数的参数,不然速度太快没有效果。
- /*********************************************
- //
- //
- **********************************************/
- #include<stdio.h>
- #include"NUC1xx.h"
- #include"DrvSYS.h"
- #include"DrvGPIO.h"
- //内部22M时钟
- void SelectClk_22M()
- {
- SYSCLK->WRCON.OSC22M_EN=1;
-
- DrvSYS_Delay(5000); //us级延时函数
- DrvSYS_SelectHCLKSource (7); //选择时钟源
- // E_SYS_OSC22M
- }
- //外部12M时钟
- void SelectClk_12M()
- {
- SYSCLK->WRCON.XTL12M_EN=1;
- /* Waiting for 12M Xtal stable */
- DrvSYS_Delay(5000); //us级延时函数
- DrvSYS_SelectHCLKSource (0); //选择时钟源
- // E_SYS_XTL12M
- }
- //外部32K时钟
- void SelectClk_32K()
- {
- SYSCLK->WRCON.XTL32K_EN=1;
- DrvSYS_Delay(100000); //us级延时函数,延时短了可能出问题
- DrvSYS_SelectHCLKSource (1); //选择时钟源
- // E_SYS_XTL32K
- }
- //外部10K时钟
- void SelectClk_10K()
- {
- SYSCLK->WRCON.OSC10K_EN=1;
-
- DrvSYS_Delay(5000); //us级延时函数
- DrvSYS_SelectHCLKSource (3); //选择时钟源
- //E_SYS_OSC10K
- }
- void PLL50M()
- {
- SYSCLK->WRCON.XTL12M_EN=1;
-
- DrvSYS_Delay(5000); //us级延时函数
- DrvSYS_SelectPLLSource (E_SYS_EXTERNAL_12M );
- DrvSYS_Open (50000000); //PLL设置为50MHZ
- DrvSYS_SelectHCLKSource (2); //选择时钟源
- // E_SYS_PLL
- }
- void delay(uint16_t dly_time)
- {
- uint8_t i=0;
- for(;dly_time>0;dly_time--)
- for(i=255;i>0;i--);
- }
- int main(void)
- {
- uint16_t cycle=0x0004;
- UNLOCKREG(); //解寄存器锁保护
- SelectClk_32K();
- //SelectClk_10K();
- //SelectClk_22M();
- //SelectClk_12M();
- //PLL50M();
- //led端口设置
- 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)
- {
- for(cycle=0x0004;cycle<0X0040;cycle<<=1)
- {
- DrvGPIO_SetPortBits (E_GPA,cycle);
- delay(10);//修改延时函数看时钟频率
- }
- }
- }
|