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


    STM32的固件库文件功能相当完善,提供的API完全能满足一般的项目需要。刚从51单片机转到STM32的人,肯定会被这么庞大的东东吓到,51单片机上对IO口操作,简简单单几行代码就搞定了,一个C源文件就搞定。假如用STM32,对IO口进行简单操作,远不是几行代码能搞定的。(其实直接操作寄存器也能搞定)。

       废话不多说,这就带你解剖固件库文件,包你看完之后豁然开朗。

       首先,请看一段简单的C语言代码

    #include <stdio.h>

    #define base 0x0012ff60
    #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)
    #define APB1PERIPH_BASE PERIPH_BASE
    #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
    #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
    #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

    小学学的加减法就能把GPIOA_BASE 算出来,为什么是这么多呢?看ST的手册,人家就是要规定这样,没办法。

    有了地址之后,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;

    要说人性化,ST还有一点不得不提,那就是位带操作,改变了 写地址-取地址数据-位操作-数据写入地址的操作,直接改为写地址-数据写入

    ,直接位操作。

    ST的编程结构是很值得借鉴的,使得编程序时结构很清晰,脉络很清楚。至于如何去发挥,得看个人水平了

    读过书,去过艰苦的大西北,干过牛马活,也流浪过街头
  • 相关阅读:
    测试小技巧之常用工具
    测试小技巧之浏览器插件
    可变参数列表
    对象属性和数组元素的初始默认值
    静态块(变量)和非静态块(变量)
    类初始化顺序
    基本类型的重载规则
    构造器访问权限控制
    MySQL Server架构图
    递归与非递归实现树的遍历(java)
  • 原文地址:https://www.cnblogs.com/MrDing/p/2425626.html
Copyright © 2020-2023  润新知