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

[ 复制链接 ]
admin | 2020-2-8 05:10:56 | 显示全部楼层 | 阅读模式 打印 上一主题 下一主题

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
2-STM32带你入(www.yun-ling.cn)坑系列(点亮一个灯--Keil)

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

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

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


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

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



还记得上一节

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

Keil)

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



现在呢就是做一个库,我就是想控制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语言不好......自己去百度哈,自己测试打印打印
先说一个强制转换的问题

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

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





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

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



可以测试看一下

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

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



不知道还有没有什么疑问,根据上一节哈,有人会想   为什么不是这样    ss = (int *)point;  或者 ss = (unsigned int *)point;
(int *)point   就把后面的point(0x40010800) 当成了一个地址,然后把这个地址赋值给ss不行吗?
记住哈,指针也是有类型的   ss是一个什么呀

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

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




那 ss = 这边也应该是一个结构体类型的指针    所以才需要  

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

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



所谓:   鱼找鱼虾找虾乌龟找王八


但是那样写有点麻烦
要是直接代替掉

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

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


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

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


就好了

,可以这样

#define  GPIOA  (GPIO_TypeDef *)point

就是用GPIOA  替换掉后面的指针
现在GPIOA  所指向的就是GPIO_TypeDef  这个结构体了



写的好点就是

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

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





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

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



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

咱就咱建一个stm32f10x_gpio.c   和  stm32f10x_gpio.h 的文件,对函数进行进一步的封装

先写设置输出高电平的(注意哈,我写的函数是根据ST写的库写的,不是按照自己的想法写的,主要是在下一节学习库的时候,让大家感觉亲切)

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

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




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

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



这样多个文件大家应该懂吧???  改天我再写一篇关于文件编译和多文件编译的文章.

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

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


定义成,结构体指针变量,这样就可以直接传进来  


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

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


因为GPIOA,GPIOB,GPIOC 就是结构体指针变量
咱控制PA0输出高电平
GPIO_SetBits(GPIOA,0)   
控制PA1输出高电平
GPIO_SetBits(GPIOA,1)  
咱想要的是这样
然后按照咱想的设计一下里面的内容(咱还是用ODR实现哈哈)

3-STM32

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

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




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

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




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

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



GPIOx->ODR = (unsigned int)1

假设传进来的是0
GPIOx->ODR = (unsigned int)1

GPIOx->ODR = 0x0001

假设传进来的是1
GPIOx->ODR =(unsigned int)1
GPIOx->ODR = 0x0002

貌似是可以但是有件事就是每次都会清除原来的
这事情简单
GPIOx->ODR |= (unsigned int)1
加个 |  或  就可以了
咱现在测试测试

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

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

   

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

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




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

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




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

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





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

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



还可以哈
现在设置模式,由于引脚的模式的有好几个,还有设置引脚的速率,所以呢就用一个结构体配置引脚的模式和速率

温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
回复 推荐到N格

使用道具 举报

大神点评(1)

您需要登录后才可以回帖 登录 | 立即注册
    云凌阁
    正需要,支持云凌阁!
    回复 支持 反对

    使用道具 举报

    相关推荐
    云凌阁

    关注1

    粉丝0

    帖子94526

    发布主题