STM32固件库使用分析

发布者:滁州鱼儿最新更新时间:2019-03-28 来源: eefocus关键字:STM32  固件库 手机看文章 扫描二维码
随时随地手机看文章

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(),启动相应的时钟,否则外设就不能正常工作。


关键字:STM32  固件库 引用地址:STM32固件库使用分析

上一篇:STM32入门开发--LED模块实现跑马灯
下一篇:STM32固件库文件树及构成详解

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

STM32】通用定时器的输入捕获(实例:输入捕获)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第14章 通用定时器 通用定时器输入捕获概述 输入捕获的工作原理 在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、左下部分(输入捕获)这三个部分。这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6、TIM7,其他的定时器都有输入捕获的功能。下面以一个简单的脉冲输入为例,简单地讲述一下输入捕获用于测量脉冲宽度的工作原理: 先设置输入捕获为上升沿检测,记录
[单片机]
【<font color='red'>STM32</font>】通用定时器的输入捕获(实例:输入捕获)
STM32 控制lcm液晶ILI9341驱动的液晶驱动程序(续)
在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们! LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Register Select寄存器选择 WR:Write写信号,低电平有效 RD:Read读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是
[单片机]
STM32中定时器的时钟源
STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器
[单片机]
<font color='red'>STM32</font>中定时器的时钟源
STM32关于USART的问题集锦
1、STM32103USART1死机 问:voidUSART_Receive(USART_TypeDef*USARTx) { if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) { USART_ClearFlag(USARTx,USART_FLAG_RXNE); s =USART_ReceiveData(USART1); delay(1000); s =USART_ReceiveData(USART1); delay(1000); s =USART_ReceiveData(USART1); delay(1000); write_c
[单片机]
STM32学习之通用定时器的使用
简介:STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器。此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期。还有一个RTC,是一个毫秒定时器,支持秒级中断,用来做实时时钟计数器。看门狗定时器 也可以算一个。 8个定时器中,Timer1 和Timer8是由APB2(输出最高频率为72MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为72MHz。Timer2~Timer7则是由APB1(输出最高频率为36MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为36MHz。 1、如何进行程序编写 这
[单片机]
<font color='red'>STM32</font>学习之通用定时器的使用
基于STM32芯片的指纹识别系统设计与实现
引言 指纹识别是根据每个人指纹的不变性和唯一性进行身份识别的一门技术。随着社会的发展,嵌入式的指纹识别技术越来越受到市场的青睐,成为近年研发的重点,但目前的嵌入式指纹算法大多在实时性和准确度上还存在不足,需要进一步优化算法,以实现准确高效的指纹识别。 本研究设计、实现一种基于STM32芯片的指纹识别系统,通过指纹传感器采集指纹数据,指纹算法处理指纹数据实现指纹识别,同时结合VC++平台建立人机交互界面对指纹图像数据显示。 1、系统硬件设计 1.1、结构组成及特点 本研究采用ARMcortex-M3内核的32位处理器STM32F-103ZET6作为主控制器,该芯片内部采用哈佛结构、其中集成有64KB的RAM和512KB的FL
[单片机]
基于<font color='red'>STM32</font>芯片的指纹识别系统设计与实现
STM32单片机串口一键下载电路与操作方法详解
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 要了解STM32的几种启动模式. BOOT0接GND,BOOT1接GND.那就是正常的启动模式,从flash加载代码. 而BOOT0接V3.3,BOOT1接GND.则是ISP模式,也就是串口更新代码. 其次,你要了解STM32 ISP下载代码的过程. 首先BOOT0接V3.3,然
[单片机]
<font color='red'>STM32</font>单片机串口一键下载电路与操作方法详解
ST低价32位MCU:传承STM32基因 发展自己的生态系统
日前,意法半导体发布了它最新的STM32F030基于Cortex-M0内核的超值系列微控制器,以0.32美元的批量订货价格引发热议。意法半导体表示:“与同类竞争产品不同的是,STM32F030虽然只有8位微控制器的价格,但在性能和特性上并没有受到任何影响。它保持了原有的内核速度和丰富的外设,传承了STM32F0家族的优异基因。”STM32F030将面向工业控制、消费电子和家用电器三大目标应用。 低价来源于规模经济 打造宽产品线平台 在新品的交流中,意法半导体大中华与亚太区微控制器市场及应用总监James Wiart提供了这样的数据:从2009到2012年,ST在MCU市场的份额翻了一番,年增长率达到市场平均的三倍。其中
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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