STM32单片机库函数问题

2025-05-20 01:52:52
推荐回答(2个)
回答1:

一般不行
必须要调用stm32f10x_rcc.c,SystemInit()只是将系统的时钟帮你配置好,其实你也可以不调用它,你可以自己调用stm32f10x_rcc.c中的函数自己来配置,不过这样的话就要记得配置好flash的等待周期,两种方式之间没什么太大区别。另外一般你会需要开启外设的时钟或者其他一些功能就需要调用stm32f10x_rcc.c中的函数。
还有如果你使用的是3.2.0以上的库的话,SystemInit()其实不需要你自己调用,startup_stm32f10x_XX.s中有这样的代码
Reset_Handler
LDR R0, =SystemInit
意思就是上电(Reset)后执行的第一段代码就是SystemInit(),这是在main函数之前调用的,所以不需你自己再去调用了
SystemInit()在调用的时候要注意你自己板子上的外部晶振是多少,默认是25MHZ,如果你板子上的晶振的不是这么大的话,你需要修改stm32f10x.h里面的HSE_Value

补充:system_stm32f10x.c里的函数的功能仅仅是完成系统时钟的配置,如果你不使用任何外设或者用系统时钟做其他用的话是可以不用stm32f10x_rcc.c
stm32f10x_rcc.c中的函数不仅仅是完成分频倍频的功能,还有开启外设时钟,检测RCC中断,配置RTC时钟等功能,不是单单配置一个系统时钟那么简单

回答2:

你说的是3.0以上的固件库吗?

SystemInit()函数在主程序中被RCC_Configuration()函数调用,完成系统时钟的配置功能。我看过这个函数的具体内容,是直接操作寄存器来完成配置。如果使用stm32f10x_rcc.c文件中的函数来完成时钟配置,和SystemInit()的顺序和效果一样。

当然,为了保证兼容性,使低版本固件库写的程序运行,就还有stm32f10x_rcc.c存在,像早期版本的RCC_Configuration()函数就是使用这个文件中提供的函数来完成时钟配置的。

补充:是的,Systeminit()函数完成了时钟初始化的功能。另外systick的使用也变简单了,以前要几个函数完成初始化,现在只要一个就行。

你看看3.0版本固件system_stm32f10x.c中的代码是怎样的吧。其中是对RCC寄存器直接赋值操作,和stm32f10x_rcc.c中相关的函数作用一样。

如果在程序中要使用端口、外设等,由于这些东西需要时钟才能工作,所以还是需要stm32f10x_rcc.c中的函数来完成时钟的控制。