我如何从芯片制造商那里找到几个芯片的魔术地址列表?对它所支持的价值观有不正确的解释?
我甚至无法弄清楚要调用/搜索它的术语。
刚开始嵌入式编程。我需要设置各种各样的神奇的东西。
通常我会遇到一些事情:MOV BLKMGC 0x01
或
REO034 = 0x80; // stops all onboard leds, boot freebsd, makes coffee, do laundy.
// use 0x81 if you have more white clothes than color ones.
有时会有评论解释他们在做什么。我主要记录了我在示例代码中找到的所有内容。用于msp430启动板的那些通常是由很多冗长的评论人写的,我甚至可以在芯片系列笔记上找到一些地址图,但几乎不是一个易于理解的列表。在试图完全理解这一点时,Arduinos上的芯片更常见。 (被授予,我仍然不确定如何搜索它:)
到目前为止,我找到的最好的地方是我正在使用的芯片的头文件......但即便如此,请以此为例:
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop Watch Dog Timer
// how 99% of msp430 programs start.
现在是头文件:
#define WDTCTL_ 0x0120 /* Watchdog Timer Control */
sfrw(WDTCTL, WDTCTL_);
/* The bit names have been prefixed with "WDT" */
#define WDTIS0 (0x0001)
#define WDTIS1 (0x0002)
#define WDTSSEL (0x0004)
#define WDTCNTCL (0x0008)
#define WDTTMSEL (0x0010)
#define WDTNMI (0x0020)
#define WDTNMIES (0x0040)
#define WDTHOLD (0x0080)
#define WDTPW (0x5A00)
/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */
没有对各个位的解释,也没有与最常见的组合的现成组合。
奖金咆哮问题
由于它总是在强大的,大多数闲置的个人计算机上编译,为什么所有的编译器/ IDE都选择模仿裸机的用户友好性?是不是有很多更好的格式呢?如果我不是在疯狂的表现,我是否必须知道平凡的编码设置地址0x0120与值0x5A80停止看门狗定时器?头文件/ IDE不能让它成为watch_dog_timer( STOP );
吗?
答案 0 :(得分:5)
此信息可从制造商的数据表中获得。并非所有芯片都有可用的数据表 1 ,因此在挑选芯片时请记住这一点。
举个例子,让我们来看看ATmega48。这是一个简单的芯片,带有一套很好的基本外设。
访问制造商的网站并找到产品页面。您可以在他们的网站上搜索它,或者您甚至可以使用Google,但我只是点击制造商网页上的链接获得了最大的成功。转到页面的“文档”部分。
对于ATmega48,文件可在http://www.atmel.com/devices/ATMEGA48.aspx?tab=documents
下载相应的PDF文件。这可能被称为“数据表”或“用户手册”。它绝对不是“应用笔记”或“概述”。如果文件小于大约一兆或少于一百页,则可能不是正确的文件。
对于ATmega48,该文件名为“ATmega48 / 88/168 Complete”
“魔术地址”称为寄存器。这些是IO寄存器或外设寄存器,而不是您在编写用户空间程序时使用的寄存器类型。寄存器通常是唯一的,可以是只读,只写或读写。
对于ATmega48,您可以在第31节“注册摘要”中查看所有寄存器的列表。有关如何使用每个寄存器的说明,请参阅描述相关外设的部分。例如,第14节“I / O端口”中描述了GPIO寄存器,其中示例代码均在汇编和C中。
Bonus rant:如果你想在你的代码中编写watch_dog_timer( STOP );
,你可以自己定义必要的宏和/或函数(最好是函数,除非你的编译器不好,哪个有时会出现嵌入式系统 2 )。
当你说裸机编程是“用户友好的”时,我希望你是讽刺的。
<强>脚注:强>
1 :例如,如果没有大订单和NDA,就无法获得Raspberry Pi上芯片的数据表。
2 :根据我的经验,你经常想选择一个芯片,因为它有很好的编译器支持,而不是试图为你已经拥有的芯片找到一个好的编译器。至少,如果你是一个业余爱好者。海湾合作委员会以Atmel和ARM为目标,与我使用过的一些无用的IDE相比,它非常豪华。
答案 1 :(得分:4)
作为嵌入式程序员并非都是编程。其中很大一部分是阅读文档,原理图和黑客(文档和原理图总是错误的或旧的或者其他什么,永远不要相信它们100%)。
这是一个完整的混合包。一些供应商制作(相对)优秀的文档,一些是可怕的,并且介于两者之间的所有内容,包括不得不放弃您的第一个出生的文档(好吧,不是很接近)。有些公司觉得这些东西是秘密的,你必须签署和NDA,这并不意味着好的文件会来,它是同样的混合包,只是你得到更多的责任和更多的责任。有时你必须放弃销售人员的信息(姓名,电话号码等),这是最糟糕的,因为你会每周或每月接到一个电话,直到你辞掉工作或他们退出他们的工作,看看你是否准备好买你问过的东西,或者你想听听新的令人兴奋的产品。我倾向于将公司(他们制作的每一件产品)列入黑名单,要求获得文档,通常他们的产品不值得购买。
每家公司的文件解决方案都不同。您提到了msp430,您必须为部件系列转到一组文档,并且您获得寄存器但不是地址的名称,那么您必须转到特定部分数据表以获取与名称一起使用的地址。我坚信Atmel如此受欢迎的一个重要原因是因为总体来说他们的文档更好,他们的信息在那里,有时候不是最好的文档,而是大量的,大量的应用笔记,其他公司不容易给出的信息在竞争对手之前不是光年,有时只有几个百分点更好,但你只是觉得它们只是领先一步,当你不得不深入研究atmel部分时,你不必担心别人的。 ARM,同样的答案,通常非常好的文档(但核心不是芯片,所以你可能在一个糟糕的芯片供应商产品中有一个伟大的ARM核心文档)。其他公司你必须通过示例程序来查找事物,文档与示例软件不匹配等。
你基本上是在做我们其他人所做的事情。挖掘可用的内容是编译器/汇编器源(实际上找到了有关atmel的信息,这在汇编数据文件中很难找到,后来最终在atmel文档中找到),原理图,示例程序,头文件。最终,您将意识到某些文档是由具有良好写作技能的非技术类型编写的,但不知道文档中的技术术语是什么。文档有时会落在图腾柱底部的人身上,新雇用的人是没有任何生产技能的人,等等。不总是,但有时候。文档反映了它。有时,示例程序是一个适合所有可能已经设计用于许多芯片中的公共逻辑块的所有可能添加或删除某些功能的程序,并且您永远不知道为什么代码一直在摆弄未记录或保留的位(那些bit可能在逻辑的先前版本中或在逻辑的更高版本中执行某些操作,如果您挖掘公司的所有产品,您可能会发现这些位,而不是它们对您正在使用的芯片有用)。我喜欢更改代码而不是触摸那些未记录的内容,只是为了看看会发生什么。我真正喜欢的一个(讨厌的)是api调用启动卡,你必须包含一个固件文件的路径。事实证明,如果你仔细检查驱动程序代码,固件文件是针对一种风格的卡,如果你没有那种风格的卡你根本不需要文件,但是api条目代码要求文件是真实的,很漂亮当我想出来的时候很烦人(重写我的驱动程序,更小,更快,更适合我正在做的事情)。
你永远不会发现的一些位和一些寄存器。即使你在公司找到工作,他们也可能不会给你访问,直到你在合适的部门适当的时间。不要指望你想知道的一切都是可用的。有些位是神奇的,有些位模式或数据是神奇的,有时你只需要顺其自然地按照他们告诉你的方式去做...看看visual6502项目,有些人一直在等待他们整个职业生涯并退休找出原因以及该处理器中一些棘手的东西是如何工作的......
最好的办法就是你可能已经做过的事情。购买面向业余爱好者,arduino,msp430启动板,stm32发现板,mbed,raspberry pi等的主板。获取原理图,或查看他们的网页和文档以查找设备的部件号,特别是处理器,然后去他们的页面(通常这些是芯片供应商兜售他们的产品,而不是总是(arduino)。查找那部分,找到该部分的文档,有时很多文档,家庭加特定芯片等。做一些谷歌搜索看到如果有开源项目,请阅读这些来源。如果你很幸运并坚持下去,你可能会在你的工作中找到一个可以影响或驱动设计,文档,样品等的地方。猜猜虽然如此即使您在Atmel工作并且是微控制器的嵌入式软件大师,您仍然必须阅读其他公司的文档,了解您需要构建的板上的其他组件以测试或销售您的芯片。它不会结束,它是一部分这份工作。
许多示例程序使用定义和函数来隐藏原始地址和位,因为许多程序员希望用文字或至少不是十六进制来查看内容。我个人更喜欢十六进制或位,因为我讨厌不得不涉及宏和头文件的层来验证位是正确的。我在屏幕的一侧有数据表(十六进制数字,位数),另一方面有文本编辑器编程,并且十六进制地址与文档匹配是一种非常温暖的模糊感觉。嵌入式是关于准确性和可靠性。在某种程度上,你必须验证你的代码是坚如磐石的,如果你盲目地信任太多人的宏/定义/功能太多而没有以某种方式检查每一点,你将会失败,或者至少失败更多通常比部门中的其他人检查并且没有那么多失败。您当然不能永远编写您的程序,因此您应该找到结合您对编码风格的偏好但提供可靠性的方法。使嵌入式吸引人的一件事是你经常获得的自由,你没有操作系统的规则或应用程序层访问事物的限制等等。你可以按照你想要的方式做你想要的......