stm32加入外部代码的流程

stm32加入外部代码的流程,第1张

直接复制粘贴第一个新建的工程,然后改名

在这里插入图片描述

2.在工程里新建一个WokePace文件用来放其他模块文件

在这里插入图片描述

3.去别的工程直接把想要的模块复制到该文件夹下,每个模块都有一个main.c和main.h,也可以自己写,模块化代码有助于代码的简洁和可移植性。

在这里插入图片描述

4.打开工程,按如下提示添加头文件的路径

在这里插入图片描述

5.按如下提示穗陪缓将.C文件添加进来。

在这里插入图片描述

6.打开模块的.C文件,将下面两句复制粘贴到main.c中

在这里插入图片描述

7.放在如下位置,在while循环中编写代码,编译即可。

在这里插入图片描述

8.编译无错后,要进行烧录代码。按如下提示选择下载器,如下用了ST-Link下载器,选择完后点击Setting——

在这里插入图片乱族描述猜模

9.在Unit显示如下“ST-LINK/V2”,并将port选为SW模式。

在这里插入图片描述

10.打开Utilities,按如下 *** 作执行。最后点击Sttings

在这里插入图片描述

11. 点击Sttings,出现以下画面,将Reset and Run勾选上,每次烧录时会重启复位。设置完成后,就可以进行烧录代码。

在这里插入图片描述

报错如下:

解决方法:

第一步:找到搭核你文颤拿件夹里的“user”

第二步:找到user里的stm32f10x_conf.h

第知洞掘三步:把//include"stm32f10x_tim.h"前边的"//"给去掉

本文主要是简述如何创建一个STM32的基础工程,以及在工程文件中所添加文件(头文件以及原文件)的意义。本文不使用RTE,使用的芯片为STM32F103ZET6,KEIL,使用LL相关库函数。因为文件的含义是根据本人的理解,可能存在错误的地方,欢迎讨论。

二、STM32文件架构

我们先来看下ARM的文件架构图

从图中我们不难看出,其实最简单的路径就是直接从Application Code(应用层代码)调用CMSIS-Core来实现对CPU-Core、Core-Peripherais、Other--Peripherais来运算和控制。这种方法可不可行呢,肯定是可行的。但是这样会存在一些问题。

第一:CMSIS-CORE中是对CORE和Peripherais的一些定义。这些定义一般是 *** 作硬件的寄存器的结构体。例如你想要 *** 作某一个外设,你就必须知道这个外设的每个寄存器的位置在哪里,以及每个寄存器的作用,并且确保你不会在设置寄存器的值的时候出错。这种方式称为寄存器开发

第二:即使不怕困难完成了第一步,那么接下来你就会面临第二个问题:移植。你通过第一步完成的程序的移植性是很低的。为什么呢?你每切换一款芯片都会可能导致不兼容,因为即使采用的同一个框架,每个厂家都可以根据自己的需求去改变外设的数量以及位置。这就可能导致你在应用层设置的寄存器地址和结构是不通用,甚至同一个厂家同一个架构下也会有不同型号的芯片,那就更加不用提更换厂家甚至是更换芯片架构的情况了。

为了解决寄存器开发的不足,Silicon Vendor(生产制造商)提供了一套叫做HAL(硬件抽象层)的东西。什么是HAL?按照个人理解就是把 *** 作硬件也就是 *** 作寄存器的动作有机的封装起来,让我们不再需要去关注怎么 *** 作寄存器也就是硬件,而是使用了一些有意义的宏或者函数来代替,方便我们的编写程序。这个解决了上面的问题一。对于问题二是怎么解决的呢,刚才也说到HAl使用了一些有意义的宏或者函数来代替,这些宏纳谨袭或者函数在这个厂家对每一个同架构的芯片都是一样。例如在STM32F1的串口初始化的LL库函数为LL_USART_Init(USART1),那么即使你切换到STM32F3也是在应用层调用LL_USART_Init(USART1),只洞兄需要把STM32的HAL文件替换为STM32F3的HAL文件就行,如果他们USART1外设的寄存器位置不一样,那么在HAL文件的定义中就已经修改好了,应用层的代码无需修改。这样就大大的减少了移植的难度。

现在我们的路径变为了Application Code(应用层代码)------>DEVICE HAL -------->CMSIS-Core -------->CPU-Core、Core-Peripherais、Other--Peripherais。这种方式我们称为库函数开发。

三、库函数开发的基础工程文件(不带系统)

根据上面的描述,我们把文件分成四个大的部分(不带系统):CMSIS-CORE,STARTUP,HAL,Application Code

其中CMSIS-CORE也会细分三个部分:Peripherais-CORE,Peripherais-Device,compiler:

Peripherais-CORE:

具体文件:

1.cmsis_compiler.h(compiler)晌携

2.cmsis_armcc.h (compiler)

3.cmsis_version.h (compiler)

4.core_cm3.h(Peripherais-CORE)

5.stm32f1xx.h(Peripherais-Device)

6.stm32f103xe.h(Peripherais-Device)

1.cmsis_compiler.h

该文件是一个编译声明文件,主要作用:

1.声明使用哪个编译器编译。本文采用的Keil的环境所以使用的是armcc的编译方式

2.cmsis_armcc.h

该文件是一个编译器头文件,主要作用:

1.申明编译器的部分特殊寄存器的 *** 作

3.cmsis_version.h

该文件是一个编译器版本文件,主要作用:

1.申明编译器的版本

4.core_cm3.h

该文件的是一个申明M3架构的内核外设的文件,主要作用:

1.申明core_register

2.申明NVIC_register

3.申明SCB_register

4.申明Systick_register

5.申明Debug_register

6.申明MPU_register(可选)

5.stm32f1xx.h

该文件使用制造商提供的头文件,主要作用是:

1.根据Keil的宏定义去添加对于F1系列芯片的外设申明文件

6.stm32f103xe.h

该文件的使用制造商的头文件,主要作用是:

1.申明stm32f103系列芯片的所有外部外设的中断、位置,结构体,以及寄存器 *** 作的相关宏定义

Startup:

1.startup_stm32f103xe.s

2.system_stm32f1xx.c

3.system_stm32f1xx.h

1.startup_stm32f103xe.s

该文件是一个启动文件,主要的作用有:

1.初始化堆栈

2.异常以及中断的定义,以及部分异常的实现

3.调用SystemInit函数初始化时钟(system)

4.调动main函数进入application code

2.system_stm32f1xx.c

该文件主要是系统时钟初始换函数实现。主要作用:

1.初始化时钟

3.system_stm32f1xx.h

该文件主要是系统时钟初始换函数申明。主要作用:

1.申明时钟初始化函数

HAL:本文采用的ST的LL库,下面采用的也是LL库的示例。目前示例的工程的点亮一个LED

1. stm32f1xx_ll_bus.h

该文件主要是申明对外设总线时钟 *** 作宏定义。主要作用:

1.定义总线时钟相关的 *** 作

2.stm32f1xx_ll_gpio.c 和stm32f1xx_ll_gpio.c

这两个文件是LL库对GPIO外设文件,主要作用:

1.对GPIO外设数量、位置、结构、基本 *** 作的申明以及定义

3.其他:LL库线的C文件以及H文件还有很多,我们可以根据我们自己的需要进行添加,不一定需要把整个LL库都添加进去。例如:ADC,USART等等等等。该工程只是点亮LED,所以不需要其他文件。LL库的头文件以及源文件有以下这些(STM32F1系列)

Application Code:应用层代码,主要是我们业务逻辑。该工程只有main.c文件,用于点亮LED

main.c的主要代码如下:

整体文件架构图:

PS:以上就是该项目的本地树结构。该结构只是个人的风格,每个人可以根据自己的风格创建自己的结构

三、如何在KEIL中建立该工程并编译烧录

1、KEIL安装,网上有很多优秀的文章,自行参考,不在赘述

2、建立基本工程(选择芯片STMF103ZE)

3、建立工程文件架构、添加源文件。参考其他文章。个人喜欢和本地目录的架构保持一致,添加好文件后的Keil工程架构如图:

4.添加头文件到编译路径

魔术棒----》c/c++------》Include Paths

5.添加全局的宏定义

STM32F103xE和USE_FULL_LL_DRIVER

STM32F103xE:用于告诉stm32f1xx文件,最后添加f1系列具体哪个型号的头文件进来

USE_FULL_LL_DRIVER:用来启动LL库的编译。

6.编写application code(main.c)文件

7.编译

8.烧录(需要连接电脑,模拟器,芯片)具体你使用的是哪个模拟器相关设置请参考其他文章

9.LED指示灯正常亮起。

四、总结

至此,一个最最最基本的用LL库去点亮LED的工程已经建好了。本文只是在描述stm32工程文件的架构思路,在实际应用中你们可以使用的不同框架以及型号的芯片,不要照搬,要懂得根据自己的实际情况是使用合适的文件。本文仅作为参考

打开CSDN APP,看更多技术内容

STM32 三种开发方式:寄存器、标准库函数、HAL库_太阳火神的美丽人生的博...

STM32 单片机是由芯片内嵌的处理器内核和外设电路构成,相当于PC电脑的CPU、内存、主板、硬盘,所有这些都集成在一块不到一厘米见方的芯片中,通过引脚与外围电路集成,连接不同设备,以不同协议进行通过,如 USART、SPI、IIC、CAN,所有这些...

继续访问

STM32笔记(二)初识寄存器与固件库开发的简介_CYRIL0124的博客-CSDN博 ...

后面我们还可以再定义一个函数用于 *** 作所需要 *** 作的寄存器,这时候只需要填入参数就可以实现运用函数来 *** 作配置各种寄存器或者各种外设的功能了,这也就是固件库实现的基本思想。 这是固件库 *** 作GPIO外设的一个函数,可以简单参考一下 ...

继续访问

stm32入门 第二周 IO口实验,了解库函数开发和寄存器开发的区别

本文内容基于https://www.bilibili.com/video/BV1Lx411Z7Qa P11 GPIO工作模式: 输入模式1:浮空输入 输入模式2:输入上拉模式 输入模式3:输入下拉模式 由于浮空输入模式的电压不确定,容易误读,检测高电平时一般用输入下拉模式,检测低电平时一般用输入上拉模式。 输入模式4:模拟模式 输出模式1:开漏输出 输出控制电路输出1时,N-MOS断开,实际输出由外部上拉下拉决定,输出0时,N-MOS闭合,实际输出0,实际输出可以由输入数据..

继续访问

Stm32寄存器与库函数概览(摘自固件库使用手册).doc

本手册内容为STM32各标准库 *** 作相应寄存器的手册,可为STM32库函数开发提供参考

STM32寄存器版和库函数版.zip

STM32寄存器版和库函数版,配合stm32日更2nd使用更佳,本文讲述了STM32寄存器版和库函数版的创建

Stm32寄存器与库函数概览(摘自固件库使用手册).zip

在网上看到一份关于STM32单片机开发资料,其中整理了STM32单片机常用寄存器的名称和功能,还有各个功能相关库函数的函数名和函数功能。可做为开发时的参考。

STM32学习笔记(二):新建STM32F103工程

1、前言 前面已经介绍了怎么安装keil5.29和破解keil5.29,下面进行STM32F103的新建工程。 2、工程的准备 在进行创建工程前,需要做好如下几个前提。 1)STM32F103的芯片包 2)准备好STM32的固件库 3)创建好工程文件和目录 以下为上面三个准备的步骤: 2.1:芯片包的下载 下面这个是芯片包的官方下载地址。 链接:https://www.keil.com/dd2/Pack/ 下载完芯片包之后直接双击打开进行安装就行了,这个安装的路劲是默认的,就是你的keil安装的路劲下的某个文件夹,这个不用理会,直接傻瓜式点击下一步,一直点击就行了,然后等待安装 大家可以下载相

STM32学习笔记1:KEIL5配置stm32开发环境,以及新建工程的步骤。

一、下载安装keil5.(这里不多做介绍,网上有很多资料了) 二、下载安装stm32的pack包。 –>pack包下载链接点这里 正常界面如下,使用浏览器的ctrl+F功能快速搜索到对应的系列进行下载。 如果网页打不开,或者找不到下载包的地方,解决方法请点击这里。 下载下来的包是一个zip文件。这个包应该有两种使用方法。我目前尝试的是第一种,后续再补第二种。 第一种: 把后缀名改zip改为pack,然后双击打开安装。这样是直接集成到keil软件里面了。这种方法快可以快速上手,配置简单。但是一旦更

继续访问

STM32官方标准固件库开发与寄存器开发的区别

一句话概括关系:固件库就是函数的集合,固件库函数的作用就是:向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于STM32这种级别的MCU,数百个寄存器记起来何谈容易,于是推出了官方固件库,固件库将这些寄存器底层 *** 作都封装起来,提供一套API供开发者使用。大多数情况下,你不需要知道 *** 作的是哪个寄存器,你只需要知道调用哪些函数即可。 对比一下:入下面只需要知道GPIO_SetBi...

继续访问

最新发布 STM32使用寄存器开发底层驱动学习(USART+DMA)

代码简洁明了,当然需要我们注释好,不然比标准库更难看懂。方便快捷,只需要一本《手册》就可以查看所有的寄存器,不需要像标准库那样记、找每个函数、每个参数的作用。

继续访问

STM32之GPIO配置(寄存器/库函数)

GPIO初始化结构体 GPIO初始化 先声明GPIO初始化的结构体;然后打开GPIO所挂载的总线的时钟;再对结构体成员进行配置,包括GPIO的引脚,模式,速度;最后对GPIO的结构体进行初始化并选定指定的GPIO组。 GPIO_Mode相关内容 模拟输入、浮空输入、下拉输入、上拉输入、通用开漏输出、通用推挽输出、复用开漏输出、复用推挽输出。 GPIO相关函数 ①GPIO初始化函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_In

继续访问

库函数开发与寄存器开发

在以前 8 位机时代的程序开发中,一般直接配置芯片的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 8位机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。 对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方...

继续访问

cmsis_iar.h

发现了"cmsis_iar.h",需要的人可以下载来看看!

C语言中头文件和源文件的注意事项

C语言中头文件和源文件的注意事项 文章目录C语言中头文件和源文件的注意事项0.前言1.实现步骤1.1 拆分前1.2 拆分后2.总结2.1头文件内容2.2 源文件(.c)内容2.3 函数声明和定义 0.前言 因为C语言编程或者C++语言编程,经常要添加头文件,不像Python中直接引入第三库就可以(import),但是嵌入式编程中C还是主流,Python目前这方面的应用还是比较少的,故如果完成一个大...

继续访问

C++中头文件与源文件的区别

本文转自:http://www.sytarena.com/article-451-1.html 一、源文件如何根据#include来关联头文件 1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。 2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来

继续访问

STM32库函数与寄存器的区别

#STM32库函数与寄存器# 1.固件库是什么?与寄存器有什么关系? 固件库就是函数的集合,向下与寄存器直接打交道,向上提供用户调用函数的接口(API) 2.最佳使用情况 寄存器:单独对IO口状态控制,对寄存器进行位 *** 作(如51) 调试debug时对寄存器进行位 *** 作(需要理解与什么寄存器有关并理解过程,调试时翻阅寄存器手册) 库函数:寄存器数量过多(如STM32)调用库函数 ...

继续访问

stm32初学者是应该学寄存器好还是学库函数好?

作者:jiwangbujiu链接:https://www.zhihu.com/question/30409588/answer/244613385来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。我个人认为,在回答这个问题之前,你得先问清楚自己,我学习stm32、或者再往更深的地方走,我学习单片机,究竟是为了什么?你现在是处于什么状态?你是学生还是已经参加工作了?你的专...

继续访问

AT24CXX系列芯片在STM32F103单片机下的读写程序

本程序取自正点原子开发板,应用于STM32F103单片机,适用AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256,AT24C512系列I2C存储芯片。 一、sys.h #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //////////////////////////////////////////////////////////////.

继续访问

STM32开发方式及基本介绍

STM32的开发有三种方式 1.寄存器版本 2.库函数版本 3.HAL库版本 一、库函数开发与寄存器开发的关系 很多人都是从学51单片机转而想进一步学习STM32,他们习惯了51单片机的寄存器开发方式,ST官方库摆在面前会不知道从何下手。其实简单来说,固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口。 举一个例子来解释 STM32 固件库到底是什么,和寄存器开发有什么关系。 在51的开发中我们常常是直接 *** 作寄存器,比如要控制某些 IO 口的状态,我们直接

继续访问

热门推荐 STM32库函数和寄存器的区别

库函数版和寄存器版的系统时钟设置的区别: **1.**库函数的目的是让用户应用的,而寄存器更加原始 库函数的系统时钟是默认设置的,且放在启动文件里。而寄存器版的系统时钟是Stm32_Clock_Init(336,8,2,7). **2.**库函数的快捷的,但不是每个芯片都有的;寄存器是复杂的,但是每个芯片厂商都有提供系统的寄存器设置信息。 分别打开库函数和寄存器版的I/O口设置: 库函数: RC...

继续访问

CMSIS玩家的“阴间成就”指南

【说在前面的话】认真说起来,从事嵌入式系统开发职业的“玩家”们基本都听说过CMSIS吧?虽然不清楚它在系统中具体“有什么卵用”,但或多或少都接受过“CMSIS的毒打”——不知不觉间,达成了...

继续访问

C 语言 *** 作寄存器开发

在使用C语言 *** 作寄存器前,仍需要先分析《开发板原理图》和《参考手册》,从而得知需要 *** 作哪些外设寄存器,假设读者已经了解需要 *** 作哪些外设寄存器。 本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语言 *** 作寄存器开发\”。 使用C语言之前,需要先设置栈,如代码段 6.3.1 所示,在上电复位后立即设置栈,随后跳入main函数执行。 代码段 6.3.1 设置栈(startup_stm32f10x_hd.s) Reset handler Reset_H

继续访问

stm32寄存器开发与库开发

stm32


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

原文地址: http://outofmemory.cn/bake/11989395.html

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

发表评论

登录后才能评论

评论列表(0条)

保存