首页>>科技 >>内容

arm固件开发,ARM系统代码固化的串口实现方法

发布时间:2023-12-27 15:44:14编辑:温柔的背包来源:

很多朋友对arm固件开发,ARM系统代码固化的串口实现方法不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

arm固件开发,ARM系统代码固化的串口实现方法

ARM系统代码固化的串口实现方法。早期的嵌入式程序采用“编程-烧录-修改-烧录”的开发模式。大量的时间消耗在对芯片的反复编程上,增加了开发成本和研发周期。后来发展到模拟器阶段。虽然简化了开发模型,但由于仿真器与ARM芯片的兼容性等因素,经常会出现程序在仿真器上可以正确运行,但固化后就会出现问题的情况。程序固化是软件开发过程的重要组成部分。一般可以通过JATG口、网口、串口等方式进行编程,相比之下,串口实现更为方便,值得推广。作者在开发1C1T小灵通中继站的过程中,编写了编程程序,并使用串口将编译后的目标代码发送给ARM处理器; ARM处理器内部的监控程序将目标代码写入片外Flash中来执行程序。的在线编程。这不仅简化了电路设计,还降低了开发成本并缩短了开发时间。 1、编程原理及流程硬件连接如图1所示。ARM开发板一方面通过串口与PC机连接,另一方面通过20-针IDC宽带线。然后通过25针并行端口插座将仿真器连接到仿真器。连接到PC的LPT端口。开发板上电后即可进行编程。如图2所示,代码固化分两步进行。步骤1、如虚线1所示,通过仿真器将监控程序的镜像下载到ARM内部RAM中并运行。用户可以在主机端使用超级终端或其他串口调试工具与开发板进行通信。步骤2:通过串口发送应用程序的可执行代码,如虚线2所示。此时内部RAM中的监控程序会接收到并编程到Flash中。图1 ARM 开发板与PC 连接图2 代码编程原理2 监控程序设计2.1 启动代码设计实现串口编程的监控程序包括ARM 启动代码、串口通信代码和Flash 编程代码。 ARM启动代码是整个程序运行的入口点。它完成ARM系统正常运行所必需的简单初始化,然后将系统控制权交给操作系统或用高级语言编写的监控程序。由于启动代码直接对SoC内核和硬件控制器进行编程,因此必须采用汇编语言。启动代码包括异常向量表的定义、各种模式下的堆栈初始化、系统硬件初始化、程序运行环境初始化,最后跳转到用户的C语言主程序。当系统上电或者复位时,首先会从逻辑地址0x0开始执行。 ARM 处理器有7 种工作模式,如表1 所示。每种模式都有独立的堆栈指针寄存器(SP),因此必须为所使用的模式的堆栈指针寄存器SP 定义堆栈地址。更改状态寄存器(CPSR) 中的状态位会将处理器切换到不同的模式,然后为SP 赋值以初始化堆栈。当然,堆栈的大小取决于您的需要。表1 ARM处理器的七种工作模式堆栈初始化流程如下: InitStackMOVr0,lr;保存返回地址MOV r1, #Mode_SVC:OR:I_Bit:OR:F_Bit;设置管理模式堆栈MSRcpsr_c,r1LDRr13,=SVC_STACKMOVpc,r0;程序返回到系统硬件初始化,其中包括设置外部存储器的类型、数据位宽等,完成后可以通过“B Main”语句跳转到C语言主程序。与LDR指令相比,虽然跳转范围较小,但32MB的地址空间跳转足以满足程序的需要,运行速度更快。 2.2 烧录主程序设计主要功能函数主要包括接收串口数据、解析图像文件和写入外部Flash,如图3所示。串口函数主要由init_sio()、init_val()和send_data()组成。

函数init_sio()用于设置串口通信参数:波特率,57 600 b/s;奇偶校验,无;数据位,8位;停止位,1位。 init_val() 转储接收到的数据。为了提高接收速率,将接收到的数据暂时存储在外部SRAM中。如果程序体积较小,也可以选择暂时存放在芯片内部的RAM(64KB)中,接收完成后再进行分析。 send_data()用于将编程工作信息发送回串口。图3 主要功能流程下一步是解析图像文件并将其正确写入外部Flash。嵌入式程序通过编译器生成的镜像文件是elf格式的axf文件,其中包含文件头、段信息等信息。不能直接燃烧。一般会转换成bin或者hex文件。这里嵌入式程序被编译成SRecord十六进制文件。这是Motorola推出的标准文件格式,用于将数据从PC传输到目标平台Flash,广泛应用于嵌入式开发。 SRecord文件格式如下: 其中,SID代表当前记录的类型。常见的有S0、S1、S5、S9等,每种类型代表的含义不同。例如S9所在语句代表文件结束;数据长度代表这句话的结束。数据的长度;地址的字节数根据不同的S记录会有所不同,一般为2字节,代表后续数据在内存中的地址。一条S记录的长度不会超过78字节,因此每次读取数据的长度设置为78字节,并通过判断文件类型的标志位来确定一条S记录的开始(例如S3为0x5333) )。解析过程是根据SID确定数据长度,截取数据部分,并将要写入Flash的地址传送出去。最后一步是如何将数据写入Flash。不同类型的Flash存储器的编程和擦除指令也不同。本系统采用现代公司生产的HY29LV160。通过向Flash存储器的特定寄存器写入地址和数据命令,可以对Flash存储器进行编程、擦除等操作。编程指令只能将“1”变为“0”,而擦除命令则可以将“0”变为“1” 。因此,正确的操作顺序是先擦除后编程。当Flash被擦除时,读出的数据应该是0xff。写指令编程如下: *((volatile uint16 *)start_addr + addr_unlock1)=data_unlock1; start_add为Flash起始地址,addr_unlock1为0x555,//data_unlock1为0xaaaa*((volatile uint16 *)start_addr +addr_unlock2)=data_unlock2;//addr_unlock2为0x2aa,data_unlock2为0x5555*((volatile uint16 *)start_addr +addr_unlock1)=setup_write;//setup_write is0xa0a0*to_add=data_pra;//每个单元编程命令发出后都要检测写入的数据,以保证上一个单元编程完成后,才能对下一个单元进行编程,当然,也可采用延时等待法进行连续编程。 2.3 编译与执行由于日本OKI公司的PHS芯片ml7338基于ARM7TDMI内核,因此系统采用ARM集成开发调试环境ADS1.2,并使用TechorICE仿真器。具体编译语句如下:armlink Startup.o main.o-rw-base0x10000000-first Startup.o(vectors)//中断向量表位于镜像头-o loader.axf-info Totals,0x10000000为ml7338内部RAM的起始地址,编译完成后生成loader.axf文件。需要注意的是,要固化的代码要转换成SRecord文件。可以选择Motorola 32 bit Hex in ARM fromELF编译器下的输出格式,或者使用如下编译语句: fromelfnodebug filename.axfm32 filename.txt 以上两种方法都会生成SRecord文件。通过仿真器将烧写程序下载到ml7338内部RAM中。运行后即可固化PC机通过串口工具发送来的应用代码。

固化完成后,拔掉模拟器的插头。当系统复位或上电时,Flash存储器被映射到起始地址0x0,可以执行加载的可执行映像文件。结论虽然本文编写的编程程序是针对PHS芯片ml7338的,但它已经扩展到基于ARM的32位嵌入式系统。开发者只需修改框架即可编写自己的编程程序。整个系统采用ARM汇编语言和C语言开发,因此可以方便地移植,对于编写基于网口的监控程序也具有重要的参考价值。

以上知识分享希望能够帮助到大家!