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

发布者:巳午未最新更新时间:2018-09-13 来源: eefocus关键字:STM32  固件库文件  编程结构 手机看文章 扫描二维码
随时随地手机看文章

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


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


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



#include


#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的编程结构是很值得借鉴的,使得编程序时结构很清晰,脉络很清楚。至于如何去发挥,得看个人水平了


关键字:STM32  固件库文件  编程结构 引用地址:STM32固件库文件编程结构思想的理解

上一篇:菜鸟初识STM32固件库文件夹
下一篇:STM32库文件结构及CMSIS介绍

推荐阅读最新更新时间:2024-03-16 16:14

STM32 之 HAL库、标准外设库、LL库
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。前两者都是常用的库,后面的LL库是ST最近才添加,随HAL源码包一起提供,目前支持的芯片也偏少。各库如下所示: 其中,STD库和HAL库两者相互独立,互不兼容。几种库的比较如下: 目前几种库对不同芯片的支持情况如下: 上图中,LL库目前有部分芯片不支持,官方计划2017年逐步完善。 STM32Snippets 它是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者
[单片机]
<font color='red'>STM32</font> 之 HAL库、标准外设库、LL库
STM32中uCOS的任务切换讨论
在STM32平台下,移植了uCOS V291的核。然后在网上下载了一个移植文件: os_cpu_c.c os_cpu_asm.asm 本人并没有非常详细地去看任务切换过程的具体实现。只是大致有了一个了解。 当在后台程序中调用OSCtxSw()或OSIntCtxSw()进行任务切换时,其操作都是触发一个软中断PendSV_Handler(),让软中断来进行切换任务栈。如下: OSCtxSw LDR R0, =NVIC_INT_CTRL LDR R1, =NVIC_PENDSVSET STR R1, BX LR OSIntCt
[单片机]
再造STM32---第十四部分:STM32 中断应用概览
本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件、《ARM Cortex™-M4F 技术参考手册》 -4.3 章节: NVIC 和 4.4 章节: SCB—4.4.5 的 AIRCR。STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。 本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。 14.1 异常类型: F429 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有
[单片机]
再造STM32---第十四部分:<font color='red'>STM32</font> 中断应用概览
STM32的ADC输入通道配置
STM32中最多有3个ADC模块,每个模块对应的通道不完全重叠。 下图是STM32F103CDE数据手册中的总框图的左下角,图中可以看出有8个外部ADC管脚分别接到了3个ADC模块,有8个外部ADC管脚只分别接到了2个ADC模块,还有5个外部ADC管脚只接到了ADC3模块,这样总共是21个通道。 下表是这些ADC管脚与每个ADC模块的对应关系,表中可以看出ADC1还有2个内部通道,分别接到内部的温度传感器和内部的参照电压:
[单片机]
<font color='red'>STM32</font>的ADC输入通道配置
STM32EXTI外部中断中使用5以后的口配置说明
当我们在使用外部中断的时候 STM32基本每一个io口都可以当外部中断使用,在设置中断优先级的时候有个很模糊的地方容易出错 这里我说一下   定义中断口的代码我略过,这里假设使用的是PG8口做外部中断,EXTI8线    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   NVIC_config.NVIC_IRQChannel=EXTI9_5_IRQn;   NVIC_config.NVIC_IRQChannelPreemptionPriority=0;   NVIC_config.NVIC_IRQChannelSubPriority=0;   NVIC_con
[单片机]
STM32的BOOT概述
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启
[单片机]
<font color='red'>STM32</font>的BOOT概述
STM32 SysTick中断使用方法
SysTick中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在汇编文件中已经给出定义,直接到文件中查找即可。 本来NVIC提供了中断使能的函数,但是要求中断号要大于0(Value cannot be negative.),所以就不能调用NVIC中断使能函数了,直接在操作寄存器开启中断就可以了。 修改如下: #include delay.h #include led.h void Systick_Delayus
[单片机]
<font color='red'>STM32</font> SysTick中断使用方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved