目录
STM32标准固件库简介
代码以C语言开发
目录结构
页面配置
Proteus中仿真实现
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--);
}
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--);
}
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--);
}
#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); #endifbsp_led.c:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_led.h"
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 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 #define ON 0 #define OFF 1 #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
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灭



