系统初始化函数SystemInit讲解

发布者:Jinyu521最新更新时间:2022-01-15 来源: eefocus关键字:系统初始化函数  stm32 手机看文章 扫描二维码
随时随地手机看文章

要求前置技能:

 需了解系统时钟源相关知识:STM32时钟系统

 本文以HSE外接8MHz晶振,PLL倍频9倍得到72MHz的系统时钟为讲解背景


一,系统初始化函数SystemInit:

 文件路径:USER->system_stm32f10x.c->头文件system_stm32f10x.h中SystemInit(void)

 在system_stm32f10x.c文件中找到SystemInit(void)源码:

/**

  * @brief  Setup the microcontroller system

  *         Initialize the Embedded Flash Interface, the PLL and update the

  *         SystemCoreClock variable.

  * @note   This function should be used only after reset.

  * @param  None

  * @retval None

  */

void SystemInit (void)

{

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;    //RCC_CR寄存器最低位置1:打开HSI(内部高速时钟8M)


  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else                      //stm32f103ZET6为大容量芯片HD

  RCC->CFGR &= (uint32_t)0xF0FF0000;     //RCC_CFGR寄存器初始化

#endif /* STM32F10X_CL */


  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;    //将RCC_CR寄存器HSEON,CSSON,PLLON位置0


  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;    //将RCC_CR寄存器HSEBYP位置0


  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

  RCC->CFGR &= (uint32_t)0xFF80FFFF;   //将RCC_CFGR寄存器PLLSRC, PLLXTPRE,                         //PLLMUL,USBPRE/OTGFSPRE位置0


#ifdef STM32F10X_CL

  /* Reset PLL2ON and PLL3ON bits */

  RCC->CR &= (uint32_t)0xEBFFFFFF;


  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x00FF0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#else                      //stm32f103ZET6为大容量芯片HD

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;        //关闭所有的中断和对应的位(初始化中断)

#endif /* STM32F10X_CL */


#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl();

  #endif /* DATA_IN_ExtSRAM */

#endif


  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

  /* Configure the Flash Latency cycles and enable prefetch buffer */

  SetSysClock();


#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

#endif

}


二,默认定义系统时钟:


#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */

 #define SYSCLK_FREQ_24MHz  24000000

#else

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */

/* #define SYSCLK_FREQ_24MHz  24000000 */

/* #define SYSCLK_FREQ_36MHz  36000000 */

/* #define SYSCLK_FREQ_48MHz  48000000 */

/* #define SYSCLK_FREQ_56MHz  56000000 */

#define SYSCLK_FREQ_72MHz  72000000   //默认定义系统是中文为72MHz

#endif


 在这里可以修改系统时钟值

三,SetSysClock(Void)

/**

  * @brief  Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.

  * @param  None

  * @retval None

  */

static void SetSysClock(void)

{

#ifdef SYSCLK_FREQ_HSE

  SetSysClockToHSE();

#elif defined SYSCLK_FREQ_24MHz

  SetSysClockTo24();

#elif defined SYSCLK_FREQ_36MHz

  SetSysClockTo36();

#elif defined SYSCLK_FREQ_48MHz

  SetSysClockTo48();

#elif defined SYSCLK_FREQ_56MHz

  SetSysClockTo56();

#elif defined SYSCLK_FREQ_72MHz     //默认定义的系统时钟是72MHz

  SetSysClockTo72();

#endif


四,SetSysClockTo72(Void)

/**

  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2

  *          and PCLK1 prescalers.

  * @note   This function should be used only after reset.

  * @param  None

  * @retval None

  */

static void SetSysClockTo72(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;


  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/

  /* Enable HSE */

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);    //使能HSE:RCC_CR_HSEON=0x00010000(修改的是第16位HSEON)


  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;     //开启并就绪:RCC_CR_HSERDY=0x00020000(第17位HSERDY置1)

    StartUpCounter++;

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); //循环直到HSE稳定


  if ((RCC->CR & RCC_CR_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;               //就绪后赋值标志位HSEStatus

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }


  if (HSEStatus == (uint32_t)0x01) //判断就绪

  {

    /* Enable Prefetch Buffer */

    FLASH->ACR |= FLASH_ACR_PRFTBE;


    /* Flash 2 wait state */

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;     //cpu的速度比芯片速度快的多        设置FLASH等待:两个等待状态


    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;//配置AHB预分频器分频系数为1,使HCLK = SYSCLK=72M

                                                                                      //RCC_CFGR_HPRE_DIV1=0x00000000(见手册)


    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;//配置PCLK2预分频器分频系数为1,使PCLK2 = HCLK=72M

                                                                                        //RCC_CFGR_PPRE2_DIV1=0x00000000(见手册)

    /* PCLK1 = HCLK/2 */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;//设置PCLK1预分频器分频系数为2,使PCLK1 = HCLK/2=36M

                                                                                       //RCC_CFGR_PPRE1_DIV2=0x00000400(见手册)

                                                                                       //RCC->CFGR第10,9,8位设置为100 (设置为2分频)

#ifdef STM32F10X_CL

    /* Configure PLLs ------------------------------------------------------*/

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */


    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);


    /* Enable PLL2 */

    RCC->CR |= RCC_CR_PLL2ON;

    /* Wait till PLL2 is ready */

    while((RCC->CR & RCC_CR_PLL2RDY) == 0)

    {

    }


    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |

                            RCC_CFGR_PLLMULL9);

#else                         //stm32f103ZET6为大容量芯片HD

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

                                        RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//HSE为时钟源且PLL倍频系数为9(8*9=72兆)

#endif /* STM32F10X_CL */


    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;          //使能PLL时钟,RCC->CR寄存器第24位置1

                          //RCC_CR_PLLON=0x01000000


    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)  //等待PLL时钟源就绪    

                            //RCC_CR_PLLRDYRCC->CR寄存器第25位

    {

    }


    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));//配置PLL作为系统时钟来源

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;        //RCC_CFGR_SW_PLL=0x00000002(RCC->CFGR第1,0位设置为10,见手册)


    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock

[1] [2]
关键字:系统初始化函数  stm32 引用地址:系统初始化函数SystemInit讲解

上一篇:STM32 LED跑马灯-位操作
下一篇:STM32 串口通信实验

推荐阅读最新更新时间:2024-11-08 12:32

STM32-(33):低功耗模式与唤醒
功耗管理 很多单片机都有低功耗模式,STM32也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的HCLK为CPU提供时钟,内核执行程序代码。当CPU不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。 用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 STM32的低功耗模式有3种: 睡眠模式(CM3内核停止,外设仍然运行) 停止模式(所有时钟都停止) 待机模式(1.8V内核电源关闭) 在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要2uA左右的电流。停机模式是次低功耗的,其典型的电流消耗在20uA左右。最后就是睡眠模式了。用户可
[单片机]
STM32-(33):低功耗模式与唤醒
STM32之独立看门狗(IWDG)和窗体看门狗(WWDG)
  之前有很风靡的游戏,名字叫《看门狗》。该游戏用了很新的引擎技术,打造出了一个辽阔庞大的世界,内容是玩家Aiden Pearce(主角)是一名精通黑客技术的高手,当时的世界是处于所有物品都被置了电子设备控制,整个城市都在依赖着他们,主人公决定利用自己的技术为这个世界惩奸除恶。        这个游戏以极高的自由度、出色的游戏质量与丰富的游戏内容被业界公认为开启次世代游戏的大门之作,该游戏被IGN评为年度最佳射击游戏(下载地址: http://down.ali213.net/pcgame/WatchDogs.html 有机会一定玩玩。) 二 开门见山:     下面言归正传,在工作中用的STM32需要使用看
[单片机]
<font color='red'>STM32</font>之独立看门狗(IWDG)和窗体看门狗(WWDG)
STM32 基础系列教程 1- CubeMX+GPIO
前言 学习stm32 GPIO 的使用,设置某一GPIO引脚为输出功能,将对应引脚拉高或拉低输出,同时学会初步认识STM32最新的HAL库的使用, 用代码实现控制GPIO引脚输出产生周期出1s 占空比为50%的PWM波。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 新建STM32 CUBEMX 工程, 双击桌面STM32CubeMX工具 在CubeMX中菜单中点 File à New Project … 在新弹出的界面
[单片机]
<font color='red'>STM32</font> 基础系列教程 1- CubeMX+GPIO
STM32 HardFault_Handler 硬件错误 解决办法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。 STM32出现硬件错误可能有以下原因: (1)数组越界操作; (2)内存溢出,访问越界; (3)堆栈溢出,程序跑飞; (4)中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。 1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR
[单片机]
<font color='red'>STM32</font> HardFault_Handler 硬件错误 解决办法
STM32时钟代码的解析,以及启动函数的指针跳转
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //HSE表示使用外部时钟,HSI表示使用的是内部时钟 RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 打开外部时钟 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; //时钟源设置 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; //表示6倍频率,如果外部时钟源是8MHZ
[单片机]
详解什么是STM32对其Flash的保护
如果你还不了解什么是STM32对其Flash的保护,那么就由小橙同学来给你讲解一下什么是STM32的Flash保护! 什么是Flash? STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。 还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。 通常Flash包含几大块,这里以F40x为例: 主存储器:用来存放用户代码或数据。 系统存储器:用来存放出厂程序,一般是启动程序代码。 OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。 选项字节:存放与芯片资源或属性相关的配置信息。 什么是STM32对内部Flash的保
[单片机]
详解什么是<font color='red'>STM32</font>对其Flash的保护
2021年STM32中国峰会在深圳举行,ST携合作伙伴展示创新成果
2021年STM32 中国峰会在深圳举行,意法半导体携合作伙伴展示创新成果 • 以 芯”生态、“助”安全、“连”未来为主题,2021年STM32峰会聚焦工业与安全、人工智能与传感技术、云接入与连接、生态与创新 • 在为期两天的线下/线上展会及分会场中,意法半导体与35个合作伙伴将带来200多个方案演示和55场技术研讨会 2021年4月27日,中国深圳 – 服务多重电子应用领域的全球半导体领导者意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM) 将于4月28-29日在深圳华侨城洲际大酒店举行2021年STM32中国峰会。 作为备受瞩目的业界年度盛会,第五届STM32峰会即将拉开帷幕。
[单片机]
STM32中断优先级实例
本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。 设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。 这3个中断的优先级设置如下: EXTI Line3: PreemptionPriority = PreemptionPriorityValue SubPriority = 0 EXTI Line4: PreemptionPriority = 0 SubPriority = 1 Sys
[单片机]

推荐帖子

Windows CE下做导航器,用什么电子地图比较好
WindowsCE下做导航器,用什么电子地图比较好???想知道各种电子地图的性价比啊??谢谢了!WindowsCE下做导航器,用什么电子地图比较好这个好像不是技术问题,是个商务问题。想知道性价比,就打电话,一个一个地图供应商去问。呵呵,up~灵图,城际通,凯立德免费的最好诶。。。。lz最好根据自己的情况去问下貌似有的地图做二次开发不太方便去专门的GIS网站问问吧,几年前做过这方面。都是很好的建议!值得学习lz要干嘛?我想做做GPS车导!地图不知道哪一种比较好一点
topone654 嵌入式系统
WinCE+CDMA拨10000号成功,连接网络失败:no carrier
拨打10000号成功,在用wince网络和拨号连接时,返回没有载波信息(nocarrier)错误这会是什么原因?WinCE+CDMA拨10000号成功,连接网络失败:nocarrier没有载波信息(nocarrier)错误???没遇到过,帮顶下。你的MODEM是那个型号?用CE的RIL实现的?很有才啊!网络注册成功了吗?学习学习,呵呵。引用2楼xqhrs232的回复:你的MODEM是那个型号?用CE的RIL实现的?很有才啊! 型号还没搞清楚引用2
shanghai WindowsCE
关于单片机串口方式3的发送问题
各位大佬好,现在学单片机做到第五个双机通讯串口实验,发现一个问题,51单片机串口方式3,发送0xaa后,用protues仿真看,会看到AAFF成对出现,如果发0x11,0x22等小数据,则不会有ff附带产生,我百度查了好多资料,还是不能解决,以下是我的简单程序,以及protues仿真,小白真心坐等解答 //甲机发送程序 #include sbitp=PSW^0;//P位为PSW寄存器的第0位,即奇偶校验位 #defineucharunsigned
woaidpj 51单片机
球形六足机器人宠物——SensorTile模块使用说明
详细说明见作品说明书!!!!正常情况下,由于六足机器人各个关节机械结构存在加工误差、安装误差,机器人爬行时表现出极强的各向异性特征,即机器人前进爬行时的运动轨迹是椭圆弧而不是直线。本次设计借鉴四轴飞行器导航原理,利用惯性导航模块为机器人爬行加入矫正反馈环节。惯性导航模块由三轴陀螺仪、三轴加速度计、三轴磁力计三个部分组成。三轴陀螺仪和三轴加速度计可通过数据融合算法合成得到YZ平面、XZ平面的欧拉角位移,XY平面欧拉角位移通过三轴磁力计补偿获取。本次设计选用SensorTil
liren1979 MEMS传感器
有关lm3s6911中的systick的疑问
小弟我有个疑问,在配置systick的时候,如果像下面代码配置systick重载值为系统时钟频率除以1000。是不是就代表1ms进一次systick中断?SysTickPeriodSet(SysCtlClockGet()/1000)复制代码有关lm3s6911中的systick的疑问Tim3停产了,还要学吗这个无关学不学的问题,公司用到了。而且我只是对SysTick延时时间怎么算有疑问回复沙发tangguanglun的帖子查了点资料,自己回答下时钟周期等于时钟频率的倒数
wwwming0329 微控制器 MCU
# STM32H7S78-DK 开发套件三周目评测:简单声音采集保存之使用 SD 卡读写的实现与分析
该项目包括了保存录音、按键控制、串口控制、频率成分分析与分类等功能,逐步进行完成。首先进行sd读写的开。在嵌入式开发中,尤其在无操作系统的裸机环境下,SD卡是实现大容量数据存储的重要组件。##1.硬件连接在开始CubeMX配置前,需要先了解引脚的配置。###1.1数据引脚连接-**D0-D3**:将SD卡的数据引脚D0-D3分别连接到STM32的PC8、PC9、PC10、PC11。-**CMD**:将SD卡的CMD引脚连接到STM32的PD2,用于命令传输。-
ccccccc@ stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved