您的位置 首页 模拟

体系时钟和定时器;MPLL和定时器

写在前面:觉得这章比较简单,没有花较大篇幅来讲,很多寄存器的相关用法可以参照S3C2440的官方手册,很容易看懂1系统时钟(1)FCLK:用

写在前面:觉得这章比较简单,没有花较大篇幅来讲,许多寄存器的相关用法能够参照S 3C2440的官方手册,很简单看懂
1体系时钟
(1) FCLK:用于CPU核
HCLK:用于AHB总线上设备:CPU核、存储器操控器、中止操控器、LCD操控器、DMA和USB主机模块
PCLK:用于APB总线上设备:WATCHDOG、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI
(2 )开发板时钟频率为12 MHZ,经过PLL进步体系时钟:MPLL和UPLL(S3C2440);UPLL用于USB设备,MPLL用于FCLK、HCLK、PLCK
(3 )上电→FCLK=Fin(外部输入时钟)→设置MPLL(Lock Time:长短由寄存器LOCKTIME设定)→新的时钟输出正常
(4)几个重要寄存器
MPLLCON寄存器用于设置FCLK与Fin的倍数
CLKDIVN寄存器用于设置FCLK、HCLK、PCLK三者的份额
2 PWM定时器
(1)5个16位的定时器,其间定时器0、1、2、3有PWM功用,即它们都有一个输出引脚,能够经过定时器来操控引脚周期性的高、低电平改动;定时器4没有输出引脚
(2)PLCK→2个8位预分频器(定时器0、1共用第一个定时器2、3、4共用第二个;输出2分频,4分频,8分频,16分频或许外部时钟TCLK0/TCLK1)
TCFG0:经过分频器出来的时钟频率:PLCK/(TCFG0[7:0]或TCFG0[15:8]+1)
TCFG1设定相应定时器为经过分频器出来的时钟频率的几分频
定时器作业频率= PLCK/(TCFG0[7:0]或TCFG0[15:8]+1)/几分频
(3)TCMPn=TCMPBn,TCNTn=TCNTBn→while(TCNTn==TCMPn) ~TOUTn →while(TCNTn==0) ~TOUTn,并触发中止(若中止使能的话),且假如在TCON寄存器中将定时器设为“主动加载”,则TCMPn=TCMPBn,TCNTn=TCNTBn
输出管脚TOUTn默以为高电平,能够经过TCON改动,或许经过读取TCNTOn寄存器得知TCNTn的值
(4)TCON寄存器:运用参阅S3C2440手册
在第一次运用定时器时,要设置“手动更新”位为1以使TCNTBn/TCMPBn的值装入内部寄存器TCNTn、TCMPn中,下一次假如还要设置这一位,需求先将其清0
3 WATCHDOG定时器
(1)PLCK→2个8位预分频器(输出16分频,32分频,64分频,128分频或许外部时钟TCLK0/TCLK1)
初始计数值写入 WTCNT→while(WTCNT==0)主动从头装载WTCNT=WTDAT,并能够发生中止信号,能够输出复位信号
(2)WATDOG定时器作业频率=PCLK/(WTCON[15:8]+1)/几分频
大部分功用都在WTCON中设定
(3)在发动WATDOG定时器前,有必要往这个寄存器定入初始计数值
4:MPLL和定时器操作试验:完好代码:timer.tar.gz timernoMPLL.tar.gz(运用体系默许的时钟)
(1) 设置/发动MPLL
#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))

void clock_init(void)
{
// LOCKTIME = 0x00ffffff; // 运用默许值即可
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1


__asm__(
“mrc p15, 0, r1, c1, c0, 0″
“orr r1, r1, #0xc0000000″
“mcr p15, 0, r1, c1, c0, 0″
);


if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
{
MPLLCON = S3C2410_MPLL_200MHZ;
}
else
{
MPLLCON = S3C2440_MPLL_200MHZ;
}
}
(2) 设置存储操控器
void memsetup(void)
{
volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;



p[0] = 0x22011110; //BWSCON
p[1] = 0x00000700; //BANKCON0
p[2] = 0x00000700; //BANKCON1
p[3] = 0x00000700; //BANKCON2
p[4] = 0x00000700; //BANKCON3
p[5] = 0x00000700; //BANKCON4
p[6] = 0x00000700; //BANKCON5
p[7] = 0x00018005; //BANKCON6
p[8] = 0x00018005; //BANKCON7


p[9] = 0x008C04F4;

void timer0_init(void)
{
TCFG0 = 99; // 预分频器0 = 99
TCFG1 = 0x03; // 挑选16分频
TCNTB0 = 31250; // 0.5秒钟触发一次中止
TCON |= (1<<1); // 手动更新
TCON = 0x09; // 主动加载,清“手动更新”位,发动定时器0
}

(4)定时器中止使能

void init_irq(void)
{
// 定时器0中止使能
INTMSK &= (~(1<<10)); }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/260766.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部