STM32编程:实现LED灯闪烁(基于手写SDK的方式)-stm32f10x.h 文件

时间:2024-06-09 15:38:55
//寄存器的值常常是芯片外设自动更改的,即使CPU没有执行程序,也有可能发生变化
//编译器有可能会对没有执行程序的变量进行优化

//volatile表示易变的变量,防止编译器优化,
#define     __IO    volatile
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;

// GPIO 寄存器结构体定义
typedef struct
{
    __IO uint32_t CRL;       // 端口配置低寄存器,     地址偏移0X00
    __IO uint32_t CRH;       // 端口配置高寄存器,     地址偏移0X04
    __IO uint32_t IDR;       // 端口数据输入寄存器,   地址偏移0X08
    __IO uint32_t ODR;       // 端口数据输出寄存器,   地址偏移0X0C
    __IO uint32_t BSRR;      // 端口位设置/清除寄存器,地址偏移0X10
    __IO uint32_t BRR;       // 端口位清除寄存器,     地址偏移0X14
    __IO uint32_t LCKR;      // 端口配置锁定寄存器,   地址偏移0X18
} GPIO_TypeDef;


/*片上外设基地址  */
#define PERIPH_BASE           ((unsigned int)0x40000000)

/*APB2 总线基地址 */
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
/* AHB总线基地址 */
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

/*GPIO外设基地址*/
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)

/*RCC外设基地址*/
#define RCC_BASE      (AHBPERIPH_BASE + 0x1000)


// GPIO 外设声明
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)


// RCC 外设声明
#define RCC                 ((RCC_TypeDef *) RCC_BASE)

/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR      *(unsigned int*)(RCC_BASE+0x18)
	







/*GPIO引脚号定义*/
#define GPIO_Pin_0              ((uint16_t)0x0001)  /*!< 选择Pin0 (1<<0) */
#define GPIO_Pin_1              ((uint16_t)0x0002)  /*!< 选择Pin1 (1<<1)*/
#define GPIO_Pin_2              ((uint16_t)0x0004)  /*!< 选择Pin2 (1<<2)*/
#define GPIO_Pin_3              ((uint16_t)0x0008)  /*!< 选择Pin3 (1<<3)*/
#define GPIO_Pin_4              ((uint16_t)0x0010)  /*!< 选择Pin4 */
#define GPIO_Pin_5              ((uint16_t)0x0020)  /*!< 选择Pin5 */
#define GPIO_Pin_6              ((uint16_t)0x0040)  /*!< 选择Pin6 */
#define GPIO_Pin_7              ((uint16_t)0x0080)  /*!< 选择Pin7 */
#define GPIO_Pin_8              ((uint16_t)0x0100)  /*!< 选择Pin8 */
#define GPIO_Pin_9              ((uint16_t)0x0200)  /*!< 选择Pin9 */
#define GPIO_Pin_10             ((uint16_t)0x0400)  /*!< 选择Pin10 */
#define GPIO_Pin_11             ((uint16_t)0x0800)  /*!< 选择Pin11 */
#define GPIO_Pin_12             ((uint16_t)0x1000)  /*!< 选择Pin12 */
#define GPIO_Pin_13             ((uint16_t)0x2000)  /*!< 选择Pin13 */
#define GPIO_Pin_14             ((uint16_t)0x4000)  /*!< 选择Pin14 */
#define GPIO_Pin_15             ((uint16_t)0x8000)  /*!< 选择Pin15 */
#define GPIO_Pin_All            ((uint16_t)0xFFFF)  /*!< 选择全部引脚 */



	

/**
* GPIO输出速率枚举定义
*/
typedef enum
{
    GPIO_Speed_10MHz = 1,         // 10MHZ        (01)b
    GPIO_Speed_2MHz,              // 2MHZ         (10)b
    GPIO_Speed_50MHz              // 50MHZ        (11)b
} GPIOSpeed_TypeDef;

/**
* GPIO工作模式枚举定义
*/
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;



/**
* GPIO初始化结构体类型定义
*/
typedef struct
{
    uint16_t GPIO_Pin;             /*!< 选择要配置的GPIO引脚
                                    可输入 GPIO_Pin_ 定义的宏 */

    GPIOSpeed_TypeDef GPIO_Speed;  /*!< 选择GPIO引脚的速率
                                    可输入 GPIOSpeed_TypeDef 定义的枚举值 */

    GPIOMode_TypeDef GPIO_Mode;    /*!< 选择GPIO引脚的工作模式
                                    可输入 GPIOMode_TypeDef 定义的枚举值 */
} GPIO_InitTypeDef;


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);