前面分析了 4412 时钟体系,本文来简单测试一下,参考韦东山老师的 Linux 应用完全开发手册4412 (上)
第一实验:
三星公司的BL1会将ARMCLK初始化为400MHz,我们关闭APLL,让 ARMCLK 工作在 24MHz,查看LED闪烁是否缓慢
start.S
.text
.globl _start
_start:
ldr sp, =0x02027800
// 调用C函数之前必须设置栈,栈用于保存运行环境,给局部变量分配空间
// 参考ROM手册P14, 我们把栈指向BL2上方1K处(1K已经够用),
// 即:0x02020000 (iRAM基地址) + 5K(iROM代码用) + 8K(BL1用) + 16K(BL2用) + 1K(用作栈))
bl main // 调用main函数(main这个名称不是固定的,可以随意改)
halt_loop:
b halt_loop
led.c
#define GPM4CON (*(volatile unsigned int *)0x110002E0)
#define GPM4DAT (*(volatile unsigned int *)0x110002E4)
void delay(volatile int time)
{
for(; time > 0; time-- )
;
}
int main(void)
{
unsigned long tmp = 0;
int i = 0;
/*
* GPM4_0-GPM4_3 设置为输出功能
*/
tmp = GPM4CON;
tmp &= ~0xffff;
tmp |= 0x1111;
GPM4CON = tmp;
/*
* 实现流水灯
*/
system_clock_init();
while(1)
{
GPM4DAT = i;
if (++i == 16)
i = 0;
delay(9999999);
}
return 0;
}
clock_init.c
// CMU_CPU
#define CLK_SRC_CPU (*(volatile unsigned int *)0x10044200)
#define CLK_DIV_CPU0 (*(volatile unsigned int *)0x10044500)
#define CLK_DIV_CPU1 (*(volatile unsigned int *)0x10044504)
// CMU_DMC
#define CLK_SRC_DMC (*(volatile unsigned int *)0x10040200)
#define CLK_DIV_DMC0 (*(volatile unsigned int *)0x10040500)
#define CLK_DIV_DMC1 (*(volatile unsigned int *)0x10040504)
// CMU_TOP
#define CLK_SRC_TOP0 (*(volatile unsigned int *)0x1003C210)
#define CLK_SRC_TOP1 (*(volatile unsigned int *)0x1003C214)
#define CLK_DIV_TOP (*(volatile unsigned int *)0x1003C510)
// CMU_LEFTBUS
#define CLK_SRC_LEFTBUS (*(volatile unsigned int *)0x10034200)
#define CLK_DIV_LEFTBUS (*(volatile unsigned int *)0x10034500)
// CMU_RIGHTBUS
#define CLK_SRC_RIGHTBUS (*(volatile unsigned int *)0x10038200)
#define CLK_DIV_RIGHTBUS (*(volatile unsigned int *)0x10038500)
// locktime
#define APLL_LOCK (*(volatile unsigned int *)0x10044000)
#define MPLL_LOCK (*(volatile unsigned int *)0x10044008)
#define EPLL_LOCK (*(volatile unsigned int *)0x1003C010)
#define VPLL_LOCK (*(volatile unsigned int *)0x1003C020)
// APLL
#define APLL_CON1 (*(volatile unsigned int *)0x10044104)
#define APLL_CON0 (*(volatile unsigned int *)0x10044100)
// MPLL
#define MPLL_CON0 (*(volatile unsigned int *)0x10040108)
#define MPLL_CON1 (*(volatile unsigned int *)0x1004010c)
// EPLL
#define EPLL_CON2 (*(volatile unsigned int *)0x1003C118)
#define EPLL_CON1 (*(volatile unsigned int *)0x1003C114)
#define EPLL_CON0 (*(volatile unsigned int *)0x1003C110)
// VPLL
#define VPLL_CON0 (*(volatile unsigned int *)0x1003C120)
#define VPLL_CON1 (*(volatile unsigned int *)0x1003C124)
#define VPLL_CON2 (*(volatile unsigned int *)0x1003C128)
/*
* 函数名:
* system_clock_init
* 功能: 初始化4412的系统时钟
*/
void system_clock_init(void)
{
/* IROM或BL1设置了APLL,
* 本程序设置不启动APLL,
* 而是使在晶振时钟, 以体验一下LED闪灯变慢
*/
CLK_SRC_CPU = 0x0;
}
Makfile
objs := start.o led.o clock_init.o
led.bin : $(objs)
arm-linux-ld -Tled.lds -N -o led.elf $^
arm-linux-objcopy -O binary -S led.elf $@
arm-linux-objdump -D -m arm led.elf > led.dis
%.o:%.c
arm-linux-gcc -Wall -marm -c -O2 -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -marm -c -O2 -o $@ $
clean:
rm -f *.dis *.bin *.elf *.o
led.lds
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
实验现象应该是相比 led.c 中不加 system_clock_init() 的时候,LED闪烁的非常缓慢。
第二个实验:
将 ARMCLK 提升到1400MHz ,观察LED闪烁是否变快。只更改 clock_init.c
// CMU_CPU
#define CLK_SRC_CPU (*(volatile unsigned int *)0x10044200)
#define CLK_DIV_CPU0 (*(volatile unsigned int *)0x10044500)
#define CLK_DIV_CPU1 (*(volatile unsigned int *)0x10044504)
// CMU_DMC
#define CLK_SRC_DMC (*(volatile unsigned int *)0x10040200)
#define CLK_DIV_DMC0 (*(volatile unsigned int *)0x10040500)
#define CLK_DIV_DMC1 (*(volatile unsigned int *)0x10040504)
// CMU_TOP
#define CLK_SRC_TOP0 (*(volatile unsigned int *)0x1003C210)
#define CLK_SRC_TOP1 (*(volatile unsigned int *)0x1003C214)
#define CLK_DIV_TOP (*(volatile unsigned int *)0x1003C510)
// CMU_LEFTBUS
#define CLK_SRC_LEFTBUS (*(volatile unsigned int *)0x10034200)
#define CLK_DIV_LEFTBUS (*(volatile unsigned int *)0x10034500)
// CMU_RIGHTBUS
#define CLK_SRC_RIGHTBUS (*(volatile unsigned int *)0x10038200)
#define CLK_DIV_RIGHTBUS (*(volatile unsigned int *)0x10038500)
// locktime
#define APLL_LOCK (*(volatile unsigned int *)0x10044000)
#define MPLL_LOCK (*(volatile unsigned int *)0x10044008)
#define EPLL_LOCK (*(volatile unsigned int *)0x1003C010)
#define VPLL_LOCK (*(volatile unsigned int *)0x1003C020)
// APLL
#define APLL_CON1 (*(volatile unsigned int *)0x10044104)
#define APLL_CON0 (*(volatile unsigned int *)0x10044100)
// MPLL
#define MPLL_CON0 (*(volatile unsigned int *)0x10040108)
#define MPLL_CON1 (*(volatile unsigned int *)0x1004010c)
// EPLL
#define EPLL_CON2 (*(volatile unsigned int *)0x1003C118)
#define EPLL_CON1 (*(volatile unsigned int *)0x1003C114)
#define EPLL_CON0 (*(volatile unsigned int *)0x1003C110)
// VPLL
#define VPLL_CON0 (*(volatile unsigned int *)0x1003C120)
#define VPLL_CON1 (*(volatile unsigned int *)0x1003C124)
#define VPLL_CON2 (*(volatile unsigned int *)0x1003C128)
/*
* 函数名:
* system_clock_init
* 功能: 初始化4412的系统时钟
*/
void system_clock_init(void)
{
/* 1. 在设置APLL之前, 先设置时钟源为晶振 */
CLK_SRC_CPU = 0x0;
/* 2. 设置APLL */
/* 2.1 设置锁定时间: APLL_CON0中PDIV=3, 所以APLL_LOCK = 270x3 */
APLL_LOCK = 270 * 3;
/* 2.2 设置分频参数 */
CLK_DIV_CPU0 = 0x00160760;
CLK_DIV_CPU1 = 0x00000106;
/* 2.3 设置控制参数并使能PLL */
/* 默认值 */
APLL_CON1 = 0x00803800;
/*
* 设置APLL的M,P,S值, APLL输出 = 0xAF x 24MHz / (3 x 2 ^ 0) = 1.4GHz
* 使能APLL
*/
APLL_CON0 = (1<<31 | 0xAF<<16 | 3<<8 | 0x0);
/* 3. 设置MUX, 使用APLL的输出 */
CLK_SRC_CPU = 0x01000001;
}
一开始,测试时,我试图只把ARMCLK提升到1400MHz,其余寄存器都使用默认值,但是发现LED闪烁几下程序就会跑飞,根据下图采用默认值的情况下大部分DIV分频系数都是1,因此比如ACLK_COREM0等也都会是 1400MHz,但是它们是无法承受如此高的工作频率。
三星给出了 high-performance 状态下的频率值,我将 cpu 部分的频率配置到该表推荐值以下,程序就正常运行了。
上一篇:tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及中断
下一篇:Tiny4412裸机程序,时钟操作
推荐阅读最新更新时间:2024-11-19 13:05
推荐帖子
- 菜鸟向各位请教,bsp编译过程
- dirmakefiledef和sources文件在编译时各起什么作用?菜鸟向各位请教,bsp编译过程应该先google一下,有什么不懂再问。。老帖也有很多这方面的内容
- ling281021799 嵌入式系统
- 通用TFT液晶驱动!!!!
- 我们公司开发的m600驱动模组能驱动1024*768以下不同厂家不同分辨率的TFT。需要资料的可以跟我联系。boy_201a@163.com13501104029qq781558807张凯通用TFT液晶驱动!!!!顶~~~~怎么无人问津呢~~?我公司有1.3-15寸成套液晶终端产品。使用TFT通用真彩液晶驱动,特点如下1、使用M600开发真彩色显示产品,投入最低、开发进度最快-真正的低成本---零售价格人民币298.00元;2、采用串口(RS232/TTL)方式,
- 2019230 嵌入式系统
- Helper2416-46——QT入门应用——控制LED
- 本帖最后由yuanlai2010于2014-9-2219:39编辑 QT入门应用——控制LED实现功能:简单Qt4应用程序控制LED的亮灭开发环境:fedora20+QtCreate+Qt4.8.6想不到的是到了最后一个学期课程还是那么多,所以用来学习这些东西的时间不多,进度有些慢,今天总算是把这个小应用做出来了。现在和大家分享以下!在开发板上的截图是这个样子,搞不懂阿!代码:
- yuanlai2010 嵌入式系统
- sockit加载wifi模块显示没有权限
- 请问一下,我使用使用开发板添加wifi模时,模块驱动加载成功,但是当我使用#ifconfigwlan0up时显示SIOCSIFFLAGS:Operationnotpermitted错误,请问怎么解决。求指导。Larkboard就能使用wifi,不知道是不是哪边设置出了问题。sockit加载wifi模块显示没有权限
- AD_DA Altera SoC
- 放大器采用+12V单电源供电,所需其它电源电压自行转换
- 大家对这句话怎么理解,VCA821还能用吗放大器采用+12V单电源供电,所需其它电源电压自行转换以6V为参考电压,+6和-6就出来了loadinghl发表于2015-8-1216:28以6V为参考电压,+6和-6就出来了 能不能将12转换为正负5V供电呢看看Figure67就知道821不能用了千雪尘埃发表于2015-8-1221:02看看Figure67就知道821不能用了 何以见得啊,基础部分还是可以完成的,,你们电源的具体方案是怎样
- sunshine_chen 电子竞赛
- 好心人发我imgdecmp.dll和ril.dll库,急!
- 看着自己PPC中有这样的dll,但折腾了半天也没取出来,提取rom和解压rom总出错。比较急,好心人有的话发给我一下,不胜感激!alex@su-fun.com好心人发我imgdecmp.dll和ril.dll库,急!我也要啊xingke@gmail.com晕死,这么老的帖子还活着~我有了,我记得的话到时发给你
- magicflyinsky 嵌入式系统
设计资源 培训 开发板 精华推荐
- LTC6990IDCB#TRMPBF 隔离式 V-F 转换器的典型应用。 VIN 由隔离测量电路提供。隔离器的 5 us 上升/下降时间将 fMAX 限制为 60kHz
- PI3423-00-EVAL1,使用 PI3423 Cool-Power ZVS 降压稳压器的评估板
- ADR430A 2.048 Vout 超低噪声 XFET 电压基准的典型应用,具有灌电流和拉电流能力
- TS39150 2.5V/1.5A超低压降稳压器典型应用
- XRT82L24EVAL,基于 XRT82L24 线路接口单元的评估系统
- ch552t硅胶键加波轮编码器多媒体键盘
- 【训练营】机械狗.
- 【立创开发板】智能小车
- LTC2257CUJ-12、12 位、40Msps 超低功耗 1.8V ADC 的典型应用电路
- 使用 ROHM Semiconductor 的 BA90BC0WFP-E2 的参考设计