3# 关于 STM32 中 RCC 库文件

1. 前言

        在前一章,讲解了 GPIO 端口,但是似乎有个函数没有解释,如下:

// 开启LED相关的GPIO外设时钟
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK, ENABLE);

原因在于这个函数并不是在 GPIO 库文件中,而是属于 RCC(reset clock control)库文件。
        另外上一章也表明了,如果你对 STM32 GPIO 口的寄存器内容并不了解,但是通过官方提供的库文件,我们就可以不了解寄存器,就能编写一个完整的程序。
        同样这章还要讲解的是 STM32 的编译流程。

2. STM32 编译流程

        在学习 C 语言的时候,我们都知道 main 函数是一个项目文件的入口。但是是谁在调用 main 函数呢?
        在 STM32 中,由 startup_stm32f10x_hd.s 文件来调用 main 函数。startup_stm32f10x_hd.s 是一个汇编程序,原因如下:

(大约103行)
LoopFillZerobss:
    ldr r3, = _ebss
    cmp r2, r3
    bcc FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
    bl  main        调用 main函数
    bx  lr

上文就是调用了main函数,但是很明显上文还调用了 SystemInit ,这个也是函数,却比 main 函数先调用,因为这个函数是用来设置 STM32 全局时钟,也就是我们所说的 STM32 稳定频率 75Mhz。
SystemInit 函数位于 system_stm32f10x.c 文件中。如图:

SystemInit .png

该函数中含有大量的寄存器操作,这个并不适合新手,但是建议看看。

3. RCC 库文件

        这一章并没有明显得编程代码,主要是对上一节关于时钟部分进行解析。

#define LED_GPIO_CLK    RCC_APB2Periph_GPIOB

/* 开启 LED 相关的 GPIO 外设时钟 */
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);

上问中有个词语 APB2,这个是 STM32 的一个总线,同一等级的还有 AHB 和 APB1。所以总线上有哪些资源是不一样的。比如 GPIOB 是挂载在 APB2 总线上的。那这些对于一个新手,不是很难辨别吗?但是库函数提供了一些提示,如下图:

总线相关.png

但是很多并不是常用的,常用的如下:

APB1
    |-RCC_APB1Periph_DAC
    |-RCC_APB1Periph_I2C1
    |-RCC_APB1Periph_I2C2
APB2
    |-RCC_APB2Periph_ADC1
    |-RCC_APB2Periph_ADC2
    |-RCC_APB2Periph_ADC3
    |-RCC_APB2Periph_GPIOA
    |-RCC_APB2Periph_GPIOB
    |-RCC_APB2Periph_GPIOC
    |-RCC_APB2Periph_GPIOD
    |-RCC_APB2Periph_GPIOE
    |-RCC_APB2Periph_GPIOF
    |-RCC_APB2Periph_GPIOG
    |-RCC_APB2Periph_SPI1
    |-RCC_APB2Periph_USART1

同样不同的总线,时钟开启的方法并不相同,这个就是RCC的函数方法:

1.使能 AHB 相关的端口时钟
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
2.使能 APB1 相关的端口时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
3.使能 APB2 相关的端口时钟
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

到这里就结束了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 开发环境:STM32F103ZET6 STM32CubeMX Keil5 使用STM32CubeMx创建...
    停下浮躁的心阅读 2,118评论 0 2
  • 1 简介 STM32F10x标准外设库是一个完整的包,包含了所有标准外设的设备驱动,适用于STM32价值系列(高、...
    hackvilin阅读 6,875评论 0 13
  • 姓名:周崇杰 学号:16140120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 4,766评论 0 5
  • 标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就...
    停下浮躁的心阅读 6,693评论 0 3
  • open这个系统调用会建立一条到文件或者设备的访问路径,如果open调用成功的话,那么它将返回一个可以被read系...
    BIGHAI阅读 968评论 0 0