STM32的固件库文件功能相当完善,提供的API完全能满足一般的项目需要。 首先,请看一段简单的C语言代码: #include <stdio.h> #define base 0x0012ff60 #define flash ((TestType *)base) typedef struct { int i; int j; int k; }TestType; void main() { flash->i = 0; flash->j = 1; flash->k = 2; printf( "%x \n", flash->i); printf( "%x", &(flash->i)); } ST的固件库都是按照这种方式编写的 上面程序打印出来结果为: 0 0x0012ff60 例如GPIOA口来说吧,在stm32f10x.h中定义如下: #define PERIPH_BASE ((uint32_t)0x40000000) #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) 有了地址之后,如何定义GPIOA的各个寄存器地址,它们是控制IO的关键所在。GPIO的各个寄存器都是连续排列的,为什么要连续排呢,方便找啊,用结构体就能很好搞定了。 在stm32f10x.h中定义如下: typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef; 每个寄存器都是32位的,所以很方便用结构体寻找每个寄存器,准备工作都做好了,接下来就要开始针对GPIOA设置了。 在core_cm3.c中 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 把地址强制转换成结构体指针,这样就能很方便对寄存器操作。寄存器搞定了,接下来就真对用户操作了,要很好的让用户使用,就得人性话点,所以用enum枚举变量就能实现,你就再也不用为想输入的值去烦恼了,直接输入名称就行了,拿IO口的输出速度来说。 typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef;
|