嵌入式新手学寄存器还是库函数

嵌入式新手学寄存器还是库函数,第1张

如果有相关嵌入式开发基础,可以从寄存器开始学。如果是第一次接触单片机,建议从库函数开始学,这样上手快,等熟练后分析库函数,就可以学习各寄存器了。这还用问吗?当然是寄存器了。

哦,不对,当然是库函数了。

下面是我以前写了一篇汇总文章,可以看一下;

【STM32系列汇总】博主的STM32实战快速进阶之路(持续更新)_GREYWALL-CSDN博客

先说一下目前ST推出的CubeMX

STM32 基于 CubeMX配置GPIO点亮LED灯(超级详细+图文并茂)

尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解。

Cube全家桶

曾几何时,ST刚推出CubeMX的时候,自动生成的外设初始化代码都会有这样那样的错误,而如今,随着软件的迭代升级,Cube生态也越来越完善,并且使用也越来越方便,ST推出的STM32Cube Ecosystem提供了免费整套的开发软件工具和嵌入式软件包,其中可以从芯片的外设配置,程序开发,程序下载以及系统监视一系列的功能。如下图所示;

STM32 CubeMX 几乎STM32的设备都可以使用这个工具初始化配置代码,这个是基于Java开发的图形化界面配置软件,可以为Cortex-M自动生成需要配置的C代码,还可以为支持Linux系统的Cortex-A内核生成设备树。

STM32 CubeIDE 这是一款ST推出的免费的集成开发环境,基于Eclipse和GNU C/C++ 等开源工具链,可以编译调试代码,并且官方也将STM32 CubeMX集成到IDE中,这样整个软件的配置和开发变得浑然一体,便捷非常。

STM32CubeProgrammer 软件编程工具,支持(JTAG,SWD,UART,USB DFU,I2C,SPI,CAN)等方式对设备和外部存储器进行读写。

STM32CubeMonitor 系列工具。强大的监视工具可帮助开发人员实时微调其应用程序的行为和性能,这个目前还没有尝试,暂且先相信官方的自夸吧。

所以使用以上的ST Cube全家桶进行STM32的软件开发,还是有不少坑要在实践过程中慢慢爬,整体的一个流程基本如下;

第一步:使用 CubeMX初始化相应的芯片外设功能等等;

第二步:使用CubeIDE进行代码编辑调试等 *** 作,当然,如果你喜欢也可以使用IAR,Keil,或者VSCode,这个完全出自个人喜好和习惯,但是据说CubeIDE里集成了CubeMX,这个难道不香吗? 加上如果想使用 gcc编译器,那也省去了很多配置的麻烦;

第三步:使用CubeProgrammer进行程序烧录,主要是支持的协议多啊,还可以吧,感觉是吹的挺厉害的;

第四步:以后可能会出更多的功能插件,目前感觉不是十分必要。

CubeMX

STM32 CubeMX的安装,十分简单,不过下载需要提交邮箱,基本根据系统提示就可以完成,另外,STM32 CubeMX目前自动生成的代码支持官方的HAL库和LL库,像以前笔者常用的标准外设库就已经被ST抛弃了,最新的STM32F7已经不支持标准外设库了。 同时,CubeMX初始化生成C代码项目,最终的工程可以符合IAR,Keil MDK和GCC,所以这里相对来说比较方便,不用对着手册撸寄存器了,也不用对着官方标准外设库demo进行移植,真的是哪里不会点哪里。

HAL库的封装相对来说好一点,但是代码读起来相对比较冗杂,通用性和移植性好,符合软件工程的设计思想,那么会牺牲一点效率了。

LL库会再底层一点,这几个的选择还是看个人喜好和团队的需要了。

CubeIDE

再官网下载CubeIDE这个软件并安装,假设你已经成功安装并打开了软件,会看到;

这时候CubeIDE已经集成了CubeMX了,新建STM32工程,step by step即可快速开始了。

CubeProg

整体看了一下 STM32 CubeProg 的介绍,其实有点还是可以的,首先这个软件支持多平台如:Windows, Linux, macOS等等,Java 进行开发的有点,这一系列差不多都是用Java开发的吧,另外可能对st-link的支持比较好,如果使用jlink的话,用个openocd也无妨,但是毕竟是套装,下面简单罗列一下;

支持擦除,读写Flash等等 *** 作;

支持Motorola S19, HEX, ELF 和 二进制格式;

ST-LINK的固件升级;

多平台:Windows, Linux, macOS,其实就看好这一点;

结语

对于Cube进行了简单的学习和介绍,目前还有不少坑要爬,建议看一下HAL的封装,有必要LL也可以看看,基本上还是符合CMSIS那套标准。另外关于开发环境,如果需要使用CubeIDE进行开发,它已经集成了CubeMAX,则无需另外下载了,直接一站式服务搞定,如果只需要生成初始化代码,那么CubeMAX还是有必要单独装一下的。至于寄存器,开发起来比较费时间。

手动码字,严重影响了我拔刀的速度,如果你觉得我走心,文章对您有所帮助,点赞,支持一波吧!

欢迎关注@极客小麦

编辑于 2021-04-09著作权归作者所有

赞同 25

一 STM 32 GCC 安装

stm32 属于arm cortex-m系列thumb指令集,所以给arm用的arm-none-eabi就可以了,首先是下载

下载地址:

https://launchpad.net/gcc-arm-embedded/+download

下载其中的gcc-arm-none-eabi-version-linux.tar.bz2

解压到你知道的目录会产生

gcc-arm-none-eabi的文件夹

把该编译器添加到你的环境中:

sudo gedit ~/.bashrc

在最后一行添加:

export PATH=$PATH:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin

因为我之前有添加过树莓派的编译器了,所以实际上是这样的:

export PATH=$PATH:/your_pi_gcc_dir/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin

两个编译器环境中间用冒号隔开

注销后测试:

arm-none-eabi-gcc -v

可以查看到该编译器的版本,就表示可以了.

二 工程环境的建立

新建个工程文件夹,及其目录

mkdir stm_project

cd stm_project

mkdir libs

mkdir src

mkdir inc

下载,安装官方库:

stm32的寄存器不像51 avr等单片机,那么少,自己写写库,背背寄存器就可以了,所以ST公司提供了他们官方的库,为了避免重复造轮子,就直接采用他们的库,库版本为STM32_USB-FS-Device_Lib_V4.0.0,这个库多了usb支持,下载的话到st官网搜索stm32f10x就有了.

下载链接:

stsw-stm32121.zip

解压,把解压好的文件夹复制到刚才新建的libs里面.

在工程根目录下新建Makefile.common文件,这个为通用makefile

# include Makefile

#This file is included in the general Makefile, the libs Makefile and the src Makefile

#Different optimize settings for library and source files can be realized by using arguments

#Compiler optimize settings:

# -O0 no optimize, reduce compilation time and make debugging produce the expected results (default).

# -O1 optimize, reduce code size and execution time, without much increase of compilation time.

# -O2 optimize, reduce code execution time compared to ‘O1’, increase of compilation time.

# -O3 optimize, turns on all optimizations, further increase of compilation time.

# -Os optimize for size, enables all ‘-O2’ optimizations that do not typically increase code size and other code size optimizations.

#Recommended optimize settings for release version: -O3

#Recommended optimize settings for debug version: -O0

#Valid parameters :

# OptLIB=0 -->optimize library files using the -O0 setting

# OptLIB=1 -->optimize library files using the -O1 setting

# OptLIB=2 -->optimize library files using the -O2 setting

# OptLIB=3 -->optimize library files using the -O3 setting

# OptLIB=s -->optimize library files using the -Os setting

# OptSRC=0 -->optimize source files using the -O0 setting

# OptSRC=1 -->optimize source files using the -O1 setting

# OptSRC=2 -->optimize source files using the -O2 setting

# OptSRC=3 -->optimize source files using the -O3 setting

# OptSRC=s -->optimize source files using the -Os setting

# all -->build all

# libs -->build libs only

# src -->build src only

# clean -->clean project

# tshow -->show optimize settings

#Example:

# make OptLIB=3 OptSRC=0 all tshow

TOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))")

PROGRAM=main

LIBDIR=$(TOP)/libs

#Adust the following line to the library in use

#=========add by embbnux 根据你的库不同,调整这个地方的库目录地址====================#

STMLIB=$(LIBDIR)/STM32_USB-FS-Device_Lib_V4.0.0/Libraries

#=========add by embbnux 根据你的stm32芯片型号容量不同,修改这个地方的TypeOfMCU=======#

#Adjust TypeOfMCU in use, see CMSIS file "stm32f10x.h"#STM32F103RBT (128KB FLASH, 20KB RAM) -->STM32F10X_MD#TypeOfMCU=STM32F10X_MD#STM32F103RET (512KB FLASH, 64KB RAM) -->STM32F10X_HD#STM32F103ZET (512KB FLASH, 64KB RAM) -->STM32F10X_HD

#============================================================================#

TypeOfMCU=STM32F10X_HD

#============================================================================#

TC=arm-none-eabi

CC=$(TC)-gcc

LD=$(TC)-ld -v

OBJCOPY=$(TC)-objcopy

AR=$(TC)-ar

GDB=$(TC)-gdb

INCLUDE=-I$(TOP)/inc

INCLUDE+=-I$(STMLIB)/CMSIS/Include

INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Include

INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates

INCLUDE+=-I$(STMLIB)/STM32F10x_StdPeriph_Driver/inc

INCLUDE+=-I$(STMLIB)/STM32_USB-FS-Device_Driver/inc

COMMONFLAGS=-g -mcpu=cortex-m3 -mthumb

COMMONFLAGSlib=$(COMMONFLAGS)

#Commands for general Makefile and src Makefile

ifeq ($(OptSRC),0)

COMMONFLAGS+=-O0

InfoTextSrc=src (no optimize, -O0)

else ifeq ($(OptSRC),1)

COMMONFLAGS+=-O1

InfoTextSrc=src (optimize time+ size+, -O1)

else ifeq ($(OptSRC),2)

COMMONFLAGS+=-O2

InfoTextSrc=src (optimize time++ size+, -O2)

else ifeq ($(OptSRC),s)

COMMONFLAGS+=-Os

InfoTextSrc=src (optimize size++, -Os)

else

COMMONFLAGS+=-O3

InfoTextSrc=src (full optimize, -O3)

endif

CFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE)

CFLAGS+=-D $(TypeOfMCU)

CFLAGS+=-D VECT_TAB_FLASH

#Commands for libs Makefile

ifeq ($(OptLIB),0)

COMMONFLAGSlib+=-O0

InfoTextLib=libs (no optimize, -O0)

else ifeq ($(OptLIB),1)

COMMONFLAGSlib+=-O1

InfoTextLib=libs (optimize time+ size+, -O1)

else ifeq ($(OptLIB),2)

COMMONFLAGSlib+=-O2

InfoTextLib=libs (optimize time++ size+, -O2)

else ifeq ($(OptLIB),s)

COMMONFLAGSlib+=-Os

InfoTextLib=libs (optimize size++, -Os)

else

COMMONFLAGSlib+=-O3

InfoTextLib=libs (full optimize, -O3)

endif

CFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE)

CFLAGSlib+=-D $(TypeOfMCU)

CFLAGSlib+=-D VECT_TAB_FLASH


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7136189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存