Terry 发表于 2015-10-31 11:30:07

STM32固件库文件编程结构思想的理解

STM32的固件库文件功能相当完善,提供的API完全能满足一般的项目需要。   首先,请看一段简单的C语言代码:#include <stdio.h>#define base0x0012ff60#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)#defineAPB1PERIPH_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;
页: [1]
查看完整版本: STM32固件库文件编程结构思想的理解