1# 一些资料
我使用的是 STM32F103VET6(野火的指南者) ,是一块开发板,并不是最小系统,购买的时候卖家送了很多的资料,并附带有一个论坛。(FireBBS)并送了 STM32的手册的电子书。
由于安装的文件(KEIL和STM32的兼容包)这些网上的资料非常多,也就不进行展开了。
2# 开场白
本人在大学期间学过51单片机,对芯片的资源略懂一二。(没学过也没关系)
拿51单片机作为比较,在51单片机中,比较重要的资源,比如P0-P3的引脚,寄存器,中断。中断又是一个非常重要的资源,比如计时器,计数器等等。剩下的就是一些协议内容了,比如I2C,SPI等。
这就是51作为经典教材的原因,包含了基本所有的单片机中含有的内容,STM32 只是比51单片机的资源更加丰富,总体的思想是不变的。
看看STM32F103VET6中包含的意思吧。
ST:意法半导体公司
M:微控制器
32:32位
F103:(functional)基础版本,F10x的最高稳定主频位72MHz,F40x最高稳定主频位180MHz
V:100个引脚
E:Flash为512kB
T:一种封装类型
6:温度等级
有了这个信息就容易选择自己需要的芯片,比如后期设计的时候,我们并不会使用开发板而是使用最小系统进行开发,在淘宝网上进行搜索:STM32最小系统,(不是广告),会找到类似这样的。也能估摸的认识到芯片的内容。
不是广告.png 这里还是要矫正一下一些对开发板的误解,开发版的价格大约都是300左右,但是最小系统却只要20左右,这是因为开发版上含有大量的外设,比如LED,显示屏,蜂鸣器,WIFI,按钮等。学习时使用的是开发板,因为资源丰富;设计时,使用的是最小系统,因为价格便宜。
当我们使用一款芯片的时候,首先就需要资料,一般有两个资料:参考手册(Reference Manual)和数据手册(Data Sheet)这些资料是官方提供的,较为权威。STM官网
另外我学习的时候完整的看完来野火STM32。
3# 实战
接下来我们开始实际的编程。相比于51单片机,STM32的外设非常丰富,有GPIOA-E,并且每个GPIO的寄存器控制16个引脚。有官方的库提供支持。
3#1 创建项目
- 创建文件夹用来存放我们的项目
加入3个文件,
main.c(新建,空)
stm32f10x.h(新建,空)
startup_stm32f10x_hd.s(官方固件库提供)启动文件
路径为:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_hd.s
- 创建项目
- 放置位置
- 根据自己的型号进行选择
- 出现了CAN的库找不到(不要慌,暂时用不到)
- 导入步骤1中的文件
确认文件目录:
image.png- 测试主函数为空
报错信息如下:
.\Objects\mini.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o)
- 补充 SystemInit 函数
Warning信息如下:
main.c(8): warning: #1-D: last line of file ends without a newline
3#2 解析
我们将上面的
Error信息复制如下:
.\Objects\mini.axf:
Error: L6218E: Undefined symbol SystemInit (referred fromstartup_stm32f10x_hd.o)
提到了文件 startup_stm32f10x_hd.o 而我们实际的文件为 startup_stm32f10x_hd.s ,确实这两个文件是有关系的,.s 文件经过 gcc的编译会形成 .o 。所以解决该问题要查看 .s 文件的源码(358)。我们可以利用 SystemInit 定位信息
image.png代码如下:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
这里定义来两个入口一个为 main 函数入口,另一个为 SystemInit 入口。SystemInit 是控制时钟频率的函数。于是当我们定义该函数的时候,程序能正常找到入口,所以不会报错。
Warning信息如下:
main.c(8): warning: #1-D: last line of file ends without a newline
Warning信息中提示了在文件的末尾要有一个新行才是符合标准的。所以加入新行后Warning 就会消失。
4# 烧录
4#1 配置
- 启用 Use MicroLib
目的是为了使用串口通信的时候直接使用printf。否则会报错。(串口通信时使用)
- 输出配置
目的1:生成 hex 烧录文件
目的2:后期为了文件夹的独立性,会指定输出文件夹在 Project 中的位置,方便查找。
- 链接文件配置
目的:指定链接文件(.h)文件在Project中的位置,克服.h文件在不同文件夹中无法调用的问题。
- debug设置
目的:为了正常烧录,必不可少。
前提:插上STM32开发板
image.png image.png- Utilities设置
几乎不用设置
4#2 下载程序
警告:烧录后,你的开发版不会显示任何信息。并且原本的显示屏部分也不会显示信息,如果原本有外设开启,并且烧录后,外设不工作,说明烧录正常,可以开始STM32之旅。
image.png5# 制作模版
刚刚体验了一把配置的痛苦,各种不知名的,细小的配置,几乎毫无头绪。为了解决这个问题,我们可以制作一个模版,将我们需要的配置程序,放入模版中,使用时复制即可。
网友评论