历史上的今天
返回首页

历史上的今天

今天是:2024年09月13日(星期五)

正在发生

2018年09月13日 | STM32固件库文件编程结构思想的理解

2018-09-13 来源:eefocus

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


推荐阅读

史海拾趣

C&K Switches公司的发展小趣事

C&K Switches公司的历史可以追溯到其创立之初。作为一家机电开关和互连解决方案的设计商和制造商,C&K在成立的早期阶段便以其在开关领域的精湛技艺和创新理念崭露头角。公司凭借对技术的深入研究和不断创新,逐渐在工业、交通运输、航空航天和数据通信等领域积累了丰富的经验。这一时期,C&K不断扩大产品线,提升产品质量,为公司的长远发展奠定了坚实的基础。

Abbatron公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,Abbatron公司开始将目光投向国际市场。公司积极参与国际电子展会,与海外企业建立联系,逐渐打开了国际市场的大门。通过不断的市场拓展和国际化战略,Abbatron公司的品牌影响力逐渐提升,成为了国际电子市场上的一股重要力量。

ENPIRION公司的发展小趣事

在经历了几年的快速发展后,ENPIRION公司被Altera公司收购。这一收购标志着ENPIRION公司进入了一个新的发展阶段。在Altera公司的支持下,ENPIRION公司得以继续扩大其研发和生产能力,推出更多创新的产品和服务。同时,随着人工智能、物联网和大数据技术的不断发展,ENPIRION公司也积极探索新的应用领域和市场机会,为其未来发展奠定了坚实的基础。

以上五个故事概述了ENPIRION公司在电子行业中的发展历程和关键里程碑。通过这些故事,我们可以看到ENPIRION公司凭借技术创新、市场扩展和合作伙伴关系等关键因素取得了显著的成功。

Hi-Optel Technologly Co Ltd公司的发展小趣事

在电源管理领域,ENPIRION公司不断面临各种技术挑战。例如,如何满足企业级、工业级、通信等市场对产品的高可靠性要求?如何提供最优的电源转换率以降低成本和散热?为了应对这些挑战,ENPIRION公司不断投入研发力量,推出了一系列创新的电源管理解决方案。这些解决方案不仅满足了市场的需求,还进一步巩固了ENPIRION公司在电源管理领域的领先地位。

Electro Adapter Inc公司的发展小趣事

随着全球环保意识的日益提高,EA公司积极响应绿色发展的号召,将环保理念融入到产品研发和生产过程中。公司采用环保材料、优化生产工艺、降低能耗等措施,努力减少产品对环境的影响。同时,EA公司还加强了对废弃产品的回收和处理工作,实现了资源的循环利用。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

Aydin Corp公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

问答坊 | AI 解惑

对突然来电的防护

在停电作业现场所发生的触电伤亡事故中,大多数是由于停电工作设备出现了突然来电或误登误触有电设备造成的。而停电工作设备出现突然来电的危害性尤为严重,如未采取可靠的防护措施,往往造成工作人员集体触电伤亡的重大事故的发生。 1 停电设备 ...…

查看全部问答>

VS2005 mfc无法添加消息???

VS2005中没有ClassWizard,而是使用属性窗口添加事件处理函数,但我写一个MFC本地应用程序时,在程序中使用工具栏ToolBar,在工具栏中新建了一项,却不知如何添加处理函数,属性窗口中没有可处理的消息列表呀。 …

查看全部问答>

在驱动程序中对串口进行读写,最大速度是多少?

是取决于波特率吗?要读写的是一个标准的虚拟串口。…

查看全部问答>

欢迎大家讨论:GPIO的 2-mA, 4-mA和8-mA端口驱动问题

GPIO的 2-mA, 4-mA和8-mA端口驱动中2,4,8-mA GPIO所承受的最大电流???还是其他意思??     这方面的资料比较少,希望大家讨论下,加深对mA的了解,也为了以后编程时遇到这方面的问题。 [ 本帖最后由 fxw451 于 2010-11-12 08:2 ...…

查看全部问答>

求高手指点----LM3S9B96以太网问题>

// systick中断处理函数//----------------------------------------------------------------------------- void SysTickHandler(void) { // 调用lwip定时处理函数 lwIPTimer(SYSTICKMS);   } //这是一个回调函数,当有UDP数据收 ...…

查看全部问答>

vxworks 6.6 core 2 945gme问题

我从网上看到的资料中学会了如何把在VMware上运行起. 但我把同样的东东到core 2CPU, 945GME上就只能出现++++++++++++++++++++++ 我了解到IA-32(X86)的CPU都有向前相容性,这个++++++++++++表示bootrom的代码都不能正常运行,什么原因, 有能人解释 ...…

查看全部问答>

msp430f5538和蓝牙模块cc2540无线通信的程序

各位大神谁有这个吗?给小弟一份参考参考,cpu型号不同也可。刚学啥都不会啊,求助,好人一生平安!…

查看全部问答>

2812有一个PWM口一直是低电平,请问是不是芯片坏了,其他五个输出都正常的

如题,测试过CPIO还是没法正常输出,感觉是强制拉低了,是什么原因吗…

查看全部问答>

请教什么是变压器阻抗电压

请教什么是变压器阻抗电压? \0\0\0eeworldpostqq…

查看全部问答>

运算放大器应用手册 中英文版资源分享

ADI官网上的运算放大器应用技术手册 终于找到了英文版和中文版,特意奉献出来。大家随意。呵呵 …

查看全部问答>