自己写库函数 固件库编程

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,学的也不太仔细有些地方没懂,等后期使用的时候再会有来看吧,下面就开始学固件库编程了。