历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2018年10月10日 | STM32系统时钟的监控和切换

2018-10-10 来源:eefocus

在前一段时间的公司的项目中要求用到STM32这款处理器在外部晶振异常的情况下自动的切换到内部晶振,在网上找了N多的资料终于在网上找到了一个官方的研讨会的PPT里面简单的介绍了一下,于是顺着这个思路试着去编写代码,没想到官方提供的思路还蛮靠谱!
—————————————————我是华丽的分割线———————————————————
[转载]STM32系统时钟的监控和切换

[转载]STM32系统时钟的监控和切换

[转载]STM32系统时钟的监控和切换
—————————————————我是华丽的分割线———————————————————
函数一、

void INIT_CLOCK(void)
{   
#if 1
    ErrorStatus HSEStartUpStatus;
    RCC_DeInit();  //复位RCC寄存器
    RCC_HSEConfig(RCC_HSE_ON);  //设置外部高速晶振 (HSE)
    HSEStartUpStatus = RCC_WaitForHSEStartUp();  //等待 HSE 起振
#if 1
    //判断外部晶振是否OK,如果OK就用外部晶振,如果不行,就用内部晶振,优先用外部晶振。
    if(HSEStartUpStatus == SUCCESS)
    {
        RCC_ClockSecuritySystemCmd(ENABLE); //启动时钟安全系统 CSS
        //外部晶振配置
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置ABH时钟(HCLK):HCLK=SYSCLK
        //设置PLL时钟源及倍频系数, PLLCLK = HSE*PLLMul = 8*8 = 64MHz 实际是:8*8=64MHz
        RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_2);
        RCC_PLLCmd(ENABLE); //使能PLL

        //检查指定的RCC标志位设置与否
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait till PLL is ready

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //设置系统时钟 (SYSCLK)

        //返回作用系统时钟的时钟源
        // Wait till PLL is used as system clock source
        while(RCC_GetSYSCLKSource() != 0x08);
    }
    else
#endif
    {
        //内部晶振配置
        RCC_DeInit();  //复位RCC寄存器
        RCC_HSEConfig(RCC_HSE_OFF);       //关闭外部晶(HSE)
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置ABH时钟(HCLK):HCLK=SYSCLK
        //设置PLL时钟源及倍频系数, PLLCLK = HSI/2*PLLMul = 8/2*12 = 48MHz 实际是:48MHz
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
        RCC_PLLCmd(ENABLE); //使能PLL

        //检查指定的RCC标志位设置与否
        //while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait till PLL is ready

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //设置系统时钟 (SYSCLK)

        //返回作用系统时钟的时钟源
        // Wait till PLL is used as system clock source
        while(RCC_GetSYSCLKSource() != 0x08);
    }    
#endif
}
—————————————————我是华丽的分割线———————————————————
在上面哪一个函数中只有在外部晶振启动初始化中才启动了时钟安全系统(PS:红色加粗部分)因为只有外部晶振初始失败再切换至内部晶振,此函数是外部晶振启动优先只有外部晶振启动失败再去启动内部晶振。

函数二、

void NMIException(void)
{
    if(RCC_GetITStatus(RCC_IT_CSS) != RESET)
    {
#if 0                 //内部晶振配置
        RCC_DeInit();  //复位RCC寄存器
        RCC_HSEConfig(RCC_HSE_OFF);       //关闭外部晶(HSE)
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置ABH时钟(HCLK):HCLK=SYSCLK
       //设置PLL时钟源及倍频系数, PLLCLK = HSI/2*PLLMul = 8/2*12 = 48MHz 实际是:48MHz
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
        RCC_PLLCmd(ENABLE); //使能PLL

        //检查指定的RCC标志位设置与否
        //while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //设置系统时钟 (SYSCLK)

        //返回作用系统时钟的时钟源
        // Wait till PLL is used as system clock source
        while(RCC_GetSYSCLKSource() != 0x08);
        CLKOUT_8M_INIT();    //PA8端口时钟输出为24025提供8MHz时钟

        RCC_ITConfig(RCC_IT_HSIRDY,ENABLE);     //使能 HSI就绪中断
        RCC_ITConfig(RCC_IT_PLLRDY,ENABLE);     //使能 PLL就绪中断
#else
        NVIC_SystemReset();                     //重启
        RCC_ITConfig(RCC_IT_HSERDY,ENABLE);     //使能 HSE就绪中断
        RCC_ITConfig(RCC_IT_PLLRDY,ENABLE);     //使能 PLL就绪中断       
#endif
        RCC_ClearITPendingBit(RCC_IT_CSS);      //清除时钟安全系统中断的挂起位
    }
}
—————————————————我是华丽的分割线———————————————————
NMIException()函数是晶振异常函数的处理函数在异常中断函数中调用此函数,红色部分是内部晶振初始如果所以红色部分的代码可以实现外部晶振“无缝”的切换到内部晶振(如果是用于特定的场合如:医疗设备可以使用此段代码),但由于我们产品对实时性要求不是很高我还是决定重新重启设备再初始化晶振。
函数三、

void NMI_Handler(void)
{
    NMIException();
}
—————————————————我是华丽的分割线———————————————————
NMI_Handler()函数是在STM32的库文件中的“stm32f0xx_it.c”中的我们把晶振异常处理函数放置此不可屏蔽的异常中断函数中就可以实现晶振异常时的相当于处理。

—————————————————我是华丽的分割线———————————————————
int main(void)
{
    SystemInit();
    INIT_CLOCK();        //使用HSI时钟初始化系统时钟
    for(;;)
    {
     ......
    }
}

推荐阅读

史海拾趣

DS-IMP公司的发展小趣事

DS-IMP公司的前身是一家美国公司,在转移到中国大陆后,面临了技术转移和本土化的挑战。公司迅速组建了一支由资深工程师和技术专家组成的团队,他们与美国的原团队紧密合作,成功地将核心技术从美国转移到宁波的工厂。在本土化过程中,公司不仅保留了原技术的精髓,还根据中国大陆的市场需求和资源特点,对部分技术和产品进行了优化和升级。这一过程不仅提升了公司的技术实力,也为公司在中国市场的快速发展奠定了坚实基础。

Eurotech公司的发展小趣事

Eurofarad公司深知品质是企业生存和发展的根本。因此,公司一直注重品质管理,建立了严格的质量控制体系。同时,公司还不断提升服务水平,为客户提供全方位的售前咨询和售后服务。这些措施不仅提高了客户的满意度和忠诚度,还为公司的口碑和品牌形象增添了光彩。

DDP Engineered LED Solutions公司的发展小趣事

在LED照明产品的生产过程中,DDP Engineered LED Solutions公司始终坚守品质控制的原则。公司建立了严格的生产流程和质检标准,确保每一件产品都符合质量要求。同时,公司还积极引入先进的生产设备和管理系统,提升生产效率和产品质量。正是这些努力,让DDP的产品在市场上赢得了客户的信任和好评,为公司赢得了良好的口碑。

FILTRONETICS Inc公司的发展小趣事

FILTRONETICS Inc成立于1970年代,初期专注于滤波器技术的研发与生产。在那个时代,随着通信技术的快速发展,对高质量滤波器的需求日益增长。公司研发团队通过不懈努力,成功研发出了一种新型LC滤波器,该滤波器在频率选择性和插入损耗方面表现出色,迅速获得了市场的认可。这一技术突破不仅巩固了FILTRONETICS在滤波器领域的地位,也为公司的后续发展奠定了坚实的基础。

喜美克斯(Cvilux)公司的发展小趣事

随着公司规模的逐渐扩大,喜美克斯公司开始思考如何进一步拓展市场。他们深入研究市场趋势和消费者需求,制定了针对不同市场的精准营销策略。通过与当地合作伙伴的紧密合作,喜美克斯成功地将产品打入了多个新兴市场,实现了销售额的快速增长。

Arima Lasers Corp公司的发展小趣事

在激烈的市场竞争中,Arima Lasers Corp始终保持着创新的步伐。公司不断投入研发资源,探索激光技术在各个领域的应用潜力。其中,一项关于激光通信技术的创新项目引起了业界的广泛关注。这项技术利用激光束进行高速数据传输,具有传输速率快、安全性高等优点。随着该技术的商业化应用,Arima Lasers Corp在通信领域取得了重大突破,引领了市场变革的潮流。

问答坊 | AI 解惑

简易数控直流电源

简易数控直流电源  94年的题, 谁会做啊, 我想了解以下他的原理几过程. 我的邮箱,cf2928@163.com 要不谁告诉我那有我去下也行,谢了.…

查看全部问答>

【分享】mini2440开发板实现国际象棋人机对弈

前段时间买了2440开发板也没怎么搞,惭愧:$ 最近没啥其它事情就好好啃啃吧,哎……没什么基础啊,先欣赏下别人的东西吧 【mini2440开发板实现国际象棋人机对弈 】 我在机子上跑了一下,好像不太能跟电脑对弈啊,不知道哪个地方还有问题 ...…

查看全部问答>

闪电击中世界最高建筑哈利法塔

上面这张令人震惊的照片展示了世界最高建筑哈利法塔遭闪电击中时的场面。 照片的拍摄者是一位23岁名叫穆罕默德·哈姆丹的学生,来自巴基斯坦,目前在阿联酋攻读建筑工程学。当时,迪拜正遭受暴风雨的袭击。雷电中,高达828米的哈利法塔在紫色的 ...…

查看全部问答>

传输线和反射的经典文章

传输线和反射的经典文章…

查看全部问答>

U盘多盘符的问题

我在一个嵌入式系统中,主机在GET MAX LUN我已经返回01,但是主机并未显示2个盘符.仅仅出现了一个盘符 还需要做哪方面的工作…

查看全部问答>

VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包?

VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? ATE AT+CMGF=0 AT+CIMI   AT+CIMI获得IMSI  IMSI 国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别 ...…

查看全部问答>

DM642 编码器初始化

 /*进行SAA7121H的初始化*/ GPIO_RSET(GPVAL,0x0); addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/ /*将第0路的视频输入口的数据口设为高阻状态,   使能SCLK,将第27脚设为输入*/ _IIC_write(hSeeddm642i2 ...…

查看全部问答>

关于桥式整流

这是在空闲之际模拟的几张桥式整流和接电容的图片,希望能对大家有点用处。    大家注意看波形随着电容的变化而变化。…

查看全部问答>

2812 flash不能烧写

问题是这样的:我用flash烧写了一个控制电机的程序,不能运行,就把代码改了一下,再进行烧程序的时候就烧不进去啦,我也没有动“lock”和密码(在flash烧写的时候一直很小心的),怎么会锁住呢?很是不解。请EEWORLD老师和各位高手解答一下,谢谢 ...…

查看全部问答>

C题智能小车群

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 109197413  …

查看全部问答>