zoukankan      html  css  js  c++  java
  • 3-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语言不好......自己去百度哈,自己测试打印打印

    先说一个强制转换的问题

     

     可以测试看一下

     

    不知道还有没有什么疑问,根据上一节哈,有人会想   为什么不是这样    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;

    加个 |  或  就可以了

    咱现在测试测试

        

     

     

     

    还可以哈

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

  • 相关阅读:
    [转]Java中的POJO类
    使用PD进行数据库建模时的问题
    N-Gram模型
    [转] C#开源项目大全
    HTTP Error 503. The service is unavailable.
    abp 取消权限校验
    Oracle expdp/impdp导出导入命令及数据库备份(转)
    Oracle ORA-14102: 只能指定一个 LOGGING 或 NOLOGGING 子句
    Oracle ORA-01940: 无法删除当前连接的用户
    Oracle 把查询的多个字段赋值给多个变量
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/10492915.html
Copyright © 2011-2022 走看看