STM32高级开发(9)-学习与编译libopencm3-example

发布者:Jinghua6666最新更新时间:2022-06-20 来源: eefocus关键字:STM32  高级开发  编译 手机看文章 扫描二维码
随时随地手机看文章

在前面的几篇中我们为大家介绍了在Linux下stm32开发环境的新特性和使用方式,可能大家觉得,我怎么写一个工程还要自己写链接文件和启动文件,是不是太不方便了点。那么这篇中我会告诉大家其实并不是这样的。在我们日常的一些小规模工程下我们是可以使用一个叫做libopencm3的cortexM核的通用驱动库来配置我们的工程。那么大型的工程呢?有童鞋还会问道。对于大型的工程,我想:自己去改写链接文件和启动文件,使得你对整个系统的启动及运行流程更好的把控绝对是物有所值的,在这两个文件上付出的短短的时间绝对会为我们带来超出他们花费的价值。


Libopencm3简介

libopencm3项目(以前称为libopenstm32)旨在创建一个适用于ARM Cortex-M0(+)/M3/M4内核单片机的免费、自由与开源(LGPL v3或更新)的固件库,其支持的单片机包括ST STM32, Ti Tiva and Stellaris, NXP LPC 11xx, 13xx, 15xx, 17xx parts, Atmel SAM3, Energy Micro EFM32等。


以上内容翻译自libopencm3在GitHub上的官方wiki中的介绍(请不要嘲笑我的翻译啦,大家明白意思就好,我就不费劲的去整理更好的语言描述了):

https://github.com/libopencm3/libopencm3/wiki


从Status的页面中我们可以查询到libopencm3目前所支持的单片机类型,其中由于该项目起初是为stm32而开发的,所以固件库对stm32的支持性是最好的,其次是TI和NXP的单片机,其他公司的MCU则要差许多,对支持性的描述大家可以在Status页面中自行阅读查找。


ST:STM32F0, F1, F2, F3, F4, F7, L0, L1, L4

TI: MSP432 nee LM4F nee TM4C

NXP:LPC13xx, LPC15xx and LPC17xx

NXP:LPC43xx

EFM32:Tiny Gecko, Gecko, Leopard Gecko and Giant Gecko

Atmel:SAM 3a, 3n, 3s, 3x, 3u

Freescale:Vybrid VF6xx

下载Libopencm3及其例程

在我们学习一个固件库的过程中最重要的显然是找到一个我们可以参考的样例工程,所以在我们此处选择下载Libopencm3的官方样例工程。


首先cd到我们之前创建的workspace目录下


$ cd ~/workspace


然后使用git指令克隆https://github.com/libopencm3/libopencm3-examples地址上的工程


$ git clone https://github.com/libopencm3/libopencm3-examples.git

这里写图片描述

我们点开克隆下来的工程进入其中的libopencm3固件库,会发现在文件夹下并不存在任何的文件,这是由于在样例工程中,配置引用了一个libopencm3固件库模块,这个submodule在我gitclone的过程中并不会被一起下载,所以我们需要cd进入工程使用git submodule init和update来更新注册并下载它。


$ cd ./libopencm3-examples

$ git submodule init

$ git submodule update

这里写图片描述

这里写图片描述

到此我们就已经成功的将样例工程下载下来了。


编译Libopencm3的样例

编译Libopencm3固件库

在我们编译样例工程之前我们首先要编译Libopencm3固件库从而生成库文件 .a,得以被样例工程调用。所以我们cd进入Libopencm3的目录并使用make编译。

这里写图片描述

这里写图片描述

这里再次讲一下这里生成的.a文件,.a文件是一种Linux下的静态链接库文件,而在我们的应用中我们可以把它理解为是一种由固件库中的.c和.h文件编译生成的集成库,就像keil下的 .lib 是一样的。


样例工程的文件结构

在刚刚下载下来样例工程的时候我想大家想我一样,对它两眼一摸黑,甚至连样例工程的下各个例子在哪都找不到。所以在下面我们首先为大家来介绍一下我们下载下来的样例工程结构,来为大家分析一下它的用法。


首先我们要明白,我们下载下来的是一个完整的样例工程即就像st官方的固件库资料一样,里面包含了很多小的工程,如流水灯,LCD显示,ADC等等,但他们都是引用文件结构下的一个库文件进行编译,这点是和国内stm32开发板(如:原子、野火等)的教程不大一样的。在了解这点后,我们来看下文件夹下的内容。


-libopencm3-examples

|-examples

|-libopencm3

|-scripts

|-Makefile

|-README.md


在 examples 存放的是样例的源代码,在其目录下以芯片型号分类成不同的文件夹。在libopencm3下,是libopencm3固件库的本体。scripts下存放的是libopencm3项目推荐的一个叫black_magic的调试器的启动文件,我们不需理会,README.md则是项目的说明文件,使用markdown语言编写,会在GitHub中的项目文件列表下自动显示。在此处顶层文件夹中的makefile中,它的功能是编译所有的样例文件下的子工程,我们不理会它,因为我们不会使用这个文件来编译。


下面我们进入 examples/stm32/f4的目录,由于我使用的是一块官方的F429DISCO开发板,所以在这个文件夹下是可以直接找到给这块开发板使用的子工程的,如果大家使用的是其他牌子或自行设计的开发板,大家可以选择一个与开发板上芯片主型号相同的官方开发板打开,因为除却外设接驳的端口等,实际上它们都是一样的。在板子的目录下我们可以看到不同功能的子工程,如 ADC、blink、button等。

这里写图片描述

我们进入最简单的例程:miniblink同时将终端cd进入该文件夹,输入make+空格,而后双击Tab,看看可以执行的目标:


$ make 

这里写图片描述

由于我们没有在makefile中配置好调试器,所以这里我们先选择编译.hex来编译。对于开发板上LED端口不对应的童鞋,在make前,可以先打开目录下miniblink.c的源代码修改其中的端口,及时我们之前没有接触过libopencm3的固件库,但我相信大家都是能够理解里面的内容的。

这里写图片描述

在修改完成后,我们使用make执行。


$ make hex


很快编译就会完成,并在子工程目录下生成一个.hex文件,我们将hex文件移出,下载进入单片机,看~是不是LED开始闪烁了?

这里写图片描述

由此我想大家就明白这个样例工程该怎么使用了,但是进一步的,大家肯定会产生疑问,这个样例工程下,makefile是怎样产生功能的,它是怎么配置的,么下下面我们就来深入的分析一下这个问题。


样例工程的makefile

我们来看看子工程目录下的make 也就是我们在该文件夹下执行make指令时首先调用的makefile文件。


BINARY = miniblink


LDSCRIPT = ../stm32f429i-discovery.ld


include ../../Makefile.include


除去文件头部的版权声明的注释,一共只有3行,第一行定义了一个变量BINARY ,这是我们在编译后生产工程执行文件的名称,此处为miniblink。然后为LDSCRIPT 变量赋值,设定了工程ld即链接文件件,其在当前目录的上方,最后include引用了一个在上上层的makefile。我们先来看看在这个文件的设定的ld文件,随后在来分析它引用的makefile。


MEMORY

{

    rom (rx) : ORIGIN = 0x08000000, LENGTH = 2048K

    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K /* (esden) This should be 256 but I get segfault. :( */

}


/* Include the common ld script. */

INCLUDE libopencm3_stm32f4.ld


我们打开上层目录的ld文件stm32f429i-discovery.ld,发现它定义了板子上STM32F429ZIT6的ROM、RAM大小并引用了libopencm3固件库下的libopencm3_stm32f4.ld文件,再打开libopencm3_stm32f4.ld文件,我们发现其中只定义了除ROM、RAM大小的所有链接规则。至此我们就明白了ld文件的设置及引用结构。接下来再来看看被子工程引用的makefile:Makefile.include。


ifeq ($(DEVICE),)

LIBNAME     = opencm3_stm32f4

DEFS        += -DSTM32F4


FP_FLAGS    ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16

ARCH_FLAGS  = -mthumb -mcpu=cortex-m4 $(FP_FLAGS)

endif


################################################################################

# OpenOCD specific variables


OOCD        ?= openocd

OOCD_INTERFACE  ?= stlink-v2

OOCD_TARGET ?= stm32f4x


################################################################################

# Black Magic Probe specific variables

# Set the BMP_PORT to a serial port and then BMP is used for flashing

BMP_PORT    ?=


################################################################################

# texane/stlink specific variables

#STLINK_PORT    ?= :4242


include ../../../../rules.mk


第一行,如果DEVICE变量为空,就执行下面的赋值,我们之前并未定义DEVICE所以下面的赋值会被执行。这里我们看到他定义了固件库的名称、芯片的型号和编译的参数。下面则定义了各种调试器的参数。并在最后再一次引用了一个makefile:rules.mk。而这一次我们先不打开这个makefile,在下面一个阶段里我们再来分析。


这里首先我们先讲讲,这里makefile和ld文件问什么分了这么多,搞得这么麻烦,其中最大的原因就是层次性和通用性,在我翻看其他的子工程源代码的情况下,我们会发现除了子工程目录下的makefile文件,其他的makefile文件和ld文件都被不同的子工程调用的多次,而到了rules.mk的文件,所有的不同型号芯片和板子的子工程都调用了这个makefile。以这种分层次分结构的的方式编写,显然的可以极大地方便最终子工程的设置修改和快速配置。


呃,是不是有点没大说清楚,我们举个具体的例子;就如在miniblink子工程文件夹下的makefile中,定义了子工程的设置。在开发板型号的目录下定义了,开发板和编译参数的具体设置,在最后的mk.rule中,则定义了所有样例工程的makefile设置。同理,ld文件的结构也是这样。


到这里我们对libopencm3工程的介绍就告一段落了,想来大家也对样例工程的结构有了一定的了解,从而可以自己去学习官方的样例工程了,在这里我还是建议大家先尝试的去更改官方样例工程的源代码,和makefile来试着编译自己的一个blink程序,来借此学习一下样例工程,从而为我们接下来的内容奠定一个基础。

关键字:STM32  高级开发  编译 引用地址:STM32高级开发(9)-学习与编译libopencm3-example

上一篇:STM32高级开发(6)-makefile与调试器驱动
下一篇:STM32高级开发(10)-搭架你自己的libopencm3工程

推荐阅读最新更新时间:2024-11-07 10:23

STM32按键消抖——入门状态机思维
在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架。掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能。 1 状态机思想 状态机,或称有限状态机FSM(Finite State Machine),是一种重要的编程思想。 状态机有3要素:状态、事件与响应 状态:系统处在什么状态? 事件:发生了什么事? 响应:此状态下发生了这样的事,系统要如何处理? 状态机编程前,首先要根据需要实现的功能,整理出一个对应的状态转换图(状态机图),然后就可以根据这个状态转换图,套用状态机编程模板,实现对应是状态机代码了。 状态机编程主要有 3 种方法:switch-case 法、表格驱动法、函数
[单片机]
<font color='red'>STM32</font>按键消抖——入门状态机思维
STM32与上位机发送和接收数据
(1)首先要配置USART1相关的GPIO(PA9,PA10),和USART1的初始化参数配置 (2)然后在配置中断向量控制器 (3)写发送数据的函数 注释:main()函数在写入数据赋值时,单个的数据或字符的发送根据ASCII码表进行换算; http://www.96yx.com/tool/ASC2.htm(ASCII对照表)
[单片机]
<font color='red'>STM32</font>与上位机发送和接收数据
基于STM32单片机的DLP驱动电路研究
DLP投影技术是应用美国德州仪器公司开发的数字微镜元件--DMD(Digital Micromirror Device)作为主要关键处理元件以实现数字光学处理过程的技术。DLP显示的色彩清晰度高、艳丽、细腻、逼真,且为全数字显示即可靠性极高,能在各类产品(如大屏幕数字电视、公司/家庭/专业会议投影机和数码相机(DLP Cinema))中提供最佳图像效果。目前,大部分的家用或商用DLP投影机都采用了单片结构,使得其便于移动携带,因而得到越来越广泛的应用。在目前应用发展的基础上,又对其结构的精简性、携带的方便性提出了更高的要求。传统的DLP投影仪是通过DVI接口接收外部信号,并且经过信号转换传送给DLP控制器来控制DLP的显示,占用的
[单片机]
基于<font color='red'>STM32</font>单片机的DLP驱动电路研究
STM32学习笔记一一USART
1.串口的基本概念 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 2.串口通信连接 接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据串行输。通过过采样技术来区别数据和
[单片机]
<font color='red'>STM32</font>学习笔记一一USART
STM32学习笔记之开发环境
本文主要由两部分组成,一是STM32开发环境MDK-ARM的介绍及安装,一是STM32官方库文件的下载与配置。 一、开发环境安装 (一)开发环境简介 KEIL公司目前有四款独立的嵌入式软件开发工具,即MDK、KEIL C51、KEIL C166、KEIL C251,它们都是KEIL公司品牌下的产品,都基于uVision集成开发环境,其中MDK是RealView系列中的一员。而MDK-ARM、KEIL MDK、RealView MDK、KEIL For ARM,都是同一个东西,ARM公司现在统一使用MDK-ARM的称呼。 KEIL MDK开发工具源自德国 Keil 公司,被全球超过 10 万的嵌入式开发工程师验证和使用,是ARM公
[单片机]
<font color='red'>STM32</font>学习笔记之<font color='red'>开发</font>环境
STM32单片机学习(9) LCD1602显示屏输出实验
核心代码由kingsraywii提供,本文作者对其进行整合、更详细地注释和部分代码改进, 添加了芯片ID获取、字符串输出和printf重定向输出功能 注:使用普中科技开发板测试时,需要拔掉Boot1插口 接5V电压,重启 /* * * 软件功能: LCD1602实验(软件延时方式) * */ #include stm32f10x.h #include delay.h #include stdio.h /* 定义宏变量 lcd_RS = data/command(H/L) 数据/命令操作 lcd_RW = read/write(H/L) 读写操作 lcd_Enable 使能操作 lcd_GPIO lcd1602接
[单片机]
STM32学习笔记——AFIO时钟的配置问题
最近在写程序时发现设置外部中断出了问题,之前的程序好好的怎么就不能用了呢?经过了一晚上的折腾发现问题出在AFIO时钟的配置上,我没有使能AFIO时钟。 什么时候要开启AFIO呢?参考手册: 说的很明白,操作AFIO的三类寄存器时需要开启: 1.事件控制寄存器(AFIO_EVCR) 2.复用重映射和调试I/O配置寄存器(AFIO_MAPR) 3.外部中断配置寄存器x(AFIO_EXTICRx) 这三类其实是AFIO的全部寄存器, AFIO_EVCR是事件相关的,AFIO_MAPR是与重映射和调试I/O相关的,AFIO_EXTICRx是与外部中断相关的。因此管脚重映射和调试I/O配置、外部中断、事件时需开启AFIO。 再回
[单片机]
<font color='red'>STM32</font>学习笔记——AFIO时钟的配置问题
STM32时钟问题(重点)
STM32上电默认时钟内部8MHZ,经过库函数SystemInit的初始化,设置成启用外部晶振模式,并设为系统时钟为PLL倍频后的时钟:72MHZ. * SYSCLK 72MHz * AHB 72MHz * PCLK1 36MHz * PCLK2 72MHz * PLL 72MHz 但是用户可以自己选择使用不同时钟,下面给出了几个函数。 可以配置成内部时钟或者外部时钟。 /* * 寄存器的方式设置系统时钟: * 输入PLL倍频因子,输入PLL的倍频值2—16倍频(注意:不同的芯片有不同的倍频因子) * HCLK = PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=U
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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