目标:编一个 pwm 控制蜂鸣器 5秒叫,5秒shut up
了解系统时钟:
可以看到那个pwm受apb控制,而APB 的时钟是受,MPLL 控制的,这是我要关心的流程图,而每个register的
的功能都可以在datasheet中找到,研究一下就可以了,可以发现那些
那些值的设置都是顾定的,see(we recommended only the values in the PLL value recommendation table),
所以推测 有初始化的时钟,只需获取pclk,然后分频就可以得到要的时钟频率了。·······请大牛们看到了,如果你们写了设置系统时钟的code,成功了 ,给我一分,我想学习一下。
void SYSC_GetClkInform( void)
{
u8 muxApll, muxMpll, muxSync;
u8 divApll, divHclkx2, divHclk, divPclk;
u16 pllM, pllP, pllS;
u32 temp;
// clock division ratio
temp = Inp32(rCLK_DIV0);
divApll = temp & 0xf;
divHclkx2 = (temp>>9) & 0x7;
divHclk = (temp>>8) & 0x1;
divPclk = (temp>>12) & 0xf;
// Operating Mode
temp = Inp32(rOTHERS);
temp = (temp>>8)&0xf;
if(temp)
{
g_SYNCACK = 1;
}
else
{
g_SYNCACK = 0;
}
// ARMCLK
muxApll = Inp32(rCLK_SRC) & 0x1;
if(muxApll) //FOUT
{
temp = Inp32(rAPLL_CON);
pllM = (temp>>16)&0x3ff;
pllP = (temp>>8)&0x3f;
pllS = (temp&0x7);
g_APLL = ((FIN>>pllS)/pllP)*pllM;
}
else //FIN
{
g_APLL = FIN;
}
g_ARMCLK = g_APLL/(divApll+1);
// HCLK
muxSync = (Inp32(rOTHERS)>>7) & 0x1;
if(muxSync) //synchronous mode
{
g_HCLKx2 = g_APLL/(divHclkx2+1);
temp = Inp32(rMPLL_CON);
pllM = (temp>>16)&0x3ff;
pllP = (temp>>8)&0x3f;
pllS = (temp&0x7);
g_MPLL = ((FIN>>pllS)/pllP)*pllM;
}
else
{
muxMpll = (Inp32(rCLK_SRC)>>1) & 0x1;
if(muxMpll) //FOUT
{
temp = Inp32(rMPLL_CON);
pllM = (temp>>16)&0x3ff;
pllP = (temp>>8)&0x3f;
pllS = (temp&0x7);
g_MPLL = ((FIN>>pllS)/pllP)*pllM;
}
else //FIN
{
g_MPLL = FIN;
}
g_HCLKx2 = g_MPLL/(divHclkx2+1);
}
g_HCLK = g_HCLKx2/(divHclk+1);
// PCLK
g_PCLK = g_HCLKx2/(divPclk+1);
return;
}
研究一下,getpclk。
timer0 的控制程序:
main.c
#include "gpio.h"
#include "sfr6410.h"
#include "timer.h"
#include "sysc.h"
#include "library.h"
//设置system time
//设置 timer
//gpio设置,pwm ,out
// set pwm tout[0]
void BuzzInit()
{
u32 TEMP;
TEMP = GPIO->rGPIOFCON;
TEMP &= ~(0X3<<28) ;
TEMP |=(0X2<<28);
GPIO->rGPIOFCON = TEMP;
TEMP = GPIO->rGPIOFDAT ;
TEMP &= ~(0x1 <<14);
GPIO->rGPIOFDAT = TEMP;
}
//void SystemTimeInit() //研究发现,默认MPLL,控制apb时钟为400M
void TimerInit()
{
u32 TEMP;
// 1M 设置 time input clock = pclk /(prescaler)/(divier)
TEMP = Inp32(rTCFG0 );
TEMP &=~(0XFF);
TEMP |=0X42;
Outp32(rTCFG0,TEMP);
// tcntb0 tcmpb0 loadvalue,0.1S
TEMP = Inp32(rTCNTB0);
TEMP = 0x989680;
Outp32(rTCNTB0,TEMP);
TEMP = Inp32(rTCMPB0);
TEMP = 0x4c4b40;
Outp32(rTCMPB0,TEMP);
//tcon ,MANUAL load,output,update,o THEN UPLOAD,START
TEMP = Inp32(rTCON);
TEMP &=~(0XF);
TEMP |=0X2;
Outp32(rTCON,TEMP);
TEMP &=~(0XF);
TEMP |=0X9;
Outp32(rTCON,TEMP);
}
//void IntInit();
void main()
{
SYSC_GetClkInform();
BuzzInit();
TimerInit();
while(1);
}
timer.h
#include "def.h"
#include "sfr6410.h"
#include "system.h"
#define FIN 12000000
enum TIMER_REG
{
rTCFG0 = PWMTIMER_BASE+0x00,
rTCFG1 = PWMTIMER_BASE+0x04,
rTCON = PWMTIMER_BASE+0x08,
rTCNTB0 = PWMTIMER_BASE+0x0C,
rTCMPB0 = PWMTIMER_BASE+0x10,
rTCNTO0 = PWMTIMER_BASE+0x14,
rTCNTB1 = PWMTIMER_BASE+0x18,
rTCMPB1 = PWMTIMER_BASE+0x1C,
rTCNTO1 = PWMTIMER_BASE+0x20,
rTCNTB2 = PWMTIMER_BASE+0x24,
rTCMPB2 = PWMTIMER_BASE+0x28,
rTCNTO2 = PWMTIMER_BASE+0x2C,
rTCNTB3 = PWMTIMER_BASE+0x30,
rTCMPB3 = PWMTIMER_BASE+0x34,
rTCNTO3 = PWMTIMER_BASE+0x38,
rTCNTB4 = PWMTIMER_BASE+0x3C,
rTCNTO4 = PWMTIMER_BASE+0x40,
rTINT_CSTAT = PWMTIMER_BASE+0x44,
rWTCON= WDT_BASE+0x00,
rWTDAT = WDT_BASE+0x04,
rWTCNT = WDT_BASE+0x08,
rWTCLRINT = WDT_BASE+0x0C
};