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入门开发--LED模块实现跑马灯
下一篇:STM32固件库文件树及构成详解
推荐阅读最新更新时间:2024-03-16 16:26
设计资源 培训 开发板 精华推荐
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸
- 答题赢好礼| ADI 智能楼宇烟雾探测方案
- 电子工程师,如何更好地拥抱GaN?参与问卷有好礼!
- 福禄克首款热成像万用表Fluke-279FC等你来尝鲜!晒心得享好礼喽!
- dsPIC33 “EV”系列抢鲜知,读专题,赢豪礼
- 下载有礼喽!2017年泰克亚太专家大讲堂第三期: 超宽带复杂电磁信号产生与实时分析技术
- 有奖直播:人机互动介面和机器视觉应用上的最佳助手--瑞萨电子 RZ/G, RZ/A 和 RZ/V SoC系列
- e络盟邀您齐聚2023慕尼黑电子展,三重好礼等你拿!
- 【已结束】TI 有奖直播|使用低成本 MSPM0 MCU 快速开发
- 试用Vishay新型“IHLP磁芯损耗计算器”,抢楼赢好礼