datasheet

STM32的系统时钟与SystemInit函数

2019-06-14来源: eefocus关键字:STM32  系统时钟  SystemInit函数

以上在stm32f4xx中文参考手册的截图


SYSCLK时钟的来源有3个分别是 HSI  HSE PLL


我们主要的时钟有 低速的内部时钟  LSI   RC震荡产生 32KHZ


                               低速的外部时钟 LSE  32.768KHZ晶振


                              高速的内部时钟  HSI  RC震荡16MHZ


                               高速的外部时钟 HSE  一般为8Mhz


一般情况我们的SYSCLK时钟选择PLLCLK


看看我们的函数是怎么操作时钟分配的!

启动文件首先先配置时钟然后在运行用户主函数,打开SystemInit函数


 


**

  * @brief  Setup the microcontroller system

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

  *         SystemFrequency variable.

  * @param  None

  * @retval None

  */

void SystemInit(void)

{

  /* FPU settings ------------------------------------------------------------*/

  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

  #endif

  /* Reset the RCC clock configuration to the default reset state ------------*/

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;


  /* Reset CFGR register */

  RCC->CFGR = 0x00000000;


  /* Reset HSEON, CSSON and PLLON bits */

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


  /* Reset PLLCFGR register */

  RCC->PLLCFGR = 0x24003010;


  /* Reset HSEBYP bit */

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


  /* Disable all interrupts */

  RCC->CIR = 0x00000000;


#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)

  SystemInit_ExtMemCtl(); 

#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

         

  /* Configure the System clock source, PLL Multiplier and Divider factors, 

     AHB/APBx prescalers and Flash settings ----------------------------------*/

  SetSysClock();


  /* Configure the Vector Table location add offset address ------------------*/

#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

}

以上为整个代码


/* FPU settings ------------------------------------------------------------*/

  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

  #endif

这个是设置FPU


/* Reset the RCC clock configuration to the default reset state ------------*/

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;


CR寄存器的第0位置1,其他位保持不变 ,HSI振荡器打开


/* Reset CFGR register */

  RCC->CFGR = 0x00000000;

CFGR寄存器全都设0,对其复位


/* Reset HSEON, CSSON and PLLON bits */

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

将对cr寄存器设置‭,1111 1110 1111 0110 1111 1111 1111 1111‬‬将第16位19位24位置0,其他位保持不变


/* Reset PLLCFGR register */

  RCC->PLLCFGR = 0x24003010;

‭00100100(4)  0           0         0000  00 (2)  0      011000000(192)                    010000‬(16)


/* Reset HSEBYP bit */

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


/* Disable all interrupts */

  RCC->CIR = 0x00000000;

复位


 再来看看  SetSysClock();函数


关键字:STM32  系统时钟  SystemInit函数

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic464652.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:keil+stm32+JTAG利用swd方式进行printf输出
下一篇:STM32-使用定时器做延时函数时遇到的坑

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

用于stm32Discovery的图像转代码取模小工具

最近拿着st的官方板子在开发图形界面,看了下代码是直接把整个像素32bit拷贝到控制器中Graphic RAM(就是一块SDRAM)中的,所以以往遇到的生成器都不能用,在内部则又是转换费时费力,占用内存所以针对stm32的discovery lcd显示写了个图像代码生成的程序,可以直接生成32bit的ARGB格式代码等后面发一个成熟点的版本,目前还是有些容易遇到的bug
发表于 2019-06-15
用于stm32Discovery的图像转代码取模小工具

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2019-06-15

STM32CubeMx之串行通信

前言我的板子是:STM32ZGT6配置1.打开STM32CubeMX新建工程,选择STM32ZGT62.配置外部高速时钟RCC设置,选择HSE(外部高速时钟)为Crystal/Ceramic Resonator(晶振/陶瓷谐振器),我的开发板外部时钟是25MHZ。 3.配置串行通信选择Asynchronous异步通信。  串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。 生成报告以及代码,编译程序(最好单独生成.c和.h文件)。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void
发表于 2019-06-15

stm32 不断进入串口中断的bug解决方法

在使用stm32的时候,发现usart会莫名的卡在串口中断里,然而串口初始化只配置了RXNE中断,打断点发现不断进入中断却没不是RXNE中断引起的,经过查找资料发现是ORE的问题,2篇博文解决方案如下:http://bbs.21ic.com/icview-160999-1-1.html及http://blog.csdn.net/origin333/article/details/49992383大致原因为开启了RXNE中断之后 ORE也开启了,但是使用USART_GetITStatus却无法读取到ORE的标志位(未使能ERR时),这样也无法消除中断申请,自然一直进入串口中断,如果要消除ORE需要
发表于 2019-06-15

STM32串口USART用法的进阶(HAL库版本)

句话是绑定DMA,来源数USART1,目的是数组,定义好的。第二句是打开空闲中断it.c里面找到void USART1_IRQHandler(void){ UsartReceive_IDLE(&huart1);//自己添加一个函数,这就是中断,搬完以后,空闲中断 自己完成它  HAL_UART_IRQHandler(&huart1);}void UsartReceive_IDLE(UART_HandleTypeDef *huart)  {      uint32_t temp;      if
发表于 2019-06-15

STM32CubeMX学习教程之五:PWM实现呼吸灯效果

软件:STM32CubeMX V4.25.0  System Workbench V2.4固件库版本:STM32Cube FW_F1 V1.6.1硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号 首先设置RCC和SYS,如下图 然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图设置PC7 管脚为TIM3_CH2, 即定时器TIM3的Channel2然后设置TIM3的Channel2为PWM Generation CH2 从上一篇博文我们知道TIM3是挂在APB1总线上的,看时钟树我们知道
发表于 2019-06-15
STM32CubeMX学习教程之五:PWM实现呼吸灯效果

小广播

何立民专栏

单片机及嵌入式宝典

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

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