历史上的今天
今天是:2025年08月05日(星期二)
2019年08月05日 | system_stm32f10x.c(V3.5.0)解读
2019-08-05 来源:eefocus
******************************************************************************
* @file system_stm32f10x.c
* @author MCD Application Team
* @version V3.5.0
* @date 11-March-2011
* @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.
*
* 1. This file provides two functions and one global variable to be called from
* user application:
* - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
* factors, AHB/APBx prescalers and Flash settings).
* This function is called at startup just after reset and
* before branch to main program. This call is made inside
* the "startup_stm32f10x_xx.s" file.
*
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
* by the user application to setup the SysTick
* timer or configure other parameters.
*
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
* be called whenever the core clock is changed
* during program execution.
*
* 2. After each device reset the HSI (8 MHz) is used as system clock source.
* Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to
* configure the system clock before to branch to main program.
*
* 3. If the system clock source selected by user fails to startup, the SystemInit()
* function will do nothing and HSI still used as system clock source. User can
* add some code to deal with this issue inside the SetSysClock() function.
*
* 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on
* the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file.
* When HSE is used as system clock source, directly or through PLL, and you
* are using different crystal you have to adapt the HSE value to your own
* configuration.
*
******************************************************************************
由第2条可以得知,单片机一上电或复位,以8M的HSI运行,之后执行函数SystemInit (),此函数的功能主要是复位与时钟相关的寄存器,并执行SetSysClock()。
#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
#endif
由此部分代码可知,默认状态下,在函数SetSysClock()中将会执行函数SetSysClockTo72()。
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;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#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
/* 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);
#endif /* STM32F10X_CL */
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* 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
configuration. User can add here some code to deal with this error */
}
此部分代码说明当HSE准备好之后,就会配置PLL,使PLLCLK位72MHz,之后等待system clock source切换至PLL。
在实际的时钟配置中,在else处设置调试断点,可确认外部时钟是否起振工作。
史海拾趣
|
平台:S3C2440 + WINCE60 添加了USB FUNCTION的相关组件,把设备映射成 Serial. 但是系统起来后,PC端检测不到设备。没任何反映。 用万用表测试 USB PORT的 D+ 也有3V。(D+用一个IO口控制,已经置为高)。请问PC端什么检测不到呢?谢谢。… 查看全部问答> |
|
各位,我现在在做的一个项目,是这样的 在Ce下面有两个音频设备,从第一个音频设备里面获取音频数据(比如录音),然后将数据从第二个设备输出。 大致的思路是这样的,使用winInXXX的函数,从第一个设备获得数据,然后将数据通过wavOutXXX,扔到 ...… 查看全部问答> |
|
1.非流水线时空图 ; 2.流水处理器的加速比; 3.流水线单位时间执行完毕的指令数(吞吐率)。 1指的什么图? 2、3怎么计算? 已知流水分为取指、译码、执行、回写四个过程,有10条指令连续输入此流水线,时钟周期为100ns.… 查看全部问答> |
|
哪位朋友有现成的卖给小弟,学生没多少钱只能出100元 要求 基于单片机的无线多路遥控发射,接收系统 本系统设计成8路受控对象的8种状态进行控制,采用多路遥控发射,接收系统将控制信号调制到高频上, 通过空间传输,实现对远程设备的状态控制.发端通 ...… 查看全部问答> |
|
如何在WinCE的控制面板中增加触摸屏校准(Stylus)应用,非常感谢!! 各位: 我遇到了一个奇怪的问题,在WinCE的控制面板中没有触摸屏校准(stylus)的应用,以前在编译的时候,只要选择了Mobile Handheld,就肯定会有的。但现在在控制面板中只有鼠标(Mouse)的应用,可是我现在也是用的触摸屏啊?请问下如 ...… 查看全部问答> |
|
从板子回来焊上元件一直没成功原因是总是出现0x54,这明显骂人啊,这两天气死我了,这不是让我玩完么 我本想放弃因为本来四层我改为两层,能好吗?大家知道一分价钱一分货。 我在徘徊中痛苦地思考, ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 我看文件意思是必须用最小系统板.可是有点事我们老师现在有点事回家了.临走留下交代说用现成开发板就行..说往年也是这么说.用开发板没问题的.纠结了.问问大家意思 谢啦 … 查看全部问答> |
|
void locatexy(uchar x,uchar f) { uchar j; { if(f==0) {lcd_wcmd(0x80+x);} // 第0行 ( x等于行,y等于列 ) else if(f==1) {lcd_wcmd(0x90+x);} & ...… 查看全部问答> |
|
本帖最后由 fjjjnk1234 于 2014-7-26 14:45 编辑 HELPER2416学习笔记1——LED灯闪烁参与HELPER2416开发板助学计划学习HELPER2416开发板已经有十天左右时间了,由于之前 一直上不了网,一直没机会提交板子的学习心得,抱歉。今天把之前的心得一起 ...… 查看全部问答> |




