s3c6410 裸机----时钟

7 篇文章 0 订阅

目标:编一个 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
	   
	   
};





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值