自己写库函数 固件库编程
1.定义结构体 以GPIOB为例
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
typedef struct //定义结构体
{
uint32_t CRL;
uint32_t CRH;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
uint32_t BRR;
uint32_t LCKR;
}GPIO_TypeDef;
#define GPIOB ((GPIO_TypedDef*)GPIOB_BASE)
//强制类型转换 基地址已定义过
原理:声明结构体,成员类型分布顺序于单片机寄存器一致,找到基地址,把地址强制类型转换里面成员与寄存器类似。
2.写头文件时,防止重复调用报错的方法
#ifndef __STM32F10X_GPIO_H
#define __STM32F10X_GPIO_H
//头文件代码
#endif /* __STM32F10X_GPIO_H */
设置输入输出结构体
typedef enum //枚举定义,使得结构体里面的成员只能取某些值
{
GPIO_Speed_10MHz = 1, // 10MHZ (01)b **注意这里是逗号**
GPIO_Speed_2MHz, // 2MHZ (10)b enum他后面会以此类推,不需要再=2,=3
GPIO_Speed_50MHz // 50MHZ (11)b
}GPIOSpeed_TypeDef;
typedef enum // 见图
{ GPIO_Mode_AIN = 0x0, // 模拟输入 (0000 0000)b
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入 (0000 0100)b
GPIO_Mode_IPD = 0x28, // 下拉输入 (0010 1000)b
GPIO_Mode_IPU = 0x48, // 上拉输入 (0100 1000)b
GPIO_Mode_Out_OD = 0x14, // 开漏输出 (0001 0100)b
GPIO_Mode_Out_PP = 0x10, // 推挽输出 (0001 0000)b
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出 (0001 1100)b
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出 (0001 1000)b
}GPIOMode_TypeDef;
typedef struct //定义输入输出的结构体
{
uint16_t GPIO_Pin;
uint16_t GPIO_Speed;
uint16_t GPIO_Mode;
}GPIO_InitTypeDef;
4.初始化函数(为了让编程看起来更简单,可读性更好)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化结构体成员写入进去
5.提高程序可移植性强:宏定义
//在前面:定义宏
#define LED_G_GPIO_PORT GPIOB
#define LED_G_GPIO_CLK_ENABLE (RCC->APB2ENR |= ( (1) << 3 ))
#define LED_G_GPIO_PIN GPIO_Pin_0
//在后面:
GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); // 曾经 GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //曾经 GPIO_ResetBits( GPIOB,GPIO_Pin_0 );
大概学了一下固件库编程的基础知识把,刚放完五一假期,有点困,_zzzzzz,学的也不太仔细有些地方没懂,等后期使用的时候再会有来看吧,下面就开始学固件库编程了。