学习STM32也有些日子了。作为初学者,从最初的一无所知,到现在略知皮毛之皮毛,感觉着实不容易。
下面把自己的体会以及自认为初学者不易掌握的要点和大家分享一下,有错误的地方,欢迎大家指正。
一、关于学习方法
初学STM32给我的一个感觉就是,概念繁多而且很多都可以继续深究下去,教程对此又不可能都很详细的论述,但于我来说如鱼鲠喉实在不爽。
因为我喜欢刨根问底,网络资料又实在繁杂,如此又耗费精力,又打击学习积极性。
终于有一天,我转变了心态,如果STM32犹如枝繁叶茂的大树(整个嵌入式体系亦如此),我要做的不是连每一个叶子都明了,而是暂时只要知晓其主干及一些必要的干支即可。其他的枝叶等有时间再去深究,而很多脉络随着学习的深入也会逐渐清晰起来。
所以很多地方需要不求甚解,只要知道个概念即可,这些并不会影响自己的编程设计。相信假以时日,随着经验的丰富,涉猎的广泛,总有一天会打通任督二脉,通体舒泰:)
二、初学者容易疏忽及困惑的地方
这些只是我个人的体会,不一定完全正确
1、Keil ARM使用问题
a、忘记添加启动文件,我就出现过一次搞了半天才发现。。。其出错信息为“ error: L6236E: No section matches selector - no section to be FIRST/LAST.”
b、忘了在Options of Target ->C/C++->Preprocessor Symbols->Define中添加“USE_STDPERIPH_DRIVER,STM32F10X_HD”
前者的作用如下图,定义此参数后即可包含 stm32f10x_conf.h文件,而stm32f10x_conf.h可以设置包含(使用)固件库中的哪些外设。
后者则根据所使用芯片flash的大小选择,后缀表如下:
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列 超大容量 512-1024K
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128-512
启动文件的选择也可以参考此后缀。
2、一些概念
STM32固件库: STM32库为ST提供的API,基于它我们可以很方便的进行配置STM32寄存器等操作。
一开始我局限于单片机编程的思维,固执的排斥固件库,想通过单纯寄存器操作来编程。后来发现如果只是配置个GPIO口,点亮几个LED直接用寄存器方式当然不复杂,但随着代码量的增加此方法将会使人抓狂,因为STM32寄存器繁多,又不容易记忆,如此编程时需要不停的翻参考手册,这不是折磨人嘛。
而库函数则为我们封装了对寄存器的操作,提供了一系列的函数、宏、结构体等等,稍有点英文基础的话,会发现非常好记忆。记不住就直接复制黏贴:)
CMSIS标准(CortexMicroController Software Interface Standard)主要包括以下两个方面
内核函数层:包含用于访问内核寄存器的名称、地址定义,由ARM公司提供
设备外设访问层:提供片上核外外设的地址和中断定义,由芯片制造商提供
如想知道更详细的定义,请参考 点此
固件库一些文件简介:
core_cm3.c 和 启动文件都属于底层文件,由ARM公司提供,遵守CMSIS标准
system_stm32f10x.c 由ST公司提供,遵守CMSIS标准。主要用于设置系统时钟和总线时钟。
stm32f10x.h 寄存器封装的一些相关定义
misc.c 提供外设对NVIC的访问函数
stm32f10x_it.c 中断服务函数
位操作
a &=~(1<<6); bit6置0
a |=(1<<6); bit6置1
a^=(1<<6); bit6取反