一、硬件设计
- 两个指示灯DS0和DS1,分别接在PB5和PE5
- 发光二极管的阳极连接一个限流电阻,连接到3.3V,阴极连接到一个GPIO,输出低电平,这个时候发光二极管导通发光,要让他熄灭,就给它一个高电平,阴极和阳极的电平一样,所以它会熄灭
二、软件设计
- 程序主要框架:
- ① 初始化系统时钟(固件库已经封装好,自己完成调用)
- ② 使能对应GPIO时钟,并初始化GPIO相关参数
- ③ 点亮LED
- 所使用的库文件介绍
- ① GPIO外设库文件:stm32f10x_gpio.c、stm32f10x_gpio.h
- ② RCC(外设时钟)外设库文件:stm32f10x_rcc.c、stm32f10x_rcc.h
- 所使用的库函数介绍
- GPIO挂载在APB2高速总线上
- ① 使能GPIO时钟函数:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) Periph:外设,Clock:时钟,Cmd:使能 两个参数,参数1:ABPB2上的外设选择,参数2:功能状态(打开还是关闭)
② GPIO初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 参数1:选择端口,GPIOA,GPIOB... 参数2:结构体,通过结构体调用成员
③ 设置管脚输出电平函数: 设置位功能函数,输出高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 参数1:选择端口,GPIOA,GPIOB... 参数2:选择你要操作的引脚
复位引脚,输出低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 参数1:选择端口,GPIOA,GPIOB... 参数2:选择你要操作的引脚
对位(GPIO引脚)进行写
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) 参数1:选择端口,GPIOA,GPIOB... 参数2:选择你要操作的引脚,对该引脚进行写, 参数3:写1还是0
GPIO写,一个端口组进行写 一个端口组有16个管脚,所以传值是对应一组端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) 参数1:选择端口,GPIOA,GPIOB... 参数2:输入你要操作的引脚,如0x01,就是对0号引脚进行操作
④ 读取管脚输入电平函数: 读取一个位(引脚)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 参数1:选择端口,GPIOA,GPIOB... 参数2:选择你要操作的引脚
GPIO读,一个端口组进行读
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) 参数1:选择端口,GPIOA,GPIOB...
⑤ 读取管脚输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
三、文件夹创建及文件添加
- 创建APP文件夹,用来存放外设部分的代码,方便对工程的管理
- 在APP文件夹下创建LED文件夹,用来存放LED相关代码
- 在工程目录文件组中添加APP文件组,用来管理操作的外设资源,如:LED
- 此时LED文件夹中没有文件,此时要新建一个文件
- 将创建好的文件保存并命名
- 同理,再添加一个LED.h文件
- 添加文件
- 添加头文件路径
四、.h文件
#ifndef __LED_H
#define __LED_H
#endif
- 格式功能:防止头文件被重复包含
- 头文件一般存放引脚定义,函数声明,相关结构体的封装等
LED.h
会在LED.c
中调用,也会在main.c
中调用,就会出现重定义,要避免重定义,就需要使用上述结构- 具体解释,例如在LED.c文件中定义了,就会顺序执行
#ifndef __LED_H
、#define __LED_H
、#endif
,当在main.c中再定义的时候,就不会执行这些,避免了重定义 - 因为要对引脚进行操作,所以也需要把头文件定义到.h文件中去
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#endif
五、配置须知
- 工作模式
- 1) GPIO_Mode_IPU 上拉输入;
- 2) GPIO_Mode_IPD 下拉输入;
- 3) GPIO_Mode_IN_FLOATING 浮空输入;
- 4) GPIO_Mode_AIN 模拟输入;
- 5) GPIO_Mode_Out_OD 开漏输出;
- 6) GPIO_Mode_Out_PP 推挽输出;
- 7) GPIO_Mode_AF_OD 复用开漏输出;
- 8) GPIO_Mode_AF_PP 复用推挽输出。
- 速度
六、代码实现
- main.c:
- LED.c
- LED.h
七、软件优化提高移植性
使用宏定义去定义端口时钟,端口号,引脚
- main.c
- LED.c
第二次由于模式和速度是和原来一致的,所以可以省略,因为用的是一个结构体,上面已经赋值。如果模式不同,那么就需要重新进行修改
- LED.h
八、批处理文件
这个是批处理文件,双击它,他自动会把编译器生成的OBJ文件中的乱七八糟的文件删除,只留下hex文件,减轻电脑内存占用容量