主题中讨论的其他器件:SW-TM4C、
大家好、我在编写 TM4C123GX Launch Pad 中的内容时遇到问题。 我对微控制器没有经验、因此我使用汇编语言来处理它。 我的问题是、我尝试使用其中一个 TivaWare 示例(startup_rvmdk.S)中提供的启动文件编写程序、它运行正常、但变量 I initialized (PM5_mask)为空。 我尝试在其他地方询问此问题、并被告知是引导加载程序。 我对微控制器的经验不多、因此我非常迷失在开始弄清为什么我的变量在 RAM 中为0、更不用说了解如何使用引导加载程序了。 当我使用仿真器进行调试并查看应该包含变量值的值时、除非我自己设置、否则它始终为0。 此问题的原因是什么?如何解决? 下面是我的代码。 我正在使用 Keil uVision。 提前感谢您!
主程序
;include 常量我定义到 main include my_Constants.s ;include 变量我定义到 main 导入 PB5_mask area |.text|,代码,只读 thumb 导出__main 项 ;此子例程初始化 GPIO_Init PROC... ;将端口 F 引脚1的"高电平"写入数据寄存器以打开红色 LED。 GPIODATA LDR r0、=AHB_PORTB LDR R1、[r0、#GPIODATAPB5] LDR R2、=PB5_MASK;获取 PB5掩码(指针) LDR R3、[R2]的 RAM 地址;获取 PB5掩码 ORR R3、R3、#0xF0 DATSTR、[R2] ORR R1、GPIOR1[r5]r0、GPIOMR1[r5]r15………设置为高电平 BX LR ENDP ;此子例程初始化 SysTick SysTK_InitPROC... ENDP __MAIN ;调用 GPIO_Init 子例程并返回 BL GPIO_Init ;调用 SysTick _Init 子例程并返回 BL SysTick _Init 停止 B;while (1) 结束
my_Constants.s
Area My_Constants,代码,readonly thumb ;在此处为练习定义地址 ;常规基址 SYS_CONTROLEQU 0x400FE000... ;偏移 GPIOHBCTLEQU 0x06C... 结束
startup_rvmdk.s
;包括我定义到启动文件 的常量包括 my_Constants.s 包括我定义到启动文件 导入 PB5_mask 的变量 区域堆栈、NOINIT、READWRITE、ALIGN=3 StackMem 太空堆栈 __initial; ********* ; ;为堆分配空间。 ; 区域堆、NOINIT、READWRITE、align=3 _heap_base HeapMem 空间堆 _heap_limit ;********* ; 指示此文件中的代码保留堆栈的8字节对齐。 ; PRESERVE8 ; ;将代码放入复位代码部分。 ; 区域复位、代码、只读 拇指 ; ;向量表。 ; 导出__Vectors __Vectors DCD StackMem +堆栈 ;栈顶 DCD RESET_Handler ;重置处理程序 DCD NmiSR ; NMI 处理程序 DCD FaultISR ;硬故障处理程序 (笑声) ;保留 DCD IntDefaultHandler ; PendSV 处理程序 DCD SysTick 处理程序; SysTick 处理程序 (笑声) ;******** ; ;这是处理器首次开始执行 时调用的代码;在复位事件之后。 ; 导出 Reset_Handler Reset_Handler ; ;启用浮点单元。 必须在此处执行此操作才能处理 ; main()使用浮点且函数 prologueue 保存的情况 ;浮点寄存器(如果浮点不是浮点则会出现故障) ;已启用)。 使用的浮点单元的任何配置 ; DriverLib API 必须在浮点单元之前在此处完成 ;正在启用。 ; ;请注意,这不使用 DriverLib,因为它可能不包含在内 ;在该项目中。 ; MOVW R0、#0xED88 MOVT R0、#0xE000 LDR R1、[R0] OR R1、#0x00F00000 结构 R1、[R0] ; ;调用 C 库处理启动的足够点。 这将复制 ;.data 段初始化闪存至 SRAM,并填充零 ;.bss 段。 ; 导入_main B __主... ;我在这里添加了 SysTick 处理程序。 这会切换 GPIODATA、使 LED 闪烁 SysTick 处理程序PROC 导出 SysTick 处理程序 ;将"high"写入数据寄存器、使端口 F 引脚1打开红色 LED。 GPIODATA LDR r0、=AHB_PORTB LDR R1、=PB5_MASK;获取 PB5掩码值 LDR R2、[R1]的 RAM 地址;PB5掩码 EOR R2、R2的抓取值 #0xF0;切换 mas 以切换 PB5 STR R2、[R1] ;存储切换的掩码以正确切换下一次 STR R2、[r0、#GPIODATAPB5] LDR R2、[r0、#GPIODATAPB5] BX 返回至__main;LR ENDP ... 结束