历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2019年03月28日 | STM32固件库使用分析

2019-03-28 来源:eefocus

STM32的V3.3.0库,内有CMSIS的文件夹为arm Cortex微控制器软件接口标准,现在将我实际工作中的作一个简要分析:


       1.选择启动文件:根据自己所用的芯片的型号,选择正确的启动文件。这个根据数据手册上的划分。例如STM32F101VBT6,就选择startup_stm32f10x_md.s,在这个文件里,首选要定义自已的堆和栈的大小,这个根据自已的需要确定。文件中已经定义好了中断向量的位置及堆和栈的初始化操作。

             Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


从上面这段文字中,可以看到,在系统复位后,先执行SystemInit(),再进入main()函数。SystemInit()在文件system_stm32f10x.c中定义,我们稍后再说。

    

2.stm32f10x.h:这个头文件包含了STM32的大部份定义:


       a.定义芯片的类型,如#define STM32F10x_MD

       b.定义是否包含标准库,#define USE_STDPERIPH_DRIVER

       c.定义外部振荡器频率,#define HSE_VALUE


       上面三个定义,建议在main.c文件中刚开始就定义好,或者是在编译器选项中定义好,  这样就可以不修改这个文件了。


        d.定义中断号

        e.包含 core_cm3.h,system_stm32f10x.h

        f.定义数据类型,u8,s8等为了兼容以前的库所定义的数据,建议程序中用标准的uint8_t这样的类型。此外还定义了bool,FlagStatus,alStatus及ErrorStatus

        g.定义外设结构体,地址及用到的数据常量。

        h.包含stm32f10x_conf.h来配置外设

        i.定义位操作的宏

   

3.system_stm32f10x.h和.c,这两个文件中:


       a.定义一个全局变量 uint32_t SystemCoreClock: 系统时钟频率与你选择有关

       b.SystemInit():这个函数就是启动文件中调用的函数

        (1) 在system_stm32f10x.c的开始部份,选择相关的系统时钟频率,

             如#define  SYSCLK_FREQ_24MHz  24000000

        (2) 通过SystemInit()函数,就将SYSCLK = HCLK = PCLK1=PCLK2=PLL输出24MHz。注意:这个频率为HSE为8MHz时为条件,如果HSE不为8MHz或用HSI时,就会有问题。

       c.SystemCoreClockUpdate():更新SystemCoreClock的值,与系统频率一致。

       可能看到,这个文件中的RCC设置很有局限性,所以在程序中,可以不用它,而用标准库存中的stm32f10x_rcc中的函数进行设置。

  

4.stm32f10x_conf.h

     a.配置需要的标准外设库,需要用到的外设,把相应头文件包含进去就可以。

     b.定义assert_Param的模式,选择#define USE_FULL_ASSERT时,断言输出问题所在的位置,在调试时很有用,在正式版本时,把它注释掉即可。

   

5.core_cm3:与CM3内核相关的操作,重点如下:

      a. 在MDK中,开总中断:__enable_irq();   关总中断:__disable_irq();

      b. 中断处理程序:

          (1) NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

               设置中断组,这里的值只能是0~7,在STM32中,只能用8位中的前4位来设置组,可以分为两部份:抢占优先级和亚优先级。这个数值就是亚优先级开始的位。它前面的位是抢占式优先级的位。例如:NVIC_SetPriorityGrouping(5),那么D7,D6表示抢占式优先级(0~3),D5,D4表示亚优先级(0~3)。优先级数值越小,优先级越高。抢占式优先级高的中断可以打断抢占式优先级低的中断。抢占式优先级相同,亚优先级不同的两个中断,如果同时到来,先执行亚优先级高的中断,再执行亚优先级低的中断,但不能打断。

         (2) NVIC_EnableIRQ(IRQn_Type IRQn);   使能一个中断

         (3) NVIC_DisableIRQ(IRQn_Type IRQn);   禁止一个中断

         (4) NVIC_SetPriority(IRQn_Type IRQn,uint32 priority); 设置一个中断的优先级

         (5) NVIC_EncodePriority(uint32_t PriorityGroup,uint32_t PreemptPriority,uint32_t SubPriority);

         (4)和(5)通常一起使用,这样设置更直观,例如要将外部中断0设为抢占式优先级为0,亚优先级为2,则:

         NVIC_SetPriority(EXTI0_IRQn,NVIC_EncodePriority(5,0,2));

         注意PriorityGroup的参数应与(1)中设置的一致。

         除了这种方式设置中断外,也可以使用标准库中的misc中的中断设置函数来操作。
     c. SysTick_Config(uint32_t ticks):设置系统嘀嗒时钟并使能中断

         在STM32中与CM3内核描述不太一样,这个时钟源有两个选择:AHB/8和AHB,在该函数中是选择了HCLK(SysTick_CTRL_CLKSOURCE_Msk),所以定时时间=ticks / HCLK,当要定时10ms,而HCLK为24MHz时,ticks = 10000 * 24 = 240000。

         如果需要选择HCLK/8,可以直接修改这个函数,或在这个函数后跟随misc中的SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)来设置。

      d.NVIC_SystemReset():复位芯片。

  

6. stm32f10x_it中断实现,在这里编写相应的中断服务函数。

  

7.还需要注意的一点是:进入main函数后,除了设置嘀嗒时钟和中断外,在操作各外设之前,调用:RCC_AHBPeriphClockCmd(),RCC_APB1PeriphClockCmd(),RCC_APB2PeriphClockCmd(),启动相应的时钟,否则外设就不能正常工作。


推荐阅读

史海拾趣

博通集成(BEKEN)公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,博通集成开始积极拓展市场。公司凭借优质的产品和服务,赢得了众多客户的信赖和支持。同时,公司注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。如今,博通集成已成为无线连接芯片设计领域的知名品牌。

Everspin公司的发展小趣事

Everspin公司成立于XXXX年,总部和晶圆厂均位于美国亚利桑那州的钱德勒市。自成立以来,Everspin一直致力于磁阻随机存取存储器(MRAM)技术的研发和商业化。2006年,Everspin成功推出了业界第一款商业化MRAM产品,这一突破性的技术为数据存储领域带来了革命性的变化。

捷茂微(GATEMODE)公司的发展小趣事

在XXXX年,Everspin的股票开始在纳斯达克全球市场交易,股票代码为MRAM。这一上市动作不仅为Everspin提供了更多的资金支持,也进一步提升了其在行业中的知名度和影响力。此外,兆易创新旗下的GigaDevice半导体(香港)有限公司还斥资500万美元购买了Everspin约5%的股份,显示出市场对Everspin技术和发展前景的认可。

ELMOS公司的发展小趣事

ELMOS的Fab-Lite方法为晶圆加工和测试业务提供了灵活和高效的制造策略。这种制造策略使得ELMOS能够根据市场需求快速调整生产计划,确保产品的及时供应。同时,通过与亚洲领先的晶圆代工厂合作伙伴的成功合作,ELMOS确保了供应链的安全和稳定,为客户提供了无与伦比的性能。

Hirose公司的发展小趣事

近年来,中国市场对汽车电子产品的需求不断增长,为ELMOS提供了广阔的发展空间。为了抓住这一发展机遇,ELMOS不断加大在中国的投入力度,扩大其在中国市场的规模和影响力。通过与国内汽车制造商和合作伙伴的深入合作,ELMOS在中国市场取得了显著的成果,并为公司未来的持续发展奠定了坚实的基础。

以上五个故事分别从不同角度展示了ELMOS公司在电子行业中的发展历程和成就。这些故事不仅体现了ELMOS的技术实力和市场竞争力,也展示了公司在全球化和国际化方面的努力和成果。

Electro-Term/Hollingsworth公司的发展小趣事

在快速发展的过程中,Electro-Term公司始终重视人才培养和团队建设。公司建立了完善的人才选拔和培训体系,为员工提供广阔的发展空间和良好的福利待遇。同时,公司还鼓励员工积极参与创新实践和技术交流,营造了浓厚的学术氛围和团队合作精神。这些举措为公司的发展提供了有力的人才保障。

问答坊 | AI 解惑

【推荐】基于LabVIEW的数据采集高级编程

[时间] 2010/01/26   |   13:30 -  16:30 [地点] 苏州丽都大酒店5楼4号会议厅(苏州市干将西路168号) [主办公司] 美国国家仪器有限公司 [简介] NI LabVIEW + 数据采集的完美体验!      &n ...…

查看全部问答>

初学者学嵌入式的学习计划

只会一些编程语言的初级知识,如何学嵌入式阿…

查看全部问答>

nandflash使用中出现坏区导致wince系统崩溃

在使用arm9开发板时,对nandflash读写上千次之后,系统出现问题, 打开调试终端后发现: FMD_GetBlockStatus::Logical block 0x53B is marked as bad FMD_GetBlockStatus::Logical block 0x53B is marked as bad FMD_GetBlockStatus::Logical b ...…

查看全部问答>

无聊,大家一起休闲下~~

http://www.hougong.info/?fromuid=92961…

查看全部问答>

Linux内核的 Fec.c 接收函数中 收不到 bpdu包,怎么回事

我发送bpdu包(组播包),为什么在Fec的接受函数里收不到呢。 而广播包,还有目标Mac为板子的Mac的包可以接受到。 怎么回事,不懂? 请教达人帮忙!!!!!…

查看全部问答>

S3C2440板子SDRAM不转,为什么?

     最近做了一块S3C2440的板子,程序从FLASH搬4K到2440内部的SRAM中初始化CPU,SDRAM后,(前4K代码运行正常,有指示灯显示),搬代码到SDRAM中,在SDRAM运行,就运行不了,程序跑飞,不知道为什么?     &n ...…

查看全部问答>

做一个打蟑螂(灶麻子)的电击盘

关于这个电路我想做个说明: 主要电路是变压器T极其分布电容,其工作原理图见http://photo.163.com/photos/qingjidanpianji/131797516/3575663836/,V1,V2组成反馈式振荡升压电路.其中T是稳压(随身听用)电源其规格是220V/3V/2W的变压器,兼作反馈元件, ...…

查看全部问答>

有兴趣的兄弟来加入硬件/嵌入开发 无线QQ群

有兴趣的兄弟来加入硬件/嵌入开发 无线QQ群 让我们来进同进步吧!!!!!一起交流开发经验!!! 群号36507037 …

查看全部问答>

关于并口和USB仿真器的问题

最近正在用FE425做一个程序,用并口调试时读不到SD16的转换结果,但是同样的设置(只是把下载器设置改了一下)USB仿真器却可以读出来。为什么呢???…

查看全部问答>