打开手册可以看到系统是由五个时钟源而来
那么怎么控制它们呢?
打开个LED的程序
到有疑问的变量上方点击右键。
点击到定义,可以找到
typedef struct
{
__IO uint32_t
XTL12M_EN:1;
__IO uint32_t
XTL32K_EN:1;
__IO uint32_t
OSC22M_EN:1;
__IO uint32_t
OSC10K_EN:1;
__IO uint32_t
PD_WU_DLY:1;
__IO uint32_t
PD_WU_INT_EN:1;
__IO uint32_t
PD_WU_STS:1;
__IO uint32_t
PWR_DOWN:1;
__IO uint32_t
PD_WAIT_CPU:1;
__I
uint32_t
RESERVE:23;
} SYSCLK_PWRCON_T;
再查这个结构体,可查出:
是在另一个结构体中:
typedef struct
{
SYSCLK_PWRCON_T
PWRCON;
SYSCLK_AHBCLK_T
AHBCLK;
SYSCLK_APBCLK_T
APBCLK;
SYSCLK_CLKSTATUS_T CLKSTATUS;
SYSCLK_CLKSEL0_T
CLKSEL0;
SYSCLK_CLKSEL1_T
CLKSEL1;
SYSCLK_CLKDIV_T
CLKDIV;
SYSCLK_CLKSEL2_T
CLKSEL2;
SYSCLK_PLLCON_T
PLLCON;
SYSCLK_FRQDIV_T
FRQDIV;
} SYSCLK_T;
再查SYSCLK_T
#define SYSCLK
((SYSCLK_T *) SYSCLK_BASE)
原来是指向基地址的结构体。
同样方法可找到 CLKSEL0的结构。
从手册上可查出其控制系统时钟选择的。
了解上述就可以编出小灯亮的速度不一样的程序,就是通过改变系统的时钟。
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
int main (void)
{
UNLOCKREG();
SYSCLK->PWRCON.OSC10K_EN = 1;
SYSCLK->PWRCON.XTL12M_EN = 1;
DrvSYS_Delay(5000);
DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT); // 设置GPB10端口为输出模式
DrvGPIO_ClrBit(E_GPB, 10); // 清GPB10端口 蜂鸣器不叫唤
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)
{
SYSCLK->CLKSEL0.HCLK_S = 3;
SYSCLK->CLKSEL0.STCLK_S= 3;
DrvGPIO_SetPortBits(E_GPA,0xfb);
DrvSYS_Delay(1000);
DrvGPIO_SetPortBits(E_GPA,0xf7);
DrvSYS_Delay(1000);
DrvGPIO_SetPortBits(E_GPA,0xef);
DrvSYS_Delay(1000);
DrvGPIO_SetPortBits(E_GPA,0xdf);
DrvSYS_Delay(1000);
SYSCLK->CLKSEL0.HCLK_S = 7;
SYSCLK->CLKSEL0.STCLK_S= 7;
DrvGPIO_SetPortBits(E_GPA,0xfb);
DrvSYS_Delay(1000000);
DrvGPIO_SetPortBits(E_GPA,0xf7);
DrvSYS_Delay(1000000);
DrvGPIO_SetPortBits(E_GPA,0xef);
DrvSYS_Delay(1000000);
DrvGPIO_SetPortBits(E_GPA,0xdf);
DrvSYS_Delay(1000000);
}
}
打包的工程:
NUCtest1.rar
(2.29 MB)
|