物联网ARM开发-2STM32开发环境搭建、存储器映射、启动流程分析

目录

一、Keil MDK-ARM简介及安装

1、简介

2、获取

3、安装

 二、CubeMX简介及安装

1、简介

2、获取

3、安装

4、使用

三、存储器映射

1、Cortex-M4存储器映射

2、STM32F407存储器映射

以GPIOA寄存器组为例、如何读写ODR寄存器?

3、寄存器的访问方式

第一种方式:对地址进行宏定义

 第二种方式:外设寄存器

4、启动流程分析

问题一:STM32的flash起始地址为0x08000000。CPU怎么从0x00000000处运行的?

问题二:堆、栈是什么?为什么要有堆栈?

问题三:为什么堆栈要分配到SRAM中?在FLASH中可以吗?

(1)初始化举例

(2)启动模式

(3)程序的组成

(4)程序的加载

5、启动文件


一、Keil MDK-ARM简介及安装

1、简介

Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。

MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、  MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

特点

  • 完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。
  • 行业领先的ARM C/C++编译工具链
  • 确定的Keil RTX ,小封装实时操作系统(带源码)
  • μVision5 IDE集成开发环境,调试器和仿真环境TCP/IP网络套件提供多种的协议和各种应用
  • 为带图形用户接口的嵌入式系统提供了完善的GUI库支持
  • ULINKpro可实时分析运行中的应用程序,且能记录Cortex-M指令的每一次执行
  • 大量的项目例程帮助你快速熟悉MDK-ARM强大的内置特征
  • 符合CMSIS (Cortex微控制器软件接口标准)

2、获取

官方下载: https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD

3、安装

(1)MDK,环境开发

安装MDK-523.exe  这keil5软件的安装包,不要有中文路径 
安装Keil.STM32F4_DFP.2.12.0.pack  这是STM32F4设备安装包 
运行KEIL_Lic(1).exe 破解keil (以管理员权限运行keil破解)

(2)ST_LINK烧写工具

ST_LINK 是 STM32 芯片的仿真器,这里介绍烧写工具的安装,通过这个软件操作ST_LINK 将.hex 文件烧写到芯片上。此软件用于为 M0 烧写 bootloader 文件。我们在 keil中编译好的代码可以使用它们本身进行下载。

注意:先安装utility,然后插入st-link,设备管理器会读出,再手动选择一下驱动,在安装包里面两个驱动文件。

(3)使用

 二、CubeMX简介及安装

1、简介

直观的选择STM32微控制器 
微控制器图形化配置

  • -自动处理引脚冲突
  • -动态设置确定的时钟树
  • -可以动态确定参数设置的外围和中间件模式和初始化
  • -功耗预测 

C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC可以独立使用,作为Eclipse插件使用

2、获取

STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

3、安装

安装JAVA运行环境,JavaSetup8u151.exe   
解压stm32cubemx.zip,安装SetupSTM32CubeMX-4.24.0.exe,最好不要有中文路径  
解压stm32cubef4.zip到STM32CubeMX的安装路径中


注:STM32CubeMX安装过程可参考  《STM32环境搭建.pdf》已上传资源。复制到软件安装路径,安装成功可以help manage 检查F4是不是打钩绿色

4、使用

创建一个新工程。

三、存储器映射

1、Cortex-M4存储器映射

存储器本身没有地址,给存储器分配地址的过程叫存储器映射

注:被控单元的FLASH,RAM和各类片上外设,这些功能部件共同排列在一个 4GB 的地址空间内,每个外设都有自己独有地址。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们。

2、STM32F407存储器映射

Cortex-m4处理器的4GB存储空间从架构上被分为多个区域,每个区域对应一种推荐用途。

0-FFFFFFFF相当于4GB存储空间。

参考STM32F4X7数据数据手册第4章Memory map

中文参考手册2.3章STM32F4 存储器映像和外设寄存器编址

以GPIOA寄存器组为例、如何读写ODR寄存器?

已知GPIOA的起始地址为0x40020000各寄存器的偏移地址如下:
MODER;          /*Address offset: 0x00 */
OTYPER;  /*Address offset: 0x04 */
OSPEEDR;  /*Address offset: 0x08 */
PUPDR;   /*Address offset: 0x0C */
IDR;   /*Address offset: 0x10 */
ODR;   /*Address offset: 0x14 */
BSRR;   /*Address offset: 0x18 */
LCKR;   /*Address offset: 0x1C */

 中文参考手册7.4章。

3、寄存器的访问方式

第一种方式:对地址进行宏定义

 第二种方式:外设寄存器

4、启动流程分析

问题一:STM32的flash起始地址为0x08000000。CPU怎么从0x00000000处运行的?

放大STM32F4数据手册Memory map地址印射关系图可以发现: 我们看到代码区是0x00000000-0x1FFFFFFF总共对应地址大小为512M。但是我们的stm32f407zg这款芯片的IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为1024KB,即0x80000 地址区间为0x8000000~0x08100000。IRAM1为片上数据存储器,即片上集成的SRAM存储器,对该处理器RAM大小为128KB,即0x10000 地址区间为0x20000000~0x20020000。

M4做了一个地址重映射的过程。ARM芯片的地址重映射 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如下图,CPU读取0x00000000地址上存储单元的过程。

部分引用这篇文章的内容,可以参考

问题二:堆、栈是什么?为什么要有堆栈?

栈的作用是用于局部变量,函数调用,函数形参等的开销。堆主要用来动态内存的分配。    
C语言的运行必须要堆栈的环境,因此我需要在程序的一开始设置好堆栈,以便运行C函数。

 

问题三:为什么堆栈要分配到SRAM中?在FLASH中可以吗?

Flash、EEPROM、SRAM的区别
(1) Flash存储器
Flash适用于速度要求高、容量要求大、掉电时要求数据不丢失的场合。

(2) EEPROM存储器

EEPROM存储器适用于速度不高、容量不大、掉电时要求数据不丢失的场合。
(3) SRAM存储器
SRAM相当于计算机的内存,读写速度比Flash、EEPROM快N倍,掉电后数据丢失。

Flash、EEPROM、SRAM应用场合
Flash:作为单片机运行程序存储的地方。
SRAM:存储单片机运行过程中,产生的临时数据。
EEPROM:视用户需求而定,一般用来存储系统的一些参数。

Flash、EEPROM、SRAM归属

Flash、EEPROM:属于ROM;
SARM:属于RAM。

(1)初始化举例

启动流程指复位或上电到执行到main中间,板子做的事情 

(2)启动模式

根据启动模式的不同,用户闪存、系统闪存和SRAM都可以映射到0x0的低端地址;  我们的板子可以通过拨码开关来选择启动方式

 

(3)程序的组成

(4)程序的加载

SRAM读写速度快掉电易失

RW数据比较适合在RAM中运行

NOR FLASH读快,写非常慢掉电不易失

RO Size= Code + ROData      (程序占用FLASH空间的大小)
RW Size=RW Data + ZI Data    (运行时程序占用RAM空间的大小)
ROM Size=Code + RO Data + RWData   (烧写时程序占用FLASH空间的大小)

5、启动文件

 初始化堆栈指针 SP;
初始化程序计数器指针 PC;
设置堆、栈的大小;
设置中断向量表的入口地址;
调用 SystemIni() 函数配置 STM32 的系统时钟。
设置 C库的分支入口“__main”(最终用来调用 main 函数);

Stack_Size		EQU     0x400								;定义栈的大小1K

                AREA    STACK, NOINIT, READWRITE, ALIGN=3	;AREA 是定义一个段,此处定义的是栈段,没有初始化的段,可读可写,align是说段的起始地址应该是8的倍数
Stack_Mem       SPACE   Stack_Size							;SPACE 是为栈分配空间,开辟栈空间大小为0x400
__initial_sp												;__initial_sp是个标号,这个标号指向栈的栈顶


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x200								;定义堆的大小 512byte

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3	;AREA 是定义一个段,此处定义的是堆段,没有初始化的段,可读可写,8字节对齐
__heap_base													;堆的起始地址
Heap_Mem        SPACE   Heap_Size							;开始分配堆的空间
__heap_limit												;堆的结束地址

                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY				;此处定义的数据段,数据段放的是中断向量表,只读
                EXPORT  __Vectors							;EXPORT在程序中声明一个全局的标号__Vectors,该标号可在其它的文件中引用
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
															;DCD指令以字为单位分配内存,要求4字节对齐,并要求初始化这些内存。
															;在向量表中,DCD 分配了一堆内存,并且以 ISR 的入口地址初始化它们。
												
__Vectors       DCD     __initial_sp               ; Top of Stack	存放__initial_sp,也就是堆栈栈顶的地址
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
                DCD     FLASH_IRQHandler                  ; FLASH                                           
                DCD     RCC_IRQHandler                    ; RCC                                             
                DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
                DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
                DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
                DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
                DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
                DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
                DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
                DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
                DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
                DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
                DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
                DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
                DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                            
                DCD     CAN1_TX_IRQHandler                ; CAN1 TX                                                
                DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0                                               
                DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1                                               
                DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE                                               
                DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
                DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                   
                DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
                DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
                DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
                DCD     TIM2_IRQHandler                   ; TIM2                                            
                DCD     TIM3_IRQHandler                   ; TIM3                                            
                DCD     TIM4_IRQHandler                   ; TIM4                                            
                DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
                DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
                DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
                DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
                DCD     SPI1_IRQHandler                   ; SPI1                                            
                DCD     SPI2_IRQHandler                   ; SPI2                                            
                DCD     USART1_IRQHandler                 ; USART1                                          
                DCD     USART2_IRQHandler                 ; USART2                                          
                DCD     USART3_IRQHandler                 ; USART3                                          
                DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                  
                DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
                DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
                DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12                  
                DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13                 
                DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
                DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
                DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                           
                DCD     FMC_IRQHandler                    ; FMC                                             
                DCD     SDIO_IRQHandler                   ; SDIO                                            
                DCD     TIM5_IRQHandler                   ; TIM5                                            
                DCD     SPI3_IRQHandler                   ; SPI3                                            
                DCD     UART4_IRQHandler                  ; UART4                                           
                DCD     UART5_IRQHandler                  ; UART5                                           
                DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                   
                DCD     TIM7_IRQHandler                   ; TIM7                   
                DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
                DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
                DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
                DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
                DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                                   
                DCD     ETH_IRQHandler                    ; Ethernet                                        
                DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line                      
                DCD     CAN2_TX_IRQHandler                ; CAN2 TX                                                
                DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0                                               
                DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1                                               
                DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE                                               
                DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
                DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
                DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
                DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
                DCD     USART6_IRQHandler                 ; USART6                                           
                DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
                DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
                DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                      
                DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
                DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                         
                DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
                DCD     DCMI_IRQHandler                   ; DCMI  
                DCD     0                                 ; Reserved				                              
                DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                DCD     FPU_IRQHandler                    ; FPU
                
                                         
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY				;.text  一般代表代码段,这里就是定义一段代码段

; Reset handler
Reset_Handler    PROC										;PROC 是子程序定义伪指令。这里就相当于 C语言里定义了一个函数,函数名为 Reset_Handler。
                 EXPORT  Reset_Handler             [WEAK]   ;关键字[WEAK] 表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接
        IMPORT  SystemInit									;;IMPORT则表明后面标号所代表的函数是在其它文件定义的
        IMPORT  __main

                 LDR     R0, =SystemInit					;复位子程序是系统上电后第一个执行的程序,调用 SystemInit 函数初始化系统时钟
                 BLX     R0
                 LDR     R0, =__main						;__main 是一个标准的 C 库函数,主要作用是初始化用户堆栈,并在函数的最后调用main 函数去到 C 的世界
                 BX      R0
                 ENDP

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值