Advertisement

STM32 Keil MDK启动代码的分析。

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
查看文章 STM32 keil mdk启动代码发分析_转2010年01月29日 星期五 13:50;// Stack Configuration ;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ;// Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0__initial_sp ;//标号,代表堆栈顶部地址,后面有用 ;// Heap Configuration ;// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ;// Heap_Size EQU 0x00000020 ;//定义堆空间大小 AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段,8字节对齐 __heap_base Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空间 __heap_limit ;//标号,代表堆末尾地址,后面有用 PRESERVE8 ;//指示编译器8字节对齐 THUMB ;//指示编译器为THUMB指令 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY ;//定义只读数据段,其实放在CODE区,位于0地址 EXTERN NMIException EXTERN HardFaultException EXTERN MemManageException EXTERN BusFaultException EXTERN UsageFaultException EXTERN SVCHandler EXTERN DebugMonitor EXTERN PendSVC EXTERN SysTickHandler ;//声明这些符号在外部定义,同C ;//在××it.c中实现这些函数 ,中断就能自动调用了 EXPORT __Vectors EXPORT __initial_sp ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用;IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义, ;但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中__Vectors DCD __initial_sp ; Top of Stack //Cotex-M 要求此处为堆栈顶部地址 DCD Reset_Handler ; Reset Handler DCD NMIException ; NMI Handler DCD HardFaultException ; Hard Fault Handler DCD MemManageException ; MPU Fault Handler DCD BusFaultException ; Bus Fault Handler DCD UsageFaultException ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVCHandler ; SVCall Handler DCD DebugMonitor ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSVC ; PendSV Handler DCD SysTickHandler ; SysTick Handler //一大堆的异常处理函数地址 ; External Interrupts EXTERN WWDG_IRQHandler EXTERN PVD_IRQHandler EXTERN TAMPER_IRQHandler EXTERN RTC_IRQHandler EXTERN FLASH_IRQHandler EXTERN RCC_IRQHandler EXTERN EXTI0_IRQHandler EXTERN EXTI1_IRQHandler EXTERN EXTI2_IRQHandler EXTERN EXTI3_IRQHandler EXTERN EXTI4_IRQHandler EXTERN DMAChannel1_IRQHandler EXTERN DMAChannel2_IRQHandler EXTERN DMAChannel3_IRQHandler EXTERN DMAChannel4_IRQHandler EXTERN DMAChannel5_IRQHandler EXTERN DMAChannel6_IRQHandler EXTERN DMAChannel7_IRQHandler EXTERN ADC_IRQHandler EXTERN USB_HP_CAN_TX_IRQHandler EXTERN USB_LP_CAN_RX0_IRQHandler EXTERN CAN_RX1_IRQHandler EXTERN CAN_SCE_IRQHandler EXTERN EXTI9_5_IRQHandler EXTERN TIM1_BRK_IRQHandler EXTERN TIM1_UP_IRQHandler EXTERN TIM1_TRG_COM_IRQHandler EXTERN TIM1_CC_IRQHandler EXTERN TIM2_IRQHandler EXTERN TIM3_IRQHandler EXTERN TIM4_IRQHandler EXTERN I2C1_EV_IRQHandler EXTERN I2C1_ER_IRQHandler EXTERN I2C2_EV_IRQHandler EXTERN I2C2_ER_IRQHandler EXTERN SPI1_IRQHandler EXTERN SPI2_IRQHandler EXTERN USART1_IRQHandler EXTERN USART2_IRQHandler EXTERN USART3_IRQHandler EXTERN EXTI15_10_IRQHandler EXTERN RTCAlarm_IRQHandler EXTERN USBWakeUp_IRQHandler ;//同上, DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMAChannel1_IRQHandler ; DMA Channel 1 DCD DMAChannel2_IRQHandler ; DMA Channel 2 DCD DMAChannel3_IRQHandler ; DMA Channel 3 DCD DMAChannel4_IRQHandler ; DMA Channel 4 DCD DMAChannel5_IRQHandler ; DMA Channel 5 DCD DMAChannel6_IRQHandler ; DMA Channel 6 DCD DMAChannel7_IRQHandler ; DMA Channel 7 DCD ADC_IRQHandler ; ADC DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0 DCD CAN_RX1_IRQHandler ; CAN RX1 DCD CAN_SCE_IRQHandler ; CAN SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation 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 ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend ;//同上 AREA |.text|, CODE, READONLY ;//定义代码段 ; Reset Handler Reset_Handler PROC ;过程的开始 ;//Rset_Handler的实现 利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰 EXPORT Reset_Handler [WEAK] ;//在外部没有定义该符号时导出该符号,见HELP中[WEAK] IMPORT __main ;//导入符号,__main为 运行时库提供的函数;完成堆栈,堆的初始话 LDR R0, =__main ;//等工作,会调用下面定义的__user_initial_stackheap; BX R0 ;//跳到__main,进入C的世界 ENDP ;过程的结束 ALIGN ; User Initial Stack & Heap IF :DEF:__MICROLIB ;//如果使用micro lib,micro lib 描述见armlib.chm EXPORT __heap_base EXPORT __heap_limit ;//只导出几个定义 ELSE ;//如果使用默认C运行时库 IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap ;//则进行堆栈和堆的赋值,在__main函数执行过程中调用。 LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END ;//OK ,完了 http://blog..net/chehlcy/archive/2010/01/09/5164472.aspxhttp://files.ourdev.cn/bbs_upload134190/files_11/ourdev_495775.txt======================================================================Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__main BX R0 ENDP 这段代码什么意思。 有2个地方不理解 一:PROC ENDP 二: [WEAK] 什么意思 -------------------------------------------------------------------------------一:PROC为子程序开始,ENDP为子程序结束 二:[weak]的意思就是弱。 怎么弱呢?如果你在其他地方写一个同名函数,比如Reset_handler, 你写的这个函数就可以取代它这个函数了。 语法格式: EXPORT 标号 {[WEAK]} EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。 使用示例: AREA Init , CODE , READONLY EXPORT Stest ;声明一个可全局引用的标号Stest…… END

全部评论 (0)

还没有任何评论哟~
客服
客服
  • STM32 Keil MDK
    优质
    本文章深入解析了基于STM32微控制器使用Keil MDK开发环境时的启动代码工作原理和实现细节,旨在帮助开发者更好地理解和利用嵌入式系统编程中的关键步骤。 这段代码是用于ARM处理器的汇编语言程序的一部分,主要用于实现复位处理函数(Reset_Handler)。下面是对你提到的两个概念的具体解释: 一:PROC 和 ENDP 是 ARM 汇编中定义子过程或子例程的关键字。 - `PROC` 用来标记一个新过程或者子程序开始; - `ENDP` 标记该过程结束。 二:[WEAK] 关键词表示在链接阶段如果存在同名的其他函数,那么这个特定声明为弱类型的函数会被忽略。也就是说,在定义 Reset_Handler 这个标号时加上 [weak] 选项意味着如果有别的文件中同样定义了 Reset_Handler,则编译器会使用那个版本而不是这里的。 具体代码解释如下: ```assembly Reset_Handler PROC ; 定义一个名为 Reset_Handler 的过程开始 EXPORT Reset_Handler [WEAK]; 导出该标号,同时声明它为弱类型(即可以被其他定义覆盖) IMPORT __main; 从外部导入 __main 函数地址 LDR R0, =__main ; 将 _main 地址加载到寄存器R0 BX R0 ; 跳转至R0所指向的地址,开始执行C程序入口函数 ENDP ; 结束过程定义 ``` 这段代码的主要功能是设置系统复位时调用 C 语言运行库中的初始化函数(__main),从而启动应用程序。
  • STM32系列 Keil MDK
    优质
    STM32系列Keil MDK包是一款专为基于ARM Cortex-M内核的STM32微控制器开发的应用软件套装,提供高效的代码编写、编译及调试环境。 由于上传大小限制,包提供通过百度云下载。以下是需要的文件:Keil.STM32F0xx_DFP.2.0.0.pack、Keil.STM32F1xx_DFP.2.2.0.pack、Keil.STM32F4xx_DFP.2.13.0.pack和Keil.STM32F7xx_DFP.2.10.0.pack。
  • STM32 Keil MDK安装包
    优质
    STM32 Keil MDK安装包是一款专为基于ARM Cortex-M系列内核的STM32微控制器开发的应用程序开发环境,支持C/C++编程语言,集成了编译器、调试器和仿真工具,帮助开发者高效地进行嵌入式系统应用设计与测试。 安装 Keil MDK 后需要下载并安装对应硬件的 pack 包才能使用,但直接通过 MDK 下载会很慢。请到官网或其他可靠来源下载所需的 pack 文件,然后在 MDK 安装目录下找到 PackInstaller.exe 并运行它来导入这些包。常用的 pack 包包括: - STM32F0xx_DFP.2.1.0 - STM32F1xx_DFP.2.3.0 - STM32F2xx_DFP.2.9.0 - STM32F3xx_DFP.2.1.0 - STM32F4xx_DFP.2.14.0 - STM32F7xx_DFP.2.13.0 - STM32W1xx_DFP.1.0.0 - ARM.CMSIS.5.7.0 - CMSIS-Driver.2.6.1 请确保下载的 pack 文件来源可靠。
  • STM32 SRAMKeil配置
    优质
    本文章详细介绍如何在Keil开发环境中为基于STM32系列微控制器设置SRAM作为启动内存的步骤和注意事项。适合嵌入式开发者参考学习。 为了使STM32微控制器从SRAM启动而不是默认的Flash存储器启动,在硬件层面需要将BOOT0引脚设置为高电平(即1),同时保持BOOT1同样为高电平,这样设备会在上电或复位时直接进入SRAM模式并执行其中的第一条指令。 在软件配置方面,如果使用的是STMicroelectronics提供的标准库函数版本3.5及以上,则可以在`system_stm32f10x.c`文件中进行相应的设置。在这个文件里定义了宏`#define VECT_TAB_SRAM 2.x`,这指示中断向量表的位置被设定在SRAM区域。 对于动态切换中断向量表的地址位置,可以使用STM32微控制器内置的Nested Vectored Interrupt Controller (NVIC) 提供的功能。以下两个函数分别用于将IVT设置为Flash或SRAM起始地址: 1. `NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);` 将中断向量表的位置设在Flash存储器的开始位置,即0x00000000。这是默认配置,在从Flash启动时使用。 2. `NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x2000000);` 将中断向量表的位置设在SRAM起始地址处,即地址为内存映射的开始位置(通常是0x2000000)。当从SRAM启动时需要调用此函数。 使用Keil MDK IDE配置STM32工程以支持SRAM启动的过程如下: 1. 打开项目属性对话框。 2. 在Target选项卡中,找到“Startup”类别,并将“Vector Location”的设置更改为Internal RAM。这指示编译器生成的中断向量表应位于SRAM区域而非Flash存储区。 3. 确保Code Location被正确配置为Internal FLASH, 以保证程序代码依然存放在Flash中,因为启动时需要加载到SRAM中的只是初始化数据和运行所需的少量代码片段而已。 完成上述设置后,Keil将生成一个适合从SRAM启动的映像文件。当编译并下载该映像至STM32设备上之后,在BOOT引脚配置正确的情况下,微控制器将会在复位时直接进入SRAM模式,并执行存储于其中的程序代码。 值得注意的是,由于SRAM本身不包含任何初始化信息,从SRAM启动的应用需要在其启动函数(例如`SystemInit()`)中自行加载Flash中的初始设置到内存并进行必要的跳转操作。这样可以确保在运行期间能够顺利访问和利用Flash中的完整应用程序库或数据结构。 综上所述,配置STM32微控制器以实现其从SRAM而非默认的Flash启动涉及硬件引脚设定、软件函数调用以及Keil IDE项目设置等多方面的知识和技术细节。这些步骤对于开发人员来说非常重要,能够帮助他们灵活地在不同存储介质之间切换启动方式,并根据具体需求选择最合适的解决方案。
  • Keil MDK STM32系列PACK包
    优质
    Keil MDK STM32系列的PACK包是为基于ARM Cortex内核的STM32微控制器提供的集成开发环境插件,包含了一系列硬件支持和软件库,便于开发者进行高效编程与调试。 Keil MDK STM32系列 PACK包包含以下内容: 1. 包含STM32F0xx、F1xx、F2xx、F3xx、F4xx等型号的PACK,包括最新版本及历史版本。 2. 含有Keil其他所有系列pack(如RTOS、Kinetis、MCB、STBlue、LPC、V2M、EFM等)高速下载教程。 * 所有pack均来自Keil官网且未作任何改动。由于官网直接下载速度较慢,提供了一个更快的下载方式。 * 压缩包大小超过640MB,请确保有足够的存储空间进行下载和安装。
  • Mini2440在MDK完整
    优质
    本文详细介绍了如何为Mini2440开发板编写和配置完整的启动代码,在Keil MDK环境下实现系统的初始化与运行。 mini2440在MDK上的完整启动代码已经调试完成,可以直接使用。
  • Keil MDK配色方案
    优质
    本资源提供了一套专为Keil MDK设计的代码配色方案,旨在提升编程时的视觉舒适度和代码可读性,帮助开发者更高效地进行软件开发工作。 MDK Keil是一款广泛应用于嵌入式开发领域的集成开发环境(IDE),由ARM公司提供,主要用于编写和调试基于ARM架构的微控制器程序。长时间编程工作需要合适的代码配色方案来提高工作效率并减轻视觉疲劳。 这款配色方案以黑色为主色调,旨在降低屏幕亮度,减少眼睛在暗环境下对蓝光的暴露,从而达到护眼的效果。这种颜色搭配使得代码的语法结构更加清晰,并且不同类型的元素(如关键字、注释和字符串等)之间的区分更加明显,帮助开发者快速识别代码的不同部分并提升阅读速度。 MDK Keil5中的配色方案不仅关乎视觉美学,还涉及人机交互心理学。合适的颜色搭配可以激发编程者的创造力同时降低因长时间盯着屏幕而产生的视觉疲劳。例如,关键字通常采用鲜艳的颜色如蓝色或紫色以突出其重要性;变量和函数名可能采用较淡的颜色便于快速扫描;注释则常以绿色显示易于区分且不干扰主要代码的阅读。 用户可以在MDK Keil5中找到具体的配色设置包括颜色代码、亮度和饱和度等参数,并在IDE的设置选项中导入并应用。一旦完成设置,就可以享受到定制化的护眼编程环境了。 值得注意的是个人对颜色感知和喜好的差异使得这个方案可能不适用于所有人。开发者可以根据自己的视觉习惯进行微调创建个性化配色方案。MDK Keil5提供了自定义功能让用户尝试不同的组合找到最适合的那一种。 总之,MDK Keil代码配色方案是为了提升夜间编程体验通过合理的布局对比度使代码更易读同时减轻视觉压力保护视力对于长时间工作的人来说选择舒适的配色方案是十分必要的。
  • STM32 IAR工程转Keil MDK详解
    优质
    本文详细介绍了如何将基于IAR开发环境的STM32工程项目转换到Keil MDK平台的过程和注意事项,帮助开发者高效迁移项目。 大多数STM32示例程序都是使用IAR开发环境编写的,但我认为Keil MDK更便于操作,并且可以利用RVMDK的强大外设仿真功能来加速STM32的开发工作。我在之前的博客文章中介绍过如何在RVMDK环境中建立一个STM32工程以及如何运用其软件仿真功能,接下来我将详细说明怎样把现有的IAR项目迁移到Keil MDK。 无论是使用IAR还是RVMDK进行编程时都基于相同的STM32固件函数库。唯一的区别在于启动文件的不同:在创建一个新的STM32项目时,RVMDK会自动生成名为`STM32F10x.s`的启动文件;而IAR则使用的是`cortexm3_macro.s`作为其启动文件。 此外,在中断向量表管理方面两者也有所不同。当从IAR环境迁移至Keil MDK时,首先需要确认原项目是否已经利用了中断功能。这可以通过检查工程中的stm32f10x_it.c文件内的各个中断函数来实现:如果这些函数为空,则说明没有使用到任何中断;反之,若发现它们被修改过,并且在main函数中对NVIC进行了相应的设置,则表明确实存在中断的应用。
  • AT91Bootstrap AT91SAM9260-EK Keil项目: AT91SAM9260Keil工程
    优质
    本项目为基于AT91SAM9260-EK开发板,使用Keil编译环境创建的AT91Bootstrap启动代码工程,适用于ARM微处理器AT91SAM9260。 关于at91sam9260启动代码的Keil工程,可以进行如下描述:针对AT91SAM9260微处理器的开发工作,创建了一个基于Keil IDE的工程项目来实现其启动代码的功能。这个项目旨在为开发者提供一个完整的环境用于初始化和配置AT91SAM9260硬件资源,并支持进一步的应用程序开发与调试过程。