目录
STM32标准固件库简介
stm32f10x.h
这个头文件实现了片上外设的所以寄存器的映射,是一个非常重要的头文件,在内核中与之相对应的头文件是
core_cm3.h
。
system_stm32f10x.c
实现了
STM32
的时钟配置,操作的是片上
的
RCC
这个外设。系统在上电之后,首选先会执行由汇编编写的
启动文件,启动文件中的复位函数中调用的
SystemInit
函数就在
这个文件里面定义。调用完之后,系统的时钟就被初始化成
72M
。
如果后面我们需要重新配置系统时钟,我们就可以参考这个函数
重写。为了维持库的完整性,我们不会直接在这个文件里面修改
时钟配置函数。
stm32f10x_it.c
这个文件是专门用来编写中断服务函数的,在我
们修改前,这个文件已经定义了一些系统异常
(
特殊中断
)
的接口,
其它普通中断服务函数由我们自己添加。但是我们怎么知道这些中
断服务函的接口如何写?在学习中断和启动文件的时候会详细介
绍。
stm32f10x_conf.h
这个文件被包含进
stm32f10x.h
文件。当我们使
用固件库编程的时候,如果需要某个外设的驱动库,就需要包含该
外设的头文件:
stm32f10x_ppp.h
,包含一个还好,如果是用了多外
设,就要包含多个头文件,这不仅影响代码美观也不好管理,现
我们用一个头文件
stm32f10x_conf.h
把这些外设头文件都包含在里面,
让这个配置头文件统一管理这些外设头文件,我们在应用程序中只
要包含这个配置头文件即可,我们又知道这个头文件在
stm32f10x.h的最后被包含,所以最终我们只需要包含
stm32f10x.h
这个头文件即
可,非常方便。默认情况下是所以头文件都被包含,没有被注释掉。
代码以C语言开发
delay_ms.c:
#include "stm32f10x.h"
void delay_ms(uint32_t CntDwn)
{
for( ; CntDwn != 0; CntDwn--);
}
delay_ms.h:
#ifndef __delay_ms_h
#define __delay_ms_h
#include "stm32f10x.h"
void delay_ms(uint32_t CntDwn);
#endif /* "__Delay_h" */
bsp_led.c:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_led.h"
/*************************************************
* @Initializing IOs Controlling the Leds
* @FWLB Here is Very Similar to Chapter 04
*************************************************/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(LED2_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
bsp_led.h:
#ifndef __bsp_led_h
#define __bsp_led_h
/* Define GPIOs' Pins, Could Modify in the Future If Schematic
has been changed*/
#define LED1_GPIO_PORT GPIOB // GPIO Port B
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB // GPIO Port CLK -- RCC's APB2ENR
#define LED1_GPIO_PIN GPIO_Pin_2 // PB2
#define LED2_GPIO_PORT GPIOC // GPIO Port C
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOC // GPIO Port CLK -- RCC's APB2ENR
#define LED2_GPIO_PIN GPIO_Pin_2 // PC2
/* Macro Definition to Trigger the Led, On or Off */
#define ON 0
#define OFF 1
/* Use Firmware Library to Control IO */
#define LED1(d) if(d) \
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); \
else \
GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN)
#define LED2(d) if(d) \
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); \
else \
GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN)
void LED_GPIO_Config(void);
#endif /* __bsp_led_h */
main.c:
#include "stm32f10x.h"
#include "bsp_led.h"
#include "delay_ms.h"
int main(void)
{
LED_GPIO_Config();
while(1)
{
LED1(ON);
LED2(OFF);
delay_ms(0x1FFFFF);
LED1(OFF);
LED2(ON);
delay_ms(0x1FFFFF);
}
}
目录结构

页面配置
版本选择

XX.hex文件配置

等等。
Proteus中仿真实现
(1) D2闪,D3灭

(2) D3闪,D2灭


本文档详细介绍了STM32标准固件库的使用,包括stm32f10x.h头文件的作用、system_stm32f10x.c中的时钟配置、中断服务函数编写和stm32f10x_conf.h的配置管理。通过实例演示了如何使用C语言开发,如delay_ms函数和LED控制,以及在Proteus中的模拟实验。
2978

被折叠的 条评论
为什么被折叠?



