TQ2440 学习笔记—— 22、系统时钟和定时器
2015-09-04 10:03
501 查看
(韦东山——嵌入式Linux 应用开发完全手册)
系统时钟和定时器
启动MPLL 需要设置的寄存器: LOCKTIME (LOCK TIME COUNT)、MPLLCON(Main PLL Control)、CLKDIVN(clock divider control)
若Fout = 200MHz则, Fout = 2 *m * Fin / (p * 2 ^ s) = 2 * (92 + 8) * 12MHz / (3 * 2 ^ 2) = 200MHz
m = 100, MDIV = 92
p = 3, PDIV = 2
s = 2, SDIV = 2
#define S3C2440_MPLL_200MHZ ((0x5c << 12) | (0x01 << 4) | (0x02))
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=4:2:1, HDIVN=1,PDIVN=1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * 定 时 器 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
定时器输入时钟频率 = PCLK / (预分频值+1) / 分频值
如: timer0_clock = 100MHz / (99+1) / 16 = 62500Hz
系统时钟和定时器
启动MPLL 需要设置的寄存器: LOCKTIME (LOCK TIME COUNT)、MPLLCON(Main PLL Control)、CLKDIVN(clock divider control)
若Fout = 200MHz则, Fout = 2 *m * Fin / (p * 2 ^ s) = 2 * (92 + 8) * 12MHz / (3 * 2 ^ 2) = 200MHz
m = 100, MDIV = 92
p = 3, PDIV = 2
s = 2, SDIV = 2
#define S3C2440_MPLL_200MHZ ((0x5c << 12) | (0x01 << 4) | (0x02))
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=4:2:1, HDIVN=1,PDIVN=1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * 定 时 器 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
定时器输入时钟频率 = PCLK / (预分频值+1) / 分频值
如: timer0_clock = 100MHz / (99+1) / 16 = 62500Hz
#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00)) #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02)) /* * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV * 有如下计算公式: * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s) * S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s) * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV * 对于本开发板,Fin = 12MHz * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4, * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ void clock_init(void) { // LOCKTIME = 0x00ffffff; // 使用默认值即可 CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ __asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* 读出控制寄存器 */ "orr r1, r1, #0xc0000000\n" /* 设置为“asynchronous bus mode” */ "mcr p15, 0, r1, c1, c0, 0\n" /* 写入控制寄存器 */ ); /* 判断是S3C2410还是S3C2440 */ if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) { MPLLCON = S3C2410_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ } else { MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ } }
相关文章推荐
- 精通Hibernate——Hibernate的检索策略
- 详解Http协议
- bee中下载网络资源时,加载转圈的进度条
- 递归复习,递归输出字符串的全排列
- String,StringBuffer与StringBuilder的区别??
- Huffman树及其编码实现
- TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免
- Android Studio常用修改
- 二叉树的遍历 递归非递归 思路和 java实现
- 虚拟机下手动修改固态ip,链接外网(转载)
- org.eclipse.swt.SWTError:No more Handles
- 楼层扔鸡蛋问题
- bzoj1597 [Usaco2008 Mar]土地购买
- [python]http_server
- Android PopupWindow 的显示位置
- POJ1410Intersection【判断线段与矩形相交+点在矩形内的简单判定】
- CSDN-markdown编辑器的样例保存
- 原来UIWindow可以自定义frame
- [人月神话]读书笔记8--软件产品需要的文档&&软件开发没有银弹(捷径)
- 嵌入式内核初学习