AC7801时钟配置流程

一 默认配置

在启动文件中,已经对时钟进行了初始化,默认按外部8M晶振,配置系统时钟为48MHZ,APB为系统时钟的2分频,为24MHZ。在system_ac780x.c文件中,可以找到下面这个系统初始化函数,里面有SetSysClock()函数,对时钟进行了初始化。

void SystemInit (void)
{
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
    SCB->VTOR = (uint32_t) &__Vectors;
#endif

    SystemCoreClock = SYSTEM_CLOCK;

    SetEflashClock();
    SetSysClock();
    CKGEN_SetAPBClockDivider(APBCLK_DIV);
    //SPM_EnableLVD(DISABLE);  //disable LVD if need
}

如果需要配置不一样的时钟,可以通过系统文件里的宏定义修改,但并不建议在系统文件上修改,可以自己写配置函数。

二 时钟模块简介

1.时钟源:
高速内部时钟(HSI):内部 RC 振荡器提供 8MHz 时钟源
外部高速时钟(HSE):外部 OSC 提供 4MHZ ~30MHz 晶振
低速内部时钟(LSI): 内部低速 RC OSC 提供 32KHz 时钟源
系统时钟 (SYSPLL): 提供高达 48MHz 的高速时钟

2.系统时钟框图

手册中的框图可以帮助我们更好的理解时钟的每个配置步骤。

输入频率:支持4~30MHZ
VCO = 输入频率 * FBKDIV / PREDIV
系统时钟 = VCO / POSDIV / SYSCLKDIV

同时,手册中也提供了典型的配置参数供参考。因为有些点的频率值是有限制的,比如VCO的频率范围是0.5GHZ~1.5GHZ,那么直接参考典型配置参考表就肯定不会有问题,找到合适的参数即可。

三 自定义时钟

以AC7801的开发板做测试,板子上外部晶振为8MHZ。这里以配置系统时钟为48MHZ,APB时钟为24MHZ为例。根据上面的参考表,可选择PREDIV = 1,FBKDIV = 96,POSDIV=16,VOC = 8*96/16 =48M。相关寄存器如下图,可知:SYSPLL1_PREDIV为0,SYSPLL1_POSDIV为8,SYSPLL1_FBKDIV为96。

为了直观的测试时钟的频率,用一个定时器,定时产生中断,在中断中翻转一个I/O电平,以此来测时钟频率。定时器初始化如下:定时器的时钟源为APB时钟24M,配置定时器装载值为24000000,则1S产生一次中断。

void TIMER_Config(void)
{
    TIMER_ConfigType  config; 
    memset(&config, 0, sizeof(config));
        
    config.periodValue = 24000000;           /*!< TIMER channel period value */
    config.linkModeEn = DISABLE ;         /*!< TIMER channel linkmode enable */
    config.interruptEn = ENABLE ;        /*!< TIMER channel interrupt enable */
    config.callBack = TIM_CallBack;   /*!< TIMER channel callback pointer */
    config.timerEn = ENABLE;            /*!< TIMER channel enable/disable */
    TIMER_Init(TIMER_CHANNEL0, &config);    //TIMER0初始化配置
}

1. 中断处理

void TIM_CallBack(void *device, uint32_t wpara, uint32_t lpara)
{
    if (wpara & TIMER_CHANNEL_TF_T**_Msk)
    {
        GPIOC->ODR ^= (1<<7);
    }
}

2.外部时钟配置——库函数

void SYS_CLOCK_HSE(void)
{
    /* check if xosc enable success? */
    if (SPM_EnableXOSC(ENABLE) == SUCCESS)
    {
        CKGEN_SetPLLReference(PLL_REF_EXTERNAL_OSC);//PLL参考时钟选择外部振荡器
    }
    else  /* if xosc enable fail, */
    {}

    /* set system clock divider */
    CKGEN_SetSysclkDiv(0);//系统时钟1分频
    /* check if pll enable success? */
    if (SPM_EnablePLL(ENABLE) == SUCCESS)/使能SYSPLL
    {
        CKGEN_SetPllPrevDiv(0);//PREDIV
        CKGEN_SetPllPostDiv(8);//PLL_POSDIV
        CKGEN_SetPllFeedbackDiv(96);//PLL_FBKDIV
        CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT);//系统时钟源选择PLL时钟
    }
    else  /* pll enable fail */
    {}
    CKGEN_SetAPBClockDivider(APBCLK_DIVIDER_2);//APB时钟为系统时钟2分频
}

3.外部时钟配置——寄存器

外部时钟的使能以及就绪标志,PLL使能以及就绪标志等,在第6章系统电源管理SPM模块下的SPM_PWR_MGR_CFG1寄存器里。
配置过程比较常规,使能时钟——>等待时钟就绪——>PLL时钟源选择——>时钟分频及倍频配置——>系统时钟源选择

void SYS_CLOCK_HSE_REG(void)
{
    SPM->PWR_MGR_CFG1 |= 1<<29;//外部高速时钟XOSC使能
    while((SPM->PWR_MGR_CFG1 &(0X80000000))==0)//等待XOSC就绪
    {}
  
    SPM->PWR_MGR_CFG1 |= (1<<27);//SYSPLL使能
    while((SPM->PWR_MGR_CFG1 &(0X40000000))==0)//等待PLL时钟就绪
    {}
    CKGEN->CTRL |= (1<<20);//PLL参考时钟选择外部振荡器

    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0x3<<30)))|(0<<30));          //PREDIV
    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0x1f<<25)))|(8<<25));        //POSDIV
    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0xff<<15)))|(96<<15));        //FBKDIV
                
    CKGEN->CTRL |= ((CKGEN->CTRL & (~(3<<4)))|(0<<4));        //系统时钟分频为1
    CKGEN->CTRL |= (1<<0);//系统时钟源选择PLL时钟
    CKGEN->CTRL |= (1<<8);//APB为系统时钟2分频
}

4.内部时钟配置——库函数

采用内部高速8M时钟源做配置

void SYS_CLOCK_HSI(void)
{
    CKGEN_SetPLLReference(PLL_REF_INTERAL_OSC);//PLL参考时钟选择内部振荡器
    CKGEN_SetPllPrevDiv(0);             //PREDIV
    CKGEN_SetPllPostDiv(8);             //POSDIV
    CKGEN_SetPllFeedbackDiv(96);    //FBKDIV
    CKGEN_SetSysclkDiv(0);              //系统时钟1分频
    /* check if pll enable success? */
    if (SPM_EnablePLL(ENABLE) == SUCCESS)
    {
        /* pll enable success,use pll output as system clock src */
        CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT);//系统时钟源选择PLL时钟
    }
    else
    {
        /* pll enable fail */
    }
    CKGEN_SetAPBClockDivider(APBCLK_DIVIDER_2);//APB为系统时钟2分频
}

5.内部时钟配置——寄存器

void SYS_CLOCK_HSI_REG(void)
{
    CKGEN->CTRL &= ~(1<<20);//PLL参考时钟选择内部振荡器
    SPM->PWR_MGR_CFG1 |= (1<<27);//SYSPLL使能
    while((SPM->PWR_MGR_CFG1 &(0X40000000))==0)//等待PLL时钟就绪
    {}        
        
    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0x3<<30)))|(0<<30));          //PREDIV
    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0x1f<<25)))|(8<<25));        //POSDIV
    CKGEN->SYSPLL1_CFG0 = ((CKGEN->SYSPLL1_CFG0 & (~(uint32_t)(0xff<<15)))|(96<<15));        //FBKDIV
                
    CKGEN->CTRL |= ((CKGEN->CTRL & (~(3<<4)))|(0<<4));        //SYSCLK_DIV,系统时钟1分频
    CKGEN->CTRL |= (1<<0);//系统时钟源选择PLL时钟
    CKGEN->CTRL |= (1<<8);//APB为系统时钟2分频
}

6.主函数

主函数中调用时钟初始化函数,并对TIMER0配置,同时需要对使用到的I/O进行配置。

int main(void)
{
    //SYS_CLOCK_HSE();
    SYS_CLOCK_HSE_REG();
    //SYS_CLOCK_HSI();
    //SYS_CLOCK_HSI_REG();
    TIMER_Config();
        
    GPIO_SetFunc(GPIOC, GPIO_PIN7, GPIO_FUN0);/*功能复用选择*/
    GPIO_SetDir(GPIOC, GPIO_PIN7, GPIO_OUT);
    GPIO_SetPinLevel(GPIOC, GPIO_PIN7, GPIO_LEVEL_HIGH);
    while(1)
    {
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/767997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100-普通数组2

文章目录 题目&#xff1a;轮转数组方法1-使用额外的数组方法2-三次反转数组 除自身以外数组的乘积方法1-用到了除法方法2-前后缀乘积法 题目&#xff1a;轮转数组 原题链接&#xff1a;轮转数组 方法1-使用额外的数组 方法1是自己写出来的。方法2参考的别人的&#xff0c;…

守护创新之魂:源代码防泄漏的终极策略

在信息化快速发展的今天&#xff0c;企业的核心机密数据&#xff0c;尤其是源代码&#xff0c;成为了企业竞争力的关键所在。然而&#xff0c;源代码的泄露风险也随之增加&#xff0c;给企业的安全和发展带来了巨大威胁。在这样的背景下&#xff0c;SDC沙盒作为一种创新的源代码…

C++——stack和queue类用法指南

一、stack的介绍和使用 1.1 stack的介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行插入与提取操作 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)

1.应用层如何操控PWM&#xff1a; 与 LED 设备一样&#xff0c; PWM 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX&#xff08;X 表示数字 0~7&#xff09;命名的文件夹&#xff0c;这八个文件夹其实就对应了…

同样的APP为何在Android 8以后网络感觉变卡?

前言 在无线网络技术不断发展的今天&#xff0c;Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏&#xff0c;Wi-Fi都在提供着便捷的互联网接入服务。然而&#xff0c;在安卓8.1后&#xff0c;为了进一步延长安卓设备的待机时间。原生安卓(A…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代&#xff0c;每一条动态可能成为我们情绪的小小触发器。今天&#xff0c;当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时&#xff0c;不禁心头一颤——如果这是我的另一半&#xff0c;哎呀&#xff0c;那画面&#xff0c;简直比烧烤摊还要“热辣”…

Qt安装配置教程

目录 一、下载Qt二、进行安装1、点击安装包&#xff08;QT6.7版本演示&#xff09;2、注册Qt账号3、选择安装的位置4、选择对应的组件 三、新建项目1、打开Qt Creator2、创建项目3、编辑名称和地址4、选择默认的CMake或切换成qmake构建5、选择自己的编译器&#xff0c;在此选择…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

jdk动态代理-基于反射的动态代理

JDK动态代理的示例图&#xff0c;下图的绿色箭头表示实现的关系&#xff0c;白色虚线表示依赖关系&#xff0c;target表示被ProxyFactory的target成员表示代理类对象&#xff0c;由ProxyFactory传入的Object参数初始化&#xff0c;接着调用getProxyInstance函数利用反射来返回代…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

02:项目1 (按键点灯)

按键点灯 1、嘉立创EDA的简要介绍2、硬件的选型与原理图设计3、PCB设计4、下单啦 1、嘉立创EDA的简要介绍 1、EDA的基础设置 2、新建工程 2、硬件的选型与原理图设计 ①在EDA软件按下 shiftf 打开嘉立创商城&#xff0c;然后在里面选型 ②打开数据手册&#xff0c;能看到基本…

【FDTD 仿真案例解析】

平面结热电子光探测器是一种基于热电子效应的光探测器&#xff0c;其工作原理是利用光子的能量激发金属表面的热电子&#xff0c;从而产生电流。 激发光学Tamm态是指在金属-介质结界面上的电磁场分布出现共振现象&#xff0c;形成一种特殊的表面态。这种表面态具有高度局域化的…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Spark join数据倾斜调优

Spark中常见的两种数据倾斜现象如下 stage部分task执行特别慢 一般情况下是某个task处理的数据量远大于其他task处理的数据量&#xff0c;当然也不排除是程序代码没有冗余&#xff0c;异常数据导致程序运行异常。 作业重试多次某几个task总会失败 常见的退出码143、53、137…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录 微博社交登录图示原理前置准备实现流程完整代码 参考 微博社交登录 OAuth&#xff1a; OAuth&#xff08;开放授权&#xff09;是一个开放标准&#xff0…

qt6 通过http查询天气的实现

步骤如下&#xff1a; cmakelist 当中&#xff0c;增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中&#xff0c;增加如下配置&#xff0c;作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

6.Android逆向协议-配置FD抓包环境

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;5.Android逆向协议-初识HTTP和HTTPS协议 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.…