tiny4412开发板时钟操作示例

2020-03-26来源: eefocus关键字:tiny4412  开发板  时钟操作

在上一节总我们介绍了《Exynos4412芯片的时钟管理单元》,有了上一节的基础知识我们就可以写程序操作CPU的时钟了。通过操作led来感受时钟速率的变化。本文总共有三个示例,第一个是写一个LED循环点亮的程序;第二个是将iROM中设置的时钟禁止掉,观察LED变化速率;第三个就是设置CPU的时钟速率为1.4GHz,观察LED的变化速率。


第一个程序很简单,有两个文件start.S和main.c。其中,start.Sz文件中设置栈,然后跳转到C函数中执行。在main.c中设置LED的亮灭。首先,来看start.S内容:


.text

.global _start

_start:

ldr sp, =0x02027400 //设置栈

bl main //跳转到mian函数开始执行

halt_loop: //死循环

b halt_loop

程序很简单,设置栈,关于为什么设置栈这里不再讲述,自己可以去某度搜索。然后就是跳转到main函数中执行,最后就是死循环。


main.c文件的内容如下:


//关于GPM4引脚的宏

#define GPM4CON (*(volatile long *)0x110002E0)

#define GPM4DAT (*(volatile long *)0x110002E4)

 

void delay(int n)

{

while(n--);

}

 

int main()

{

int i;

//让LED1、LED2、LED3和LED4循环闪烁

//1.首先,配置GPM4_0、GPM4_1、GPM4_2和GPM4_3四个引脚为输出

GPM4CON &= ~(0xFFFF);

GPM4CON |=  (0x1111);

//2.循环点亮

while(1)

{

for (i = 2; i <= 5; i++)

{

/* 点亮LED : GPIO输出低电平 */

GPM4DAT &= ~(1 << (i - 2));

delay(100000);

/* 熄灭LED : GPIO输出高电平 */

GPM4DAT |= (1 << (i - 2));

delay(100000);

}

}

return 0;

}

很简单,就是让LED循环点亮;如果不是太懂,可以参照前面的关于操作LED方面的文章。这里不做详细介绍。我们可以观察LED是循环点亮的。一直在哪里死循环。


通过阅读芯片的Spec可以知道在iROM中已经设置了CPU的时钟频率为400MHz,就是关于设置CLK_SRC_CPU、APLL_LOCK、APLL_CON0和CLK_DIV_CPU0等寄存器,关于时钟相关的寄存器的设置大家可以阅读上篇文章。这里不赘述了。


现在,来看第二个程序的文件,是同样的文件名。其中,start.S文件没有更改,只修改了main.c,禁止CPU的时钟使用FOUTAPLL。将CPU的时钟源设置为FINPLL,只需要设置CLK_SRC_CPU寄存器的bit0即可实现。并观察LED亮灭的变化。


main.c的文件内容如下:


//操作时钟的宏

#define CLK_SRC_CPU (*(volatile long *)0x10044200)

 

//关于GPM4引脚的宏

#define GPM4CON (*(volatile long *)0x110002E0)

#define GPM4DAT (*(volatile long *)0x110002E4)

 

void delay(int n)

{

while(n--);

}

 

int main()

{

int i;

//让LED1、LED2、LED3和LED4循环闪烁

//1.首先,配置GPM4_0、GPM4_1、GPM4_2和GPM4_3四个引脚为输出

GPM4CON &= ~(0xFFFF);

GPM4CON |=  (0x1111);

//将CPU的时钟源设置为FINPLL;将bit0设置为0

CLK_SRC_CPU &= ~(0x01 << 0);

//2.循环点亮

while(1)

{

for (i = 2; i <= 5; i++)

{

/* 点亮LED : GPIO输出低电平 */

GPM4DAT &= ~(1 << (i - 2));

delay(100000);

/* 熄灭LED : GPIO输出高电平 */

GPM4DAT |= (1 << (i - 2));

delay(100000);

}

}

 

return 0;

}

已经做了详细的注释,将编译处的clock.bin文件烧写到SD中,将开发板设置为SD启动模式,插入SD卡运行发现LED亮灭闪烁的时间和上个试验相比很小,变化很慢。


第三个示例,将CPU的工作频率设置为1.4GHz,观察LED的亮灭情况。main.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)

 

//关于GPM4引脚的宏

#define GPM4CON (*(volatile long *)0x110002E0)

#define GPM4DAT (*(volatile long *)0x110002E4)

 

/*

* 函数名: system_clock_init

* 功 能: 初始化4412的系统时钟

* 最终结果: APLL=1.4GHz

*/

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 设置分频参数 */

/*

* CORE2_RATIO = 0;

* APLL_RATIO = 2;

* PCLK_DBG_RATIO = 1;

* ATB_RATIO = 6;

* PERIPH_RATIO = 7;

* COREM1_RATIO = 7;

* COREM0_RATIO = 3;

* CORE_RATIO = 0;

*/

CLK_DIV_CPU0 = ((0<<28) | (2<<24) | (1<<20) | (6<<16) | (7<<12) | (7<<8) | (3<<4) | 0);

 

/*

* CORES_RATIO = 5;

* HPM_RATIO = 0;

* COPY_RATIO = 6;

*/

CLK_DIV_CPU1 = ((5 << 8) |(0 << 4) | (6));

 

/* 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;

//return 0;

}

 

void delay(int n)

{

while(n--);

}

 

int main()

{

int i;

system_clock_init();

 

//让LED1、LED2、LED3和LED4循环闪烁

//1.首先,配置GPM4_0、GPM4_1、GPM4_2和GPM4_3四个引脚为输出

GPM4CON &= ~(0xFFFF);

GPM4CON |=  (0x1111);

 

//2.循环点亮

while(1)

{

for (i = 2; i <= 5; i++)

{

/* 点亮LED : GPIO输出低电平 */

GPM4DAT &= ~(1 << (i - 2));

delay(100000);

/* 熄灭LED : GPIO输出高电平 */

GPM4DAT |= (1 << (i - 2));

delay(100000);

}

}

 

return 0;

}

将文件上传到服务器,编译并烧写,试验观察LED的亮灭情况。关于程序使用的链接脚本和Makefile文件这里不介绍。

关键字:tiny4412  开发板  时钟操作 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492639.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:tiny4412开发板icache操作程序
下一篇:常用ARM汇编指令及ATPCS规则

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

tiny4412内核自带led驱动分析
内核版本:linux-3.5 平台:tiny4412一、关于混杂设备此版本内核led驱动使用的是混杂设备misc,具体misc.c的实现路径:linux-3.5/drivers/char/misc.c这就很大程度简化了我们的驱动代码,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数(共用的注册函数),这说明led设备是作为杂项设备出现在内核中的,在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。二、关于gpio:查找tiny4412
发表于 2020-03-10
tiny4412内核自带led驱动分析
Tiny6410 简单的LED字符设备驱动
首先分析原来:1.查看用户手册led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK72、查询6410芯片手册下面还需要3个步骤:1、设置GPIO为OUTPUT。   将GPK4、GPK5、GPK6、GPK7设置为输出output=0001   即GPKCON0的19:28都配置为00012、设置GPIO的数据。   将GPKDATA的4:7位赋值为03、设置GPKUP为上拉。   将GPKUP的4:7位设置为103、代码led_driver.c#include <linux/module.h> 
发表于 2020-03-10
Tiny6410 简单的LED字符设备驱动
tiny6410 linux混杂设备 led驱动
#include <linux/miscdevice.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/device.h>#include <linu
发表于 2020-03-09
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動概述這篇博客以一個簡單的按鍵中斷來演示一下有了設備樹後的中斷的使用,其中涉及到新版kernel的pinctrl和gpio子系統。在tiny4412的底板上有四個key,如下:上圖中,在沒有按鍵的時候,對應的GPIO是被拉高的,當按下鍵的時候,對應的GPIO被拉低,從而產生一個下降沿中斷。有了上面的準備,首先我們需要修改設備樹,添加相應的節點和相關的屬性: 1 diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b
发表于 2020-02-17
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下:datasheet如下:在samsung的pinctrl驅動中加一些調試用的log: 1 diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio
发表于 2020-02-16
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起备货Dialog Semiconductor的DA14531 SmartBond TINY™开发套件。这是一款用于功率测量和应用开发的全新开发套件,基于DA14531 SmartBond TINY片上系统 (SoC)。该SoC是一款微型超低功耗蓝牙5.1 SoC,具有低功耗、高性价比的特性,可以应用于各种新型物联网 (IoT) 设备,包括不断增长的互联医疗产品市场。 贸泽电子分销Dialog DA14531 SmartBond TINY开发套件的Pro和USB版本。DA14531开发套件Pro版包含一块蓝牙低功耗主板
发表于 2020-02-11
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved