173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

stm32需要设置rcc

keros@mark 2023-03-18 资讯中心

求助,STM32库函数RCC

看模板中main函数里这么一段代码

int main(void)

{

/*! At this stage the microcontroller clock setting is already configured,

this is done through SystemInit() function which is called from startup

file (startup_stm32f10x_xx.s) before to branch to application main.

To reconfigure the default setting of SystemInit() function, refer to

system_stm32f10x.c file

*/

也就是说,进入main函数前,系统已经做了时钟配置,调用的是SystemInit()函数,那么我们就进入此函数看过究竟。

void SystemInit (void)

{

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

/* Set HSION bit */

RCC-CR |= (uint32_t)0x00000001;

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

#ifndef STM32F10X_CL

RCC-CFGR = (uint32_t)0xF8FF0000;

#else

RCC-CFGR = (uint32_t)0xF0FF0000;

#endif /* STM32F10X_CL */

/* Reset HSEON, CSSON and PLLON bits */

RCC-CR = (uint32_t)0xFEF6FFFF;

/* Reset HSEBYP bit */

RCC-CR = (uint32_t)0xFFFBFFFF;

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

RCC-CFGR = (uint32_t)0xFF80FFFF;

#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

/* 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

}

其他的我先都不想管,我就看准了这几句:

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

那么就是告诉我们,给HCLK、PCLK1和PCLK2的配置是调用 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

/* If none of the define above is enabled, the HSI is used as System clock

source (default after reset) */

}

这其实就告诉我们,SYSCLK的设置就是根据我们定义来设定,如果定义了SYSCLK_FREQ_HSE

,那么SYSCLK就是HSE(默认8MHz),如果定义了SYSCLK_FREQ_24MHz,那么SYSCLK就是24MHz,一次类推。而设置时钟是靠SetSysClockToXX()函数来实现的!

好了,既然这样,我就想继续跟进,去找SetSysClockToXX(),但是惊讶地发现,提示此函数没有定义!为啥,那是因为我去找的刚好是未被编译的,当然找不到定义,事实上这些XX函数都存在在system_stm32f10x.c文件中,但是只有一个能被跟踪找到,那就是对应的宏被定义了的那个。这些定义到底在哪?跟进!得到如下:

//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 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

这下我想起来了,每次用keil建立工程,总是要求预先定义两个宏:USE_STDPERIPH_DRIVER和STM32F10X_MD,原来这儿就体现出作用了!

因为我的芯片是STM32F10X_MD型,所以SYSCLK就被选择了72MHz!

至于static void SetSysClockTo72(void)此函数到底是怎么把SYSCLK设置成为72MHz的,我懒得去管了,代码很长,也在system_stm32f10x.c文件中,说实话我真没兴趣去搞明白,但要知道,在这个函数里,顺便把HLCK、PCLK1和PCLK2都做了默认设置!

话说回来,我真不想去看寄存器操作的,但是,这个函数里面有一个我认为是ST公司的工程师们大意写错了的地方,如下:

/* 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;

从时钟布局图中可以知道,PCLK1的最大时钟为36MHz,PCLK1怎么能等于HCLK呢?此时的HCLK可是72MHz,从下面代码也可看到,确实2分频嘛,那就是36MHz,肯定是注释错了!

STM32的RCC和RTC有什么联系

STM32的RTC由RCC和配置控制。

RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行。RTC是STM32内部集成的一个简单的时钟(计时用),如果不用就关闭,用的话先要通过RCC配置控制其时钟源,可看作是一个外设器件。

扩展资料:

TC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。

RTC最重要的功能是为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,对于时间来说,无论快慢都是误差,而匹配电容在RTC的外围器件上起到非常重要的作用,它可以适当修正晶体与RTC之间匹配问题。

点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD

stm32的每一个引脚都有始终控制,这样在不用的时候可以关闭时钟来达到节能的目的,所以,如果要使用外设,必须先打开时钟,否则没有办法进行操作的。。。

具体函数是 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState)

RCC_APB2Periph是你要打开或者关闭的外设,NewState是enable或者disable为打开或者关闭…………

stm32的中RCC时钟配置问题

使用库函数的时候如果没有手动配置,那么时钟就是使用默认的配置

本文标签:stm32需要设置rcc

产品列表
产品封装
友情链接