一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

用IAR的嵌入式工作台调用实用程序ROM函数

来源:analog 发布时间:2024-07-23

摘要: 这个应用程序描述了如何使用IAR的嵌入式工作台调用MAXQ实用程序ROM例程。这些例程允许您在微控制器的程序空间中存储和检索数据。

存储在程序内存中的数据不能在MAXQ 微控制器上直接访问。相反,IAR嵌入式工作台 用于调用C代码中的特殊函数,这些函数在微控制器的ROM中为该任务提供。本应用说明解释了从应用代码调用ROM所需的步骤。

概述

当使用微控制器时,程序员通常在应用程序代码中使用查找表。但是,由于MAXQ核心的性质,应用程序软件不能直接从代码空间读取,因此不能直接访问应用程序代码中定义的任何表。为了缓解这个问题,所有MAXQ微控制器都实现了所谓的“伪冯·诺伊曼”架构:开发人员可以在程序空间中存储数据和表,但只能通过使用特殊的Utility ROM例程。除了这些核心功能,每个MAXQ微控制器的ROM都可以有特定于该设备的例程。本应用笔记描述了使用IAR嵌入式工作台从代码访问这些Utility ROM函数必须采取的步骤。

指定函数地址和原型

利用ROM功能的第一步是确定这些功能的位置。MAXQ设备的用户指南附录列出了Utility ROM的用户功能、地址、输入和输出。使用此信息查找将要调用的函数的入口点。例如,下面的表1(来自MAXQ2000补充的表48)显示flashWrite功能位于word地址08461h。

表1 Utility ROM用户功能(适用于Utility ROM Version 1.01)
函数数量函数名入口点总结
0flashWrite08461 h程序一个字的闪存。
1flashErasePage08467 h擦除(程序到FFFFh)一个256字的闪存扇区。
2frashEraseAll08478 h擦除(程序到FFFFh)所有闪存。
3.moveDP008487 h在DP上读取一个字节/字[0]
4moveDP0inc0848年啊在DP[0]处读取一个字节/字,然后增加DP[0]。
5moveDP0dec0848 dh从DP[0]读取一个字节/字,然后递减DP[0]。
6moveDP108490 h在DP[1]读取一个字节/字。
7moveDP1inc08493 h在DP[1]处读取一个字节/字,然后增加DP[0]。
8moveDP1dec08496 h在DP[1]处读取一个字节/字,然后递减DP[0]。
9moveFB08499 h在BP[off]读取一个字节/字。
10moveFPinc0849 ch在BP[off]处读取一个字节/字,然后将off加1。
11moveFPdec0849跳频在BP[off]处读取一个字节/字,然后减少off。
12copyBuffer084年a2h将LC[0]值从DP[0]复制到BP[off]。

既然已经知道了各种功能的入口点,就可以配置IAR Embedded Workbench以使用这些地址。选择选项项目菜单。在弹出的对话框中选择链接器类别列表。点击额外的选项选项卡,并确保选中“使用命令行选项”框。在选项列表中,您必须为您打算使用的每个实用程序ROM功能添加一个项目;指定该函数的地址。选项应具有以下格式:


-D< function_name&gt = & lt; hexadecimal_byte_address>


& lt; function_name>是将从应用程序代码调用的函数名。它不必与上表中给出的名称匹配,但它必须是一个有效的C代码函数名称。& lt; hexadecimal_byte_address>是ROM函数入口点的字节地址。由于该表列出了字地址,因此需要将它们乘以2以将它们转换为字节地址。下面是一个MAXQ2000项目的选项示例(图1),该项目使用了所提供的三个ROM函数。


图1所示 MAXQ2000项目示例使用三个ROM函数。

要使这些函数可以通过应用程序代码访问,请为每个函数声明原型,并使用与在选项屏幕上。参数传递将在下一节中讨论,因此现在将每个原型声明为不接受参数且没有返回值。


外部void utilFlashWrite(void);外部void utilflashherasepage (void);外部void utilMoveDP0(void);

创建包装器函数

现在可以直接从应用程序代码调用ROM函数。然而,这里有一个警告。由于函数通常在与IAR编译器使用的寄存器不同的寄存器中接受它们的输入参数,因此函数可能会破坏编译器所依赖的寄存器。这些函数可能还需要在禁用中断的情况下执行。因此,您应该创建一些辅助函数来处理这些问题。对于你想要调用的每个ROM函数,确定:它接受什么输入;它提供的输出;以及它破坏的寄存器。所有这些信息都可以在您的MAXQ设备的用户指南补充中找到。

继续上面的例子,您可以看到flashErasePageMAXQ2000的功能说明如下:

功能:flashErasePage
简介:擦除(程序到0FFFFh) 265字的闪存页。
输入:A[0]:位于待擦除页上的字地址。(页码是A[0]的高字节。)
输出:进位:错误时设置,成功时清除。
破坏:[1],李建平,李建平,李建平

注:

  1. 如果看门狗复位功能是活动的,在调用该功能之前应该禁用它。

  2. 当从flash调用这个函数时,应该注意返回地址不在被擦除的页面中。


有了这些信息,您就可以创建一个助手函数来调用flashErasePage. 除了实际调用Utility ROM函数之外,这个辅助函数还需要执行四个额外的步骤:

  1. 配置ROM功能的输入。

  2. 保存和恢复ROM函数销毁的任何保留寄存器。

  3. 处理ROM函数的输出。

  4. 保存、禁用和恢复对ROM函数调用周围的中断。

准备输入

这个示例ROM函数接受A[0]作为输入,设置A[0]很简单。通过使用一些IAR关键字和宏,我们可以为MAXQ中的任何寄存器声明一个变量。为a[0]声明一个变量,添加以下语句:


__no_init __io unsigned int A0 @ _M(0x09,0x00);


的数据类型和输入要特别注意_M宏。这个变量A0被声明为“unsigned int”,因为它是一个16位寄存器。如果它是一个8位寄存器,我们可以将它声明为“unsigned char”。输入到_M宏是模块号,后面跟着A[0]寄存器的偏移量。现在,您可以简单地将该变量设置为A[0]中所需的值。


A0 = pageAddr;

保存特别登记册

以上述方式使用寄存器时必须小心,因为编译器期望某些寄存器不会从一个函数调用更改到下一个函数调用。MAXQ IAR C编译器参考指南将以下寄存器(表2)列为暂存寄存器。可以在不干扰程序流程的情况下销毁这些寄存器。此外,APC和DP[1]寄存器以及DPC寄存器的0、1和3位在任何时候都不应该被修改。如果函数更改了任何其他寄存器,则应该在退出该函数之前恢复它们。

表2 抓寄存器(1)
MAXQ10设备MAXQ20设备
[0], [1], [2], [3], GR, LC [0], LC [1], DP [0], BP,走开,美联社[0], [1], [2], [3], [4], [5], [6], [7], GR,
Lc [0], Lc [1], dp [0]Bp, off, ap

flashErasePage描述将APC列为被破坏的寄存器之一,因此您必须确保在调用之前保存并恢复该寄存器utilFlashErasePage. 如果使用IAR,这个任务也很简单asm  函数。MAXQ汇编语句可以使用这个函数直接插入到C代码中。因为APC需要保存,所以你可以直接添加asm(“推动APC”)asm (APC“流行”)围绕调用的语句utilFlashErasePage

处理ROM函数的输出

处理ROM函数的返回值与处理输入类似。您可以直接读取相应的寄存器。的flashErasePage函数,例如,设置一个错误的进位。您可以直接使用PSF_bitIAR提供的iomaxq.h头文件中声明的结构。


return (PSF_bit.C == 0);

保存、禁用和恢复中断

最后要考虑的任务是是否需要禁用中断。大多数实用程序ROM例程假定它们不会被中断。因此,如果您的应用程序使用中断,明智的做法是在调用Utility ROM函数之前禁用它们。禁用它们的最简单方法是使用IC_bit结构定义在iomaxq.h头文件和__disable_interrupt  函数定义在intrinsics.h文件中。


unsigned char origIGE = IC_bit.IGE;//保存当前状态__disable_interrupt ;/*在这里添加rom调用代码。* / IC_bit。IGE = origIGE;//恢复中断状态。


如果你遵循所有这些步骤,你将得到类似于下面的代码:


#include <intrinsics.h>#include <iomaxq.h>//实际Utility ROM函数的原型。//定义我们需要直接访问的寄存器。unsigned char flashErasePage(unsigned int page){unsigned int pageAddr;unsigned char origin;pageAddr = page <<8;//修改page #为一个地址。origIGE = IC_bit.IGE;//保存当前状态。__disable_interrupt  ;A0 = pageAddr;//设置输入到rom函数。asm(“推动APC”);// rom函数销毁APC。utilFlashErasePage  ;//调用实际的rom函数。asm(“流行APC”);//恢复APC。IC_bit。IGE = origIGE;//恢复中断状态。return (PSF_bit.C == 0);//检查从rom返回的代码。}

结论

使用上面概述的程序,您可以轻松调用每个MAXQ微控制器的实用程序ROM中提供的函数。您可以创建函数包装器,利用MAXQ Utility ROM中的代码来访问查找表、在程序空间中存储数据以及每个MAXQ系列设备特有的其他函数。

(1)在编写此应用说明时,MAXQ IAR C编译器参考指南将DPC寄存器列为刮擦寄存器。这是文档中的一个错误,DPC寄存器应被视为特殊寄存器之一。

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: