首先建一个stm32f103x.h的文件,而后 #include "stm32f103x.h"html
还记得上一节函数
如今呢就是作一个库,我就是想控制IO的时候方便一点,列如post
PA 经过某种方式 CRL/CRH/IDR/ODR/BSRR/BRR/LCKR学习
PB 经过某种方式 CRL/CRH/IDR/ODR/BSRR/BRR/LCKR测试
PC ; PD ; PE ......url
额,直接进入正题spa
要是能够这样就行了 PA->CRL = XXXXXXXX PB->CRL = XXXXXXXX PC->CRL = XXXXXXXX PD ->CRL = XXXXXXXX设计
那就引入结构体(其实能够这样作主要仍是由于寄存器地址是连续的)3d
typedef struct
{
unsigned int CRL;
unsigned int CRH;
unsigned int IDR;
unsigned int ODR;
unsigned int BSRR;
unsigned int BRR;
unsigned int LCKR;
} GPIO_TypeDef;指针
在32位处理器上 unsigned int 是32位的
假设要控制PA口哈
若是咱定义一个 GPIO_TypeDef的变量(指针),而后让这个变量(指针)的地址是 0x40010800 就行了
结构体指针是这个结构体的首地址,也是里面第一个变量的首地址
这样的话 CRL的地址就是0x40010800 CRH的地址就是 0x40010804 IDR的地址就是0x40010808
若是C语言很差......本身去百度哈,本身测试打印打印
先说一个强制转换的问题
能够测试看一下
不知道还有没有什么疑问,根据上一节哈,有人会想 为何不是这样 ss = (int *)point; 或者 ss = (unsigned int *)point;
(int *)point 就把后面的point(0x40010800) 当成了一个地址,而后把这个地址赋值给ss不行吗?
记住哈,指针也是有类型的 ss是一个什么呀
那 ss = 这边也应该是一个结构体类型的指针 因此才须要
所谓: 鱼找鱼虾找虾乌龟找王八
可是那样写有点麻烦
要是直接代替掉
就行了
,能够这样
#define GPIOA (GPIO_TypeDef *)point
就是用GPIOA 替换掉后面的指针
如今GPIOA 所指向的就是GPIO_TypeDef 这个结构体了
写的好点就是
但是感受这样写仍是有点麻烦,我想再封装一下
咱就咱建一个stm32f10x_gpio.c 和 stm32f10x_gpio.h 的文件,对函数进行进一步的封装
先写设置输出高电平的 (注意哈,我写的函数是根据ST写的库写的,不是按照本身的想法写的,主要是在下一节学习库的时候,让你们感受亲切)
这样多个文件你们应该懂吧??? 改天我再写一篇关于文件编译和多文件编译的文章.
定义成,结构体指针变量,这样就能够直接传进来
由于GPIOA,GPIOB,GPIOC 就是结构体指针变量
咱控制PA0输出高电平
GPIO_SetBits(GPIOA,0)
控制PA1输出高电平
GPIO_SetBits(GPIOA,1)
咱想要的是这样
而后按照咱想的设计一下里面的内容(咱仍是用ODR实现哈哈)
GPIOx->ODR = (unsigned int)1<<GPIO_Pin;
假设传进来的是0
GPIOx->ODR = (unsigned int)1<<0; (unsigned int)1左移0位(0000 0000 0000 0001);
GPIOx->ODR = 0x0001
假设传进来的是1
GPIOx->ODR =(unsigned int)1<<1; (unsigned int)1左移1位(0000 0000 0000 0010);
GPIOx->ODR = 0x0002
貌似是能够可是有件事就是每次都会清除原来的
这事情简单
GPIOx->ODR |= (unsigned int)1<<GPIO_Pin;
加个 | 或 就能够了
咱如今测试测试
还能够哈
如今设置模式,因为引脚的模式的有好几个,还有设置引脚的速率,因此呢就用一个结构体配置引脚的模式和速率