美文网首页
1# 最小的启动程序

1# 最小的启动程序

作者: dogo_L1L | 来源:发表于2018-11-24 21:41 被阅读0次

    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—F103指南者 P25

           有了这个信息就容易选择自己需要的芯片,比如后期设计的时候,我们并不会使用开发板而是使用最小系统进行开发,在淘宝网上进行搜索:STM32最小系统,(不是广告),会找到类似这样的。也能估摸的认识到芯片的内容。

    不是广告.png

           这里还是要矫正一下一些对开发板的误解,开发版的价格大约都是300左右,但是最小系统却只要20左右,这是因为开发版上含有大量的外设,比如LED,显示屏,蜂鸣器,WIFI,按钮等。学习时使用的是开发板,因为资源丰富;设计时,使用的是最小系统,因为价格便宜。
           当我们使用一款芯片的时候,首先就需要资料,一般有两个资料:参考手册(Reference Manual)数据手册(Data Sheet)这些资料是官方提供的,较为权威。STM官网
           另外我学习的时候完整的看完来野火STM32

    3# 实战

           接下来我们开始实际的编程。相比于51单片机,STM32的外设非常丰富,有GPIOA-E,并且每个GPIO的寄存器控制16个引脚。有官方的库提供支持。

    3#1 创建项目

    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
    image.png
    1. 创建项目
    image.png
    1. 放置位置
    image.png
    1. 根据自己的型号进行选择
    image.png
    1. 出现了CAN的库找不到(不要慌,暂时用不到)
    image.png
    1. 导入步骤1中的文件
    image.png

    确认文件目录:

    image.png
    1. 测试主函数为空
    image.png

    报错信息如下:
    .\Objects\mini.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o)

    1. 补充 SystemInit 函数
    image.png

    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 配置

    1. 启用 Use MicroLib
      目的是为了使用串口通信的时候直接使用printf。否则会报错。(串口通信时使用)
    image.png
    1. 输出配置
      目的1:生成 hex 烧录文件
      目的2:后期为了文件夹的独立性,会指定输出文件夹在 Project 中的位置,方便查找。
    image.png
    1. 链接文件配置
      目的:指定链接文件(.h)文件在Project中的位置,克服.h文件在不同文件夹中无法调用的问题。
    image.png
    1. debug设置
      目的:为了正常烧录,必不可少。
    image.png

    前提:插上STM32开发板

    image.png image.png
    1. Utilities设置
      几乎不用设置
    image.png

    4#2 下载程序

    警告:烧录后,你的开发版不会显示任何信息。并且原本的显示屏部分也不会显示信息,如果原本有外设开启,并且烧录后,外设不工作,说明烧录正常,可以开始STM32之旅。

    image.png

    5# 制作模版

           刚刚体验了一把配置的痛苦,各种不知名的,细小的配置,几乎毫无头绪。为了解决这个问题,我们可以制作一个模版,将我们需要的配置程序,放入模版中,使用时复制即可。

    相关文章

      网友评论

          本文标题:1# 最小的启动程序

          本文链接:https://www.haomeiwen.com/subject/reeyqqtx.html