3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil) 2-STM32带你入坑系列(点亮一个灯--Keil)

2-STM32带你入坑系列(点亮一个灯--Keil)

首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h"

 还记得上一节

现在呢就是做一个库,我就是想控制IO的时候方便一点,列如

PA 通过某种方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PB 通过某种方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PC  ;  PD  ; PE ......

额,直接进入正题

要是可以这样就好了  PA->CRL = XXXXXXXX    PB->CRL = XXXXXXXX   PC->CRL = XXXXXXXX   PD ->CRL = XXXXXXXX

那就引入结构体(其实可以这样做主要还是因为寄存器地址是连续的)

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语言不好......自己去百度哈,自己测试打印打印

先说一个强制转换的问题

 

 可以测试看一下

 

 但是那样写有点麻烦,可以这样

#define  GPIOA  (GPIO_TypeDef *)point

写的好点就是

 

 

 可是感觉这样写还是有点麻烦,我想再封装一下

咱就咱建一个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<<0;       (unsigned int)1左移1位(0000 0000 0000 0010);       

GPIOx->ODR = 0x0002

貌似是可以但是有件事就是每次都会清除原来的

这事情简单

GPIOx->ODR |= (unsigned int)1<<GPIO_Pin;

加个 |  或  就可以了

咱现在测试测试

    

 

 

 

还可以哈

 

猜你喜欢

转载自www.cnblogs.com/yangfengwu/p/10492915.html