没有无缘无故的爱跳到SetSysClock函数,求助

STM32(73)
STM32F4时钟设置分析
本文博客链接:,作者:jdh,转载请注明.
开发环境:MDK4.72
MCU:STM32F407VGT6
STM32F4启动与STM32F10X不同,时钟已经默认配置好.
1.启动代码:
文件:startup_stm32f4xx.s
可以看出,在进入main函数之前,系统调用了SystemInit函数.
2.SystemInit函数分析
SystemInit函数位于system_stm32f4xx.c文件中.此文件提供几个宏定义可以设置各个时钟:
而晶振频率则是在文件stm32f4xx.h中进行设置:
综上,可以得出默认配置中:
锁相环压腔振荡器时钟PLL_VCO = 25 / 25 * 336 = 336MHz
系统时钟SYSCLK = 336 / 2 = 168MHz
USB,SD卡时钟 = 336 / 7 = 48MHz
SystemInit函数代码:
3.SetSysClock函数分析
在SetSysClock函数中,配置了系统时钟,PLL倍频以及分频系数:
如果外部时钟启动失败,系统会使用内部时钟
HCLK = SYSCLK / 1 = 168MHz
PCLK2 = HCLK / 2 = 84MHz
PCLK1 = HCLK / 4 = 42MHz
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:163402次
积分:2944
积分:2944
排名:第10640名
原创:72篇
转载:409篇
评论:12条
(1)(3)(4)(12)(2)(19)(8)(8)(18)(7)(3)(14)(23)(33)(17)(5)(24)(17)(42)(24)(22)(4)(15)(15)(12)(13)(15)(2)(8)(21)(7)(5)(1)(5)(7)(2)(5)(3)(2)(3)(1)(2)(1)(1)(2)(1)(2)(20)(1)(1)(1)(1)君,已阅读到文档的结尾了呢~~
函数SystemInit(),systeminit,stm32 systeminit,systeminit什么意思,ldr r0 systeminit,三角函数,excel函数公式大全,sumif函数的使用方法,三角函数公式大全,if函数
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
函数SystemInit()
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口STM32 系统时钟设置
STM32 系统时钟设置
发布时间: 22:30:23
编辑:www.fx114.net
本篇文章主要介绍了"STM32 系统时钟设置",主要涉及到STM32 系统时钟设置方面的内容,对于STM32 系统时钟设置感兴趣的同学可以参考一下。
STM32F103RBT6采用外部时钟8MHz,利用软件可以将系统时钟设置为72MHz。
在启动文件startup_stm32f10x_md.s中,有这样两句话:
IMPORT &__main
;从外部文件引入main函数
IMPORT &SystemInit
;从外部文件引入SystemInit文件
当芯片上电复位的时候,系统调用函数SystemInit()。
调用函数SystemInit()的目的是为了调用函数SetSysClock();
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
& SetSysClockTo72();
&/* If none of the define above is enabled, the HSI is used as System clock
& & source (default after reset) */&
system_stm32f10x.c文件中定义了系统频率,如下:
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE & &HSE_VALUE */
&#define SYSCLK_FREQ_24MHz &
/* #define SYSCLK_FREQ_HSE & &HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz & */&
/* #define SYSCLK_FREQ_36MHz & */
/* #define SYSCLK_FREQ_48MHz & */
/* #define SYSCLK_FREQ_56MHz & */
#define SYSCLK_FREQ_72MHz &
因为本系统为STM32F10X_MD,所以#define SYSCLK_FREQ_72MHz &。
系统频率被设置 为72MHz。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:stm32 启动顺序以及系统时钟设置
> stm32 启动顺序以及系统时钟设置
stm32 启动顺序以及系统时钟设置
1.stm32的启动文件startup_stm32f10x_hd.s启动文件是在处理器复位之后最先运行的一段汇编程序。在运行C语言代码之前,需要汇编为C语言建立一合适的环境启动文件的作用主要分为:初始化堆栈指针。初始化计数器指针。设置堆栈的大小。设置异常向量表的入口地址。配置外部的SRAM作为数据存储器。设置C的入口的导入__main、__SystemInit。首先调用SystemInit()配置系统时钟,然后进入我们在熟悉不过的main函数。2启动文件中的系统时钟配置我们会发现startup_stm32f10x_hd.s发现这一段汇编代码:Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP下面就来剖析下这段汇编代码,待处理器复位从外部导入__main,SystemInit函数,首先是调用的是SystemInit函数。然后会跟踪到System_stm32f10x.c文件。首先我们分析c文最开始的代码:#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)//#define SYSCLK_FREQ_HSE HSE_VALUE//#define SYSCLK_FREQ_72MHz #else// #define SYSCLK_FREQ_HSE HSE_VALUE //对应外部晶振不超频(外部晶振是8MHZ)#define SYSCLK_FREQ_24MHz
//超频到24MHZ/* #define SYSCLK_FREQ_36MHz
*/ //超频到36MHZ/* #define SYSCLK_FREQ_48MHz
*/ //超频到48MHZ/* #define SYSCLK_FREQ_56MHz
*/ //超频到56MHZ//#define SYSCLK_FREQ_72MHz
//超频到72MHZ#endif是一段预编译。而这里正是我们需要配置时钟的大小。而定义宏定义变量实在我们keil里面配置的。如下图而keil定义的stm32F10X_HD高速的芯片。而此时#define SYSCLK_FREQ_24MHz 会被编译。(如果说在#id或#else没有定义的变量。默认的会启动芯片内部的HIS高速时钟)在SystemInit函数中又会调用SetSysClock();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 SetSysClockTo72();#endif}然后SetSysClockTo24();#else /* PLL configuration: = (HSE / 2) * 6 = 24 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_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6);#endif /* STM32F10X_CL */本设计中外部时钟是采用8M晶振,首先对应RCC_CFGR_PLLXTPRE_HSE_Div2(外部时钟除以8/2=4M)然后RCC_CFGR_PLLMULL6(4*6=24M)这样系统时钟就是24MhZ。这样超频就已经成功。补充:RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/*开启外部高速时钟*/
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/*AHB 分频*/
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/*APB2 分频*/
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; /*APB1 分频*/ RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/*选择PLL作为systick*/如果我们外部晶振采用12MHZ我们可以根据自己的需要修改(RCC_CFGR_PLLXTPRE_HSE_Div | RCC_CFGR_PLLMULL)进行超频到24MHZ.此时SystemInit函数调用结束。下面进入到main()函数。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一

我要回帖

更多关于 没有无缘无故的爱 的文章

 

随机推荐