运动控制器34:STM32的复位与时钟及库函数

复位

系统复位

系统复位有5个来源

  1. NRST引脚的低电平
  2. IWDG
  3. WWDG
  4. 软件复位SW
  5. 低功耗管理复位
    如果设置了nRST_STDBY和nRST_STOP=1,则进入待机和停止模式时,将产生复位。
    • 在进入待机模式时产生复位
    • 进入停止模式时产生复位
      可以通过查看寄存器来知道复位的来源

电源复位

产生电源复位可能是上电和掉电,POR/PDR或者是从待机模式返回,芯片内部有一个20us的脉冲发出,此时可以保证芯片的复位。

备份域复位

备份区域的复位只影响备份区域,可以通过软件,或者VDD和VBAT两者都掉电的时候进行复位,这就是为什么要进行备份重启时,我们要取掉电池。

时钟

  • 三种时钟可以驱动系统时钟,HSE,HSI和PLL,内部有一个40KHZ的RC,用来保证看门狗的时钟RTC,RTC在停机后的自动唤醒。另外驱动RTC的时钟也可以选择内部的32.768KHZ的时钟。
  • 简单来说,外部的高速时钟就是晶振,低速时钟是32.768时钟,而内部的高速时钟是8M,低速时钟是40KHZ。


    RCC1.png

HSE时钟

外部高速时钟可以直接输入时钟,或者用晶振产生。

HSI时钟

时钟的精度不够,并且最大只有64M,不太推荐使用。

PLL

如果要用到USB接口,时钟必须设置为48M或者72M,可以优先选择72M

LSE

32.768KHZ的时钟,启动以后,要等待释放信号再进行下一步,和上面的晶振的要求一样。也可以用外部的32.768来提供,此时为旁路模式。

LSI

内部的低速时钟主要用于产生低功耗,在停机和待机模式下运行,提供看门狗和唤醒时钟。所有的内部时钟都有一个校准,可以用TIM5来进行校准。

系统时钟选择

系统复位后,HSI被选择为系统时钟,这个时候如果我们用到了HSE,需要进行切换。

时钟安全系统

如果系统出现故障,比如外部时钟坏了,此时首先关闭高级定时器的刹车,放置出现烧毁器件,同时将外部时钟通道关闭,并自动的切换到内部时钟。

RTC时钟

RTC是重要的时钟源,可以有三个来源,内部40K,外部32.768K和外部高速时钟的分频。

  • 32.768时钟时,重要电池还可以用,RTC都会运行
  • 内部40K,此时VDD如果没电,不能保证提供。
  • 外部高速时钟分频:当然不工作啦。

看门狗时钟

如果看门狗启动,40K的时钟强制打开。

时钟输出

如果设置为72M,相当于可以通过GPIO给外面输出:

  • 72M
  • 晶振时钟
  • 8M
  • PLL/2时钟

我们先来看一个典型的时钟配置的程序调用。

  1. 在MAIN函数中,最先调用BSP_Init
  2. 在BSP中,最先进行SystemInit
  3. 系统初始化函数中,调用了SetSysClock函数,里面根据不同的SYSCLK_FREQ_HSE调用了SetSysClockToHSE();
  4. 如果调用的是SetSysClockTo72,将时钟设置为72M

时钟都在system_stm32f10x.h里面进行了设置,标准的RCC库函数还有如下的函数可以使用:另外,还需要特别注意一下的符号的意义:

  • PCLK1 最大36,APB1的时钟
  • PCLK2 最大72M,APB2的时钟
  • HCLK 提供给外设的时钟,最大72M
  • SYSCLK 经AHB分频以后给HCLK,最大为72M

ADC时钟配置:ADCCLKConfig

分频设置

AdjustHSICalibrationValue

内部高速时钟校准,内部时钟不准。

AHBPeriphClockCmd

外设时钟设置,其中APB1PeriphClockCmd 和 APB2包括了哪些外设,要稍微留意一下。

备份寄存器复位:BackupResetCmd

清复位源的标志:ClearFlag

清中断ClearITPendingBit

如果设置时钟的中断, 比如:RCC_IT_LSIRDY: LSI ready interrupt

安全系统开启:ClockSecuritySystemCmd

去初始化DeInit

获取时钟频率GetClocksFreq

包括ADC,HCLK,PCLK1,PCLK2,SYSCLK

GetFlagStatus

GetITStatus

获取系统时钟源GetSYSCLKSource

HCLKConfig

也就是SYSCLK到HCLK的分频

HSEConfig LSEConfig

旁路还是用晶振

HSICmd LSICmd

内部8M是否使能

ITConfig

时钟输出:MCOConfig

PCLK1Config 外设时钟设置

PLLCmd PLL是否使能 PLLConfig

RTCCLKConfig RTCCLKCmd

三个时钟源

SYSCLKConfig 系统时钟

USBCLKConfig

WaitForHSEStartUp 等待晶振稳定

我们为了防止晶振坏了而导致系统直接挂调,可以设置一个RCC_USEHSI,再一次强调,此时钟又慢又不准!

void RCC_USEHSI(void)
{
    GPIO_InitTypeDef X;

    //PD0 PD1分配时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE );  //对端口D分配APB2高速时钟,并开启端口    重映射OSC_IN(PD0) OSC_OUT(PD1)

    //PD0_OSC_IN
    X.GPIO_Pin = GPIO_Pin_0;            //对要使用的端口引脚设定
    X.GPIO_Mode = GPIO_Mode_Out_PP;     //对要使用的端口引脚模式设定PP为推挽输出
    X.GPIO_Speed = GPIO_Speed_50MHz;    //对要使用的端口引脚频率设定50MHz
    GPIO_Init(GPIOD, &X);               //初始化GPIOD寄存器
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE );  //对端口D分配APB2高速时钟,并开启端口
    
    //PD1_OSC_OUT
    X.GPIO_Pin = GPIO_Pin_1;            //对要使用的端口引脚设定
    X.GPIO_Mode = GPIO_Mode_Out_PP;     //对要使用的端口引脚模式设定PP为推挽输出
    X.GPIO_Speed = GPIO_Speed_50MHz;    //对要使用的端口引脚频率设定50MHz
    GPIO_Init(GPIOD, &X);               //初始化GPIOD寄存器

    GPIO_ResetBits(GPIOD, GPIO_Pin_0);      //OSC_IN
    GPIO_ResetBits(GPIOD, GPIO_Pin_1);      //OSC_OUT
        
    GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);           //重映射OSC_IN OSC_OUT

    RCC_DeInit();                       //将外设 RCC寄存器重设为缺省值 
    RCC_HSICmd(ENABLE);                 //使能或者失能内部高速晶振(HSI) 
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET){}      //HSI 晶振就绪    HSI内部晶振 HSE外部晶振
    
    if(1)      //始终执行,方便关闭,内部时钟设置
    {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       //使能预取指缓存
        FLASH_SetLatency(FLASH_Latency_2);          //设置代码延时值为2个延时周期 
        RCC_HCLKConfig(RCC_SYSCLK_Div1);            //设置 AHB 时钟(HCLK)
        RCC_PCLK1Config(RCC_HCLK_Div2);             //设置低速 AHB 时钟(PCLK1)
        RCC_PCLK2Config(RCC_HCLK_Div1);             //设置高速 AHB 时钟(PCLK2)
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);     //设置 PLL 时钟源及倍频系数
        RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能    //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}     //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //设置系统时钟(SYSCLK)设置PLL为系统时钟源
        while(RCC_GetSYSCLKSource() != 0x08){}      //等待PLL成功用作于系统时钟的时钟源
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容