当前位置:网络安全 > stm32 pack 提取内核文件(stm32 extractor)

stm32 pack 提取内核文件(stm32 extractor)

  • 发布:2023-10-05 10:56

stm32 pack 提取内核文件(stm32 extractor)

请解释一下STM32错误:

s32 类型不可用。转到文件 \CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h 并将 s32 更改为您要使用的类型。请勿使用缩写

stm32学习困惑

因为STM32设计的Flash起始地址是从0x0800 0000开始的。所有代码只能从这里开始存储。有关详细信息,请参阅 STM32 参考手册的第 54 页。

由于可以从此处存储代码,因此 MDK 中的 Flash 地址必须设置为 0x0800 0000。以下是MDK设置页面。你应该看到这个:

还有一个问题。理论上,CM3规定CPU上电后从地址0开始执行,但是这里的中断向量表编程在地址0x0800 0000处。这是因为STM32的Flash是从地址0x0800 0000开始的。只能从0x0800 0000开始执行但SMT32不能打破ARM设定的“规则”,所以它做了一个引导映射过程,这个过程与芯片上始终可以看到的BOOT0和BOOT1有关。当选择主Flash启动模式时,芯片启动Power,Flash的0x0800 0000地址被映射到0地址,不影响CM3内核的读取。因此,此时CM3可以访问0地址处的中断向量表和0x0800 0000地址处的中断向量表。代码仍然存储在地址0x0800 0000处。这是最难理解的。事实上,这是基本上所有ARM芯片都采用的启动映射方式。没有内部Flash的ARM7和ARM9通常这样做。这个过程来自STM32参考手册,解释如下:

另请注意,该中断向量表可以在程序中再次映射。控制它的是CM3已经指定的NVIC寄存器SCB->VTOR。STM32库给出的启动代码中,startup_stm32f10x_hd.s文件中,第146行读取上电后中断向量表中的复位中断位置,并执行复位中断处理代码。代码如下:

T;重置处理程序
reset_handler Proc
导出 Reset_handler [弱]
导入 __main
导入系统
LDR R0, = SystemInit
Blx R0
LDR R0, =_ 主

请注意,复位后首先执行的是SystemInit 代码。该代码位于库目录下的system_stm32f10x.c 文件中。它初始化时钟、NVIC等一系列操作。下面总结一下中断向量相关的代码:

void SystemInit(无效)

{

......

#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* 内部 SRAM 中的向量表重定位。 */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFF SET; /* 内部闪存中的向量表重定位。 */
#endif
}

可以看出,中断向量重映射是选择性编译。通常宏定义VECT_TAB_SRAM是没有定义的,所以这里执行后SCB->VTOR为FLASH_BASE,值为0x0800 0000。以后CM3取中断向量时,就会从这里取出向量,并根据SCB->VTOR的设置执行。中断向量最终变为正值。

注意,此时__main函数还没有进入。看来中断向量的重映射位置还是够早的。

stm32寄存器开发的意义

本文主要介绍如何创建一个基本的STM32工程以及工程文件中添加的文件(头文件和原始文件)的含义。本文不使用 RTE。使用的芯片是STM32F103ZET6,KEIL,使用LL相关库函数。由于文档的意思是基于我的理解,可能存在错误,欢迎讨论。 ? Core用于实现CPU-Core、Core-Peripherais和Other--Peripherais的计算和控制。这个方法可行吗?这绝对是可行的。但这样做会出现一些问题。
第一:CMSIS-CORE 包含了 CORE 和 Peripherais 的一些定义。这些定义通常是操作硬件的寄存器的结构。比如要操作某个外设,就必须知道该外设各个寄存器的位置,各个寄存器的作用,保证在设置寄存器值时不出错。这种方法叫做寄存器开发
第二:即使你不怕困难地完成了第一步,那么你就会面临第二个问题:移植。你第一步完成的程序的可移植性很低。为什么?每次切换芯片都可能导致不兼容,因为即使使用相同的框架,每个制造商也可以根据自己的需求改变外设的数量和位置。这可能会导致你在应用层设置的寄存器地址和结构体不兼容。即使是同一厂商、同一架构,也会有不同类型的芯片,更不用说更换厂商,甚至改变芯片架构了。
为了解决寄存器开发的缺点,Silicon Vendor(制造商)提供了一套叫做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,核心-外围,其他-外围。这种方法称为库函数开发。
3。库函数开发的基本工程文件(不含系统)
根据上面的描述,我们将文件分为四大部分(不含系统):CMSIS-CORE、STARTUP、HAL、应用代码
CMSIS-CORE 将又细分为三部分:Peripherais-CORE、Peripherais-Device、编译器:
Peripherais-CORE:
具体文件:
1.cmsis_compiler.h(编译器)
2.cmsis_armcc.h(编译器)
3.cmsis_version.h(编译器)
4.core_cm3.h(外设-核心)
5.stm32f1xx.h(外设-设备)
6.stm32f103xe。 h(外围设备- 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. 声明 De bug_register
6. 声明 MPU_register(可选)
5.stm32f1xx.h
该文件使用厂家提供的头文件。其主要功能为:
1.根据Keil的宏定义添加F1系列芯片外设声明文件
6.stm32f103xe.h
该文件使用厂家的头文件。其主要功能为:
1.声明stm32f103系列芯片本体所有外设的中断、位置、结构体,以及寄存器操作的相关宏定义
启动:
1.startup_stm32f103xe.s
2.system_stm32f1xx.c
3.system_stm32f1xx.h
1.startup_stm32f103xe.s
这个文件是启动文件,它的主要功能有:
1 . 初始化堆栈
2. 异常和中断的定义,以及部分异常的实现
3. 调用SystemInit函数初始化时钟(系统)
4. 调用main函数进入应用代码
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
这两个文件是 GPIO 外设文件的 LL 库。主要功能:
1. GPIO 外设的数量、位置、结构体和基本操作的声明和定义
3. 其他:LL 库线有很多 C 文件和 H 文件。我们可以根据自己的需要添加它们。我们不一定需要添加它们。添加整个 LL 库。例如:ADC、USART等。本项目只是点亮LED,所以不需要其他文件。 LL库的头文件和源文件包括以下内容(STM32F1系列)
Application Code:应用层代码,主要是我们的业务逻辑。本项目只有main.c文件,用于点亮LED
main.c主要代码如下:
整体文件架构图:
PS:以上为本地项目的树形结构。这种结构只是个人风格。大家可以根据自己的风格来创建自己的结构
3.如何在KEIL中搭建这个工程并编译烧录
1.KEIL的安装,网上有很多优秀的文章,可以通过自己参考,无需重复
2. 创建基础工程(选择芯片STMF103ZE)
3. 建立工程文件结构,添加源文件。参考其他文章。就我个人而言,我喜欢保持结构与本地目录一致。添加文件后的Keil工程结构如图:
4.将头文件添加到编译路径
魔棒----》c/c++----- -》包含路径
5.添加全局宏定义
STM32F103xE和USE_FULL_LL_DRIVER
STM32F103xE:用于告诉stm32f1xx文件,最后添加f1系列具体型号的头文件
USE_FULL_LL_DRIVER:用于开始编译法学硕士图书馆。
6. 编写应用程序代码(main.c)文件
7. 编译
8. 烧录(需要连接电脑、模拟器、芯片) 具体您使用的模拟器请参考其他设置第
9. LED指示灯正常亮起。
4.总结
至此,一个使用LL库点亮LED的最基本的项目就已经搭建完成了。本文仅介绍stm32工程文件的架构思路。在实际应用中,可以使用不同的框架和类型的芯片。不要复制它们。您必须知道如何根据您的实际情况使用合适的文件。本文仅供参考
打开CSDN APP查看更多技术内容
STM32三种开发方式:寄存器、标准库函数、HAL库_Sun Vulcan的美丽生活博客...
STM32微控制器是由芯片内嵌处理器核心和外围电路,相当于PC的CPU、内存、主板、硬盘。所有这些都集成在一个不到一厘米见方的芯片中,并通过引脚与外围电路集成。 ,通过不同的协议连接不同的设备,比如USART、SPI、IIC、CAN,所有这些...
继续访问
STM32笔记(2)寄存器和固件库开发简介_CYRIL0124博客 - CSDN博客。 ..
后面我们还可以定义一个函数来操作需要操作的寄存器。这时我们只需要填写参数就可以使用该函数来操作和配置各种寄存器或者各种外设。函数,这就是固件库实现的基本思想。这是固件库操作GPIO外设的函数。大家可以简单参考一下...
继续访问
stm32入门周2 IO口实验了解库函数开发和寄存器开发的区别
本文内容基于https://www .www.sychzs.cn/video/BV1Lx411Z7Qa P11 GPIO 工作模式: 输入模式 1:浮空输入 输入模式 2:输入上拉模式 输入模式 3:输入下拉模式 由于浮空输入模式下电压的不确定性,很容易被误读。当检测高电平时,一般采用输入下拉模式,当检测低电平时,一般采用输入上拉模式。输入模式 4:模拟模式 输出模式 1:开漏输出 当输出控制电路输出 1 时,N-MOS 开路,实际输出由外部上拉和下拉决定。当输出0时,N-MOS关闭,实际输出为0。实际输出可以通过输入数据继续访问

Stm32寄存器和库函数概述(摘自固件库手册).doc
本手册是STM32各标准库对应寄存器的手册。可用于STM32库 为功能开发提供参考
STM32寄存器版和库函数版.zip
STM32寄存器版和库函数版,配合stm32日常更新2号使用效果更好,本文介绍了STM32寄存器版本和库函数版本的创建
Stm32寄存器和库函数概述(摘自固件库用户手册).zip
在网上看到了一份关于STM32单片机的开发文档,整理了一下STM32单片机常用寄存器的名称和功能,以及与每个功能相关的库函数。函数名称和函数功能。可以作为开发时的参考。
STM32学习笔记(2):新建一个STM32F103项目
1。前言我们已经介绍了如何安装keil5.29和破解keil5.29。让我们开始一个新的STM32F103项目。 2. 项目准备 在创建项目之前,您需要做好以下准备工作。 1)STM32F103芯片包 2)准备STM32固件库 3)创建工程文件和目录 以下是以上三个准备步骤: 2.1:下载芯片包 以下是芯片包的官方下载地址。链接:https://www.sychzs.cn/dd2/Pack/ 下载芯片包后,双击打开即可安装。这个安装的路径是默认的,就是你的keil安装路径下的路径。文件夹,忽略这个,像傻子一样点击下一步,一直点击就行,然后等待安装。可以下载对应的
STM32学习笔记1:KEIL5配置stm32开发环境,以及新建工程的步骤。
1.下载并安装keil5。 (这里就不介绍了,网上有很多资料)2、下载并安装stm32包。 –>包下载链接请点击此处。正常界面如下。使用浏览器的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还是置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.sychzs.cn/ Article-451-1.html 1、如何根据#include   1将源文件与头文件关联起来,将系统自带的头文件用尖括号括起来,以便编译器在系统中查找文件目录。   2。用户定义的文件用双引号引起来。编译器会先在用户目录下搜索,然后到C++安装目录下(比如在VC中你可以指定并修改库文件搜索路径,在Unix和Linux中你可以
继续访问
)通过环境变量区分STM32库函数和寄存器的区别
#STM32库函数和寄存器# 1.什么是固件库?它和寄存器有什么关系?固件库是函数的集合,直接和寄存器交互底层,并提供接口(API)供用户调用顶层函数 2、最佳使用寄存器:单独控制IO口的状态,对寄存器(如51)进行位操作 进行位操作调试时关于寄存器(需要了解哪些寄存器相关并了解流程,调试时阅读寄存器手册) 库函数:寄存器太多(如STM32)调用库函数...
继续访问
Stm32 初学者该不该学寄存器?库功能好不好?
作者:jiwangbujiu 链接:https://www.sychzs.cn/question/30409588/answer/244613385 来源:知乎版权归作者所有。商业转载请联系作者授权。非商业转载请注明出处。我个人认为,在回答这个问题之前,首先要问自己清楚,学习stm32的目的是什么,或者更深入一点,学习单片机?你现在处于什么状态?您是学生还是已经工作了?你的专...
继续访问
STM32F103单片机下AT24CXX系列芯片的读写程序
本程序摘自正点原子开发板,应用于STM32F103单片机。适用于AT24C01、AT24C02、AT24C04、AT24C08、AT24C16、AT24C32、AT24C64、AT24C128、AT24C256、AT24C512系列I2C存储芯片。 1. sys.h #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" ////////////////////////////////// / ///////////////////////////////.
继续访问
STM32开发方法及基本介绍
STM32 开发有三种方式 1、寄存器版本 2、库函数版本 3、HAL 库版本 1、库函数开发与寄存器开发的关系。很多人已经从学习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_H
继续访问
stm32寄存器开发和库开发
stm32

以上就是小编对用stm32 pack提取内核文件(stm32提取程序)问题及相关问题的解答。我希望它对你有用!

相关文章