6410的系统时钟设置(下)---几个常用函数的C源码
好了,贴源码!
//common.h
- #ifndef COMMON_H
- #define COMMON_H
- typedef unsigned long uint32;
- #define MASK_CODE(LSB_LOCATION,FIELD_LEN) ((((uint32)1<<FIELD_LEN)-1)<<LSB_LOCATION)
- #define FILL_BITS(MEM_ADDR,LSB_LOCATION,FIELD_LEN,VALUE) (*(volatile uint32 *)(MEM_ADDR)) = ( (*(volatile uint32 *)(MEM_ADDR)) & ~MASK_CODE((LSB_LOCATION),(FIELD_LEN)) ) | ( ((uint32)(VALUE)<<(LSB_LOCATION)) & MASK_CODE((LSB_LOCATION),(FIELD_LEN)) )
- //注:FILL_BITS(MEM_ADDR,LSB_LOCATION,FIELD_LEN,VALUE)这个宏,它执行的操作是,
- //用VALUE这个数填充MEM_ADDR地址处从第LSB_LOCATION位开始的FIELD_LEN个位.
- #define SET_REG(REG_ADDR,LSB_LOCATION,FIELD_LEN,VALUE) FILL_BITS(REG_ADDR,LSB_LOCATION,FIELD_LEN,VALUE)
- #endif
//clock.h
- #ifndef CLOCK_H
- #define CLOCK_H
- #include"common.h"
- #define CONFIG_SYS_CLK_FREQ 12000000
- void set_sys_clk(uint32 mode);
- uint32 get_ARMCLK(void);
- uint32 get_FCLK(void); //即APLL
- uint32 get_HCLK(void);
- uint32 get_PCLK(void);
- void change_freq(uint32 arm_ratio,uint32 hclkx2_ratio,uint32 hclk_ratio,uint32 pclk_ratio);
- // 0-15 0-7 0-1 0-15
- //这四个参数加1后才是实际分频。
- #define rAPLL_LOCK (*(volatile uint32 *)(0x7e00f000))
- #define rMPLL_LOCK (*(volatile uint32 *)(0x7e00f004))
- #define rEPLL_LOCK (*(volatile uint32 *)(0x7e00f008))
- #define rAPLL_CON (*(volatile uint32 *)(0x7E00F00C))
- #define rMPLL_CON (*(volatile uint32 *)(0x7E00F010))
- #define rEPLL_CON0 (*(volatile uint32 *)(0x7E00F014))
- #define rEPLL_CON1 (*(volatile uint32 *)(0x7E00F018))
- #define rCLK_SRC (*(volatile uint32 *)(0x7E00F01C))
- #define rOTHERS (*(volatile uint32 *)(0x7E00F900))
- #define rMISC_CON (*(volatile uint32 *)(0x7E00F838))
- #define rCLK_DIV0 (*(volatile uint32 *)(0x7E00F020))
- //--------
- #define _APLL_MDIV 1000 //reset: 0x190 ,10bits
- #define _APLL_PDIV 10 //reset: 0x3 ,6bits
- #define _APLL_SDIV 1 //reset: 0x2 ,3bits
- #define _MPLL_MDIV 1000 //reset: 0x214 ,10bits
- #define _MPLL_PDIV 10 //reset: 0x6 ,6bits
- #define _MPLL_SDIV 1 //reset: 0x3 ,3bits
- #define _ARM_RATIO 2 //0-15
- #define _HCLKX2_RATIO 3 //0-7
- #define _HCLK_RATIO 0 //0-1
- #define _PCLK_RATIO 3 //0-15
- /*
- PLL_FOUT:
- FOUT = MDIV X FIN / (PDIV X 2^SDIV)
- MDIV: 64 ≤ MDIV ≤ 1023
- PDIV: 1 ≤ PDIV ≤ 63
- SDIV: 0 ≤ SDIV ≤ 5
- FVCO (=MDIV X FIN / PDIV): 800MHz ≤ FVCO ≤ 1600MHz
- FOUT: 40MHz ≤ FVCO ≤ 1600MHz
- FIN : 10MHz ≤ FIN ≤ 20MHz
- Don't set the value P and M to all zeros.
- CLK:
- ARM_CLK = APLLOUT / (_ARM_RATIO+1)
- HCLKX2 = MPLLOUT / (_HCLKX2_RATIO+1)
- HCLK = HCLKX2 / (_HCLK_RATIO+1)
- PCLK = HCLKX2 / (_PCLK_RATIO+1)
- 设置时还需注意HCLK必须是PCLK的整偶倍数
- */
- #endif
需要修改频率时,只需修改clock.h文件中的下列宏的值即可:
- //--------
- #define _APLL_MDIV 1000 //reset: 0x190 ,10bits
- #define _APLL_PDIV 10 //reset: 0x3 ,6bits
- #define _APLL_SDIV 1 //reset: 0x2 ,3bits
- #define _MPLL_MDIV 1000 //reset: 0x214 ,10bits
- #define _MPLL_PDIV 10 //reset: 0x6 ,6bits
- #define _MPLL_SDIV 1 //reset: 0x3 ,3bits
- #define _ARM_RATIO 2 //0-15
- #define _HCLKX2_RATIO 3 //0-7
- #define _HCLK_RATIO 0 //0-1
- #define _PCLK_RATIO 3 //0-15
//clock.c
- #include"clock.h"
- //注:FILL_BITS(MEM_ADDR,LSB_LOCATION,FIELD_LEN,VALUE)这个宏,它执行的操作是,
- //用VALUE这个数填充MEM_ADDR地址处从第LSB_LOCATION位开始的FIELD_LEN个位.
- void set_sys_clk(uint32 mode)
- { //mode: 0:asyn mode 异步模式
- // other:syn mode 同步模式
- //两种模式的区别参考3-3页的Figure 3.2
- uint32 *p;
- uint32 temp;
- rAPLL_LOCK = 0xffff;
- rMPLL_LOCK = 0xffff;
- rMISC_CON &= ~(1u<<19); //SYNC667 0 : Normal Moe, 1 : Sync 667MHz Mode。 这里选用Normal mode
- if(mode==0)
- {
- //设置同步模式为异步
- rOTHERS &= ~0x80; //异步模式
- while((rOTHERS & 0xf00) != 0); //等待OTHERS的8~11位为0
- rOTHERS &= ~0x40;
- }
- else
- {
- //设置为同步模式。
- rOTHERS |= 0x40; //同步模式
- __asm{
- nop;
- nop;
- nop;
- nop;
- nop;
- }
- rOTHERS |= 0x80;
- while((rOTHERS & 0xf00) != 0xf00); //等待OTHERS的8~11位为1111
- }
- //设置ARMCLK,HCLKX2,HCLK和PCLK
- temp=rCLK_DIV0;
- p=&temp;
- FILL_BITS(p,0,4,_ARM_RATIO);
- FILL_BITS(p,9,3,_HCLKX2_RATIO);
- FILL_BITS(p,8,1,_HCLK_RATIO);
- FILL_BITS(p,12,4,_PCLK_RATIO);
- rCLK_DIV0=temp;
- //设置APLL,得到APLLOUT
- temp=rAPLL_CON;
- p=&temp;
- FILL_BITS(p,16,10,_APLL_MDIV);
- FILL_BITS(p,8,6,_APLL_PDIV);
- FILL_BITS(p,0,3,_APLL_SDIV);
- temp |= (1u<<31);
- rAPLL_CON=temp;
- //设置MPLL,得到MPLLOUT
- temp=rMPLL_CON;
- p=&temp;
- FILL_BITS(p,16,10,_MPLL_MDIV);
- FILL_BITS(p,8,6,_MPLL_PDIV);
- FILL_BITS(p,0,3,_MPLL_SDIV);
- temp |= (1u<<31);
- rMPLL_CON=temp;
- //选择源
- temp=rCLK_SRC;
- p=&temp;
- FILL_BITS(p,0,1,1); //选择APLLOUT
- FILL_BITS(p,1,1,1); //选择MPLLOUT
- rCLK_SRC=temp;
- }
- void change_freq(uint32 arm_ratio,uint32 hclkx2_ratio,uint32 hclk_ratio,uint32 pclk_ratio)
- { // 0-15 0-7 0-1 0-15
- uint32 *p;
- uint32 temp;
- temp=rCLK_DIV0;
- p=&temp;
- FILL_BITS(p,0,4,arm_ratio);
- FILL_BITS(p,9,3,hclkx2_ratio);
- FILL_BITS(p,8,1,hclk_ratio);
- FILL_BITS(p,12,4,pclk_ratio);
- rCLK_DIV0=temp;
- }
- #define APLL 1
- #define MPLL 2
- #define EPLL 3
- static uint32 get_PLLCLK(int pllreg) //返回0说明异常
- {
- uint32 r, m, p, s;
- if (pllreg == APLL)
- r = rAPLL_CON;
- else if (pllreg == MPLL)
- r = rMPLL_CON;
- else if (pllreg == EPLL)
- r = rEPLL_CON0;
- else
- return 0;
- m = (r>>16) & 0x3ff;
- p = (r>>8) & 0x3f;
- s = r & 0x7;
- return (m * (CONFIG_SYS_CLK_FREQ / (p * (1 << s))));
- }
- /* return ARMCORE frequency */
- uint32 get_ARMCLK(void)
- {
- uint32 div;
- div = rCLK_DIV0;
- return (get_PLLCLK(APLL) / ((div & 0x7) + 1));
- }
- /* return FCLK frequency */
- uint32 get_FCLK(void)
- {
- return (get_PLLCLK(APLL));
- }
- /* return HCLK frequency */
- uint32 get_HCLK(void)
- {
- uint32 fclk;
- uint32 hclkx2_div = ((rCLK_DIV0>>9) & 0x7) + 1;
- uint32 hclk_div = ((rCLK_DIV0>>8) & 0x1) + 1;
- if(rOTHERS & 0x80)
- fclk = get_FCLK(); // SYNC Mode
- else
- fclk = get_PLLCLK(MPLL); // ASYNC Mode
- return fclk/(hclk_div * hclkx2_div);
- }
- /* return PCLK frequency */
- uint32 get_PCLK(void)
- {
- uint32 fclk;
- uint32 hclkx2_div = ((rCLK_DIV0>>9) & 0x7) + 1;
- uint32 pre_div = ((rCLK_DIV0>>12) & 0xf) + 1;
- if(rOTHERS & 0x80)
- fclk = get_FCLK(); // SYNC Mode
- else
- fclk = get_PLLCLK(MPLL); // ASYNC Mode
- return fclk/(hclkx2_div * pre_div);
- }
set_sys_clk(uint32 mode)函数既设置锁相环又根据已定义好的宏设置ARMCLK和HCLK等的分频。mode为0时为异步模式,为1时为同步模式。初始化时一般用这个函数。
change_freq(uint32,uint32,uint32,uint32)根据输入的参数设置ARMCLK和HCLK等的分频,但不改变PLL的设置。通过这个函数可以快捷的实现动态变频。
其他的get*****()函数就请读者自己看吧。
6410的系统时钟设置(下)---几个常用函数的C源码相关推荐
- 6410的系统时钟设置(中)---相关寄存器介绍
上篇中已经详细分析了6410时钟系统的结构,现在就介绍下几个与时钟设置相关的寄存器. 1.APLL_LOCK.MPLL_LOCK.EPLL_LOCK 这三个寄存器的低十六位分别表示APLL.MPLL. ...
- 6410的系统时钟设置(上)---6410时钟控制逻辑框架分析
本文主要介绍6410内核和AHB.APB总线的时钟设置. 6410的时钟逻辑结构还是比较清晰的,配置起来并不难(曾让笔者极度抓狂的是Freescale Kinetis系列的片子,系统时钟配置起来很麻烦 ...
- STM32系统时钟设置(标准库)
1.STM32F407时钟树 2.系统时钟相关的结构 HSE高速外部时钟信号 锁相环PLL 锁相环的主要作用就是对时钟进行倍频,然后把时钟输出到各个功能部件.PLL有两个,一个主PLL,另一个是专用的 ...
- STM32系统时钟设置,采用外部有源晶振相关配置问题
今天在调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变.程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢. 查 ...
- 基于Java毕业设计疫情下的进出口食品安全信息管理系统源码+系统+mysql+lw文档+部署软件
基于Java毕业设计疫情下的进出口食品安全信息管理系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计疫情下的进出口食品安全信息管理系统源码+系统+mysql+lw文档+部署软件 本源 ...
- java计算机毕业设计微服务”架构下新闻头条的设计与实现源码+系统+数据库+lw文档
java计算机毕业设计微服务"架构下新闻头条的设计与实现源码+系统+数据库+lw文档 java计算机毕业设计微服务"架构下新闻头条的设计与实现源码+系统+数据库+lw文档 本源码技 ...
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
1.exit()函数 exit(int n) 其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...
- android ctrl 左键鼠标左键直接打开xml文件夹,设置Android Studio通过Ctrl+左键查看源码...
开始学习android的时候希望能点进系统提供的控件中查看源码,但是实际操作发现,看到的每个源文件方法都是抛出的Exception,所以想要设置成可以直接查看具体实现,记录下我自己的操作方法. 1.首 ...
- 我在windows10下,使用CMake gui 编译krita源码,CMake gui报错:LibMyPaint_DIR-NOTFOUND
系列文章目录 文章目录 系列文章目录 前言 一.原因 二.解决 1.引入库 前言 我在windows10下,使用CMake gui 编译krita源码 where is the source code ...
最新文章
- 用tcpdump查看端口包
- 史上首次,强化学习算法控制核聚变登上Nature:DeepMind让人造太阳向前一大步...
- 50 种系统免遭黑客侵袭的方法 [2017 年版]
- 在线人员统计系统php,PHP统计当前在线人数 - 案例源码
- JZOJ 5257. 小X的佛光
- java 定义一组常量用什么最好_Java语言中定义常量注意事项解析
- 又跌!6月全国程序员工资新统计,太扎心
- python开发自动化创建一个任务下发到手机_如何利用Fabric自动化你的任务
- 技术分享|前端性能 关键性能指标以及测量工具介绍
- MyBatis之输入与输出(resultType、resultMap)映射
- 编译安装时的--prefix参数的使用方法,很实用,mark一下
- 开源包管理器Homebrew被曝 RCE,影响 macOS 和 Linux 系统
- zip、rar文件格式
- journalctl用法详解
- 最短路算法模板(Dijkstra、Bellman_ford、spfa、Floyd)
- 打蚊子表情包_打死蚊子表情包 - 打死蚊子微信表情包 - 打死蚊子QQ表情包 - 发表情 fabiaoqing.com...
- ⭐❤️sqlite数据库使用大全❤️⭐
- 【打卡算法】 26、删除有序数组中的重复项 算法解析
- LINQ分页和排序,skip和Take 用法
- oppo小布机器人_OPPO小布助手2.0强势来袭 三大版块迎来重大升级
热门文章
- 预测数据时数据类型是object导致报错TypeError: unsupported operand type(s) for -: ‘str‘ and ‘float‘
- Nginx 502报错(django+nginx,而非php-fmp)
- 利用计算机语言进行并行性描述,有没有一种语言可以利用大规模并行计算机?...
- Lua虚拟机中的数据结构与栈
- PyCharm Active Code Generator
- $.each()和$().each(),以及forEach()的用法
- (转载) Android两个子线程之间通信
- 新浪sae平台进行数据库的连接
- BGP双线的真真假假
- Log4J 1.x 配置详解