打印
[APM32F1]

APM32F103使用HSI配置时钟

[复制链接]
1132|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcufae|  楼主 | 2023-7-31 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.当 HSE 故障的时候,如果 PLL 的时钟来源是 HSE,那么当 HSE 故障的时候,不仅
HSE 不能使用,连 PLL 也会被关闭,这个时候系统会自动切换 HSI 作为系统时钟,此时
SYSCLK=HSI=8M,如果没有开启 CSS 和 CSS 中断的话,那么整个系统就只能在低速率运
行,这是系统跟瘫痪没什么两样。如果开启了 CSS 功能的话,那么可以当 HSE 故障时,在
CSS 中断里面采取补救措施,使用 HSI,并把系统时钟设置为更高的频率,最高是 64M,
64M 的频率足够一般的外设使用,如:ADC 、SPI、I2C 等。但是这里就又有一个问题了,
原来 SYSCLK=72M,现在因为故障改成 64M,那么那些外设的时钟肯定被改变了,那么外
设工作就会被打乱,那我们是不是在设置 HSI 时钟的时候,也重新调整外设总线的分频因
子,即 AHB,APB2 和 APB1 的分频因子,使外设的时钟达到跟 HSE 没有故障之前一样。
但是这个也不是最保障的办法,毕竟不能一直使用 HSI,所以当 HSE 故障时还是要采取报
警措施。下面我们给出个使用 HSI 配置系统时钟例子。
2.使用 HSI 配置系统时钟
void SetSysClock(void)
{
    __IO uint32_t HSIStartUpStatus = 0;
    RCM_Reset();
    RCM_EnableHSI();
    HSIStartUpStatus = RCM->CTRL_B.HSIRDY**;
    if (HSIStartUpStatus == SUCCESS)
    {
        FMC_EnablePrefetchBuffer();
        FMC_ConfigLatency(FMC_LATENCY_2);
        RCM_ConfigAHB(RCM_AHB_DIV_1);
        RCM_ConfigAPB2(RCM_APB_DIV_1);
        RCM_ConfigAPB1(RCM_APB_DIV_2);
        RCM_ConfigPLL(RCM_PLLSEL_HSI_DIV_2, RCM_PLLMF_16);//16倍频
        RCM_EnablePLL();
        while (RCM_ReadStatusFlag(RCM_FLAG_PLLRDY) == RESET);
        RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);
        while (RCM_ReadSYSCLKSource() != RCM_SYSCLK_SEL_PLL);
    }
    else
    {
        while (1);
    }
}
3.注意点:
(1)    RCM_ConfigPLL(RCM_PLLSEL_HSI_DIV_2, RCM_PLLMF_16);//16倍频
此条语句使用了最大的16倍频,HSI是2分频之后才被选择作为PLL时钟源的,接着后面再经过倍频,
倍频可以是根据自己选择,最大是16倍频,所以HSI的最大频率是64M,使用的时候要特别注意一点。
(2)  FMC_ConfigLatency(FMC_LATENCY_2);
此条语句是作为等待周期的设置的,当频率在0 ~24MHZ的时候,使用0等待周期,在24~48MHZ的时候,
使用1等待周期,在48~72MHZ的时候,使用2等待周期,我们设置的HSI是64MHZ,使用2等待周期就可以了,
如果HSI改为48MHZ,建议改为1等待周期。
(3)else 语句后面可以自己添加一些语句。
如果 HSI 开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理,比如做一个标志位,当
HSI失败的时候,就可以检查这个标志位。

使用特权

评论回复
沙发
cen9ce| | 2023-11-16 11:29 | 只看该作者
我记得好像有那种自动切换时钟的方式,非常好用

使用特权

评论回复
板凳
y1n9an| | 2023-11-16 12:34 | 只看该作者
一般故障之后得重启,重启才能执行这种逻辑吧

使用特权

评论回复
地板
su1yirg| | 2023-11-16 14:13 | 只看该作者
你这种方式倒是挺好用

使用特权

评论回复
5
lamanius| | 2023-11-16 15:28 | 只看该作者
但是我觉得吧,这种操作好像没啥意义,硬件还得重启一次吧

使用特权

评论回复
6
t1ngus4| | 2023-11-16 16:33 | 只看该作者
你是把它放在主函数里么?还是初始化的时候用就行?

使用特权

评论回复
7
zhizia4f| | 2023-11-16 18:41 | 只看该作者
只要不被静电打坏,好像晶振也不会有啥问题吧

使用特权

评论回复
8
tax2r6c| | 2023-11-17 07:04 | 只看该作者
我有点不理解,晶振用这么久,我都没坏过,你这咋能把晶振搞坏掉啊?

使用特权

评论回复
9
kaif2n9j| | 2023-11-17 09:22 | 只看该作者
可以直接配置一种,如果HSE不好用,直接跳转到HIS的,我记得ST就有这个

使用特权

评论回复
10
lix1yr| | 2023-11-17 10:05 | 只看该作者
话说,如果不是为了完全兼容ST,是不是极海的主频可以设置更高

使用特权

评论回复
11
suw12q| | 2023-11-17 11:30 | 只看该作者
HIS的haul,最高能跑到64MHz?不能达到72MHz啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

8

帖子

0

粉丝