历史上的今天
今天是:2025年03月09日(星期日)
2020年03月09日 | s3c6410 裸机----时钟
2020-03-09 来源:eefocus
目标:编一个 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
};
上一篇:intrupt 6410裸机中断
下一篇:6410 ad 中断读取数据
史海拾趣
|
在pocketpc环境下程序,调用com组件中的方法,出现错误提示如下 “其他信息: 由于以下错误: 类未注册 ,无法创建 CLSID 为“{AFE1C22D-0A0F-4CAE-87D4-22B52720FBF3}”的 COM 对象。” 如何解决。 … 查看全部问答> |
|
原来用IAR4.42A,后来芯片换成了大容量的STM32F103RET6,烧写出问题,上网查说是IAR版本低,不支持大容量的芯片。 之后就换IAR5.30,改动了__iar_program_start,linker 选项config里改成了$PROJ_DIR$\\STM32F10x_FLASH.icf 可download and deb ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:41 编辑 先学下,也许能消除疑惑: 博文《哪个更适合你的设计?CFA还是VFA?》 (deyisupport./blog/b/signalchain/archive/2013/10/08/cfa-vfa.aspx) 以前用过运放,要求不算高,没有太在意的。(其实用 ...… 查看全部问答> |




