gcb*_*gcb 2 c embedded assembly atmega msp430
我如何从芯片制造商那里找到几个芯片的魔术地址列表?对它所支持的价值观的体面解释?
我甚至无法弄清楚要调用/搜索它的术语.
刚开始嵌入式编程.我需要设置各种各样的魔法.
通常我会遇到一些事情:
MOV BLKMGC 0x01
Run Code Online (Sandbox Code Playgroud)
要么
REO034 = 0x80; // stops all onboard leds, boot freebsd, makes coffee, do laundy.
// use 0x81 if you have more white clothes than color ones.
Run Code Online (Sandbox Code Playgroud)
有时会有评论解释他们在做什么.我主要记录了我在示例代码中找到的所有内容.用于msp430启动板的那些通常是由很多冗长的评论人写的,我甚至可以在芯片系列笔记上找到一些地址图,但几乎不是一个易于理解的列表.在试图完全理解这一点时,Arduinos上的芯片更常见.(授予,我仍然不确定如何搜索它:)
到目前为止我找到的最好的地方是我正在使用的芯片的头文件...但即便如此,请举例:
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop Watch Dog Timer
// how 99% of msp430 programs start.
Run Code Online (Sandbox Code Playgroud)
现在头文件:
#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 " */
Run Code Online (Sandbox Code Playgroud)
没有对单个位的解释,没有与最常见的组合的现成组合.
奖金咆哮问题
因为它总是在强大的,大多数闲置的个人计算机上编译,为什么所有编译器/ IDE都选择模仿裸机的用户友好性?是不是有很多更好的格式呢?如果我不是在疯狂的表现,我是否必须知道平凡的编码设置地址0x0120与值0x5A80停止看门狗定时器?头文件/ IDE不能让它成为watch_dog_timer( STOP );我的?
此信息可从制造商的数据表中获得.并非所有芯片都有可用的数据表1,因此在挑选芯片时请记住这一点.
举个例子,让我们来看看ATmega48.这是一个简单的芯片,带有一套很好的基本外设.
转到制造商的网站并找到产品页面.您可以在他们的网站上搜索它,或者您甚至可以使用Google,但我只是点击制造商网页上的链接获得了最大的成功.转到页面的"文档"部分.
对于ATmega48,可从http://www.atmel.com/devices/ATMEGA48.aspx?tab=documents获取这些文档.
下载相应的PDF文件.这可能被称为"数据表"或"用户手册".它绝对不是"应用笔记"或"概述".如果文件小于大约一兆或少于一百页,则可能不是正确的文件.
对于ATmega48,该文件名为"ATmega48/88/168 Complete"
"魔术地址"称为寄存器. 这些是IO寄存器或外设寄存器,而不是您在编写用户空间程序时使用的寄存器类型.寄存器通常是唯一的,可以是只读,只写或读写.
对于ATmega48,您可以在第31节"注册摘要"中查看所有寄存器的列表.有关如何使用每个寄存器的说明,请参阅描述相关外设的部分.例如,GPIO寄存器在第14节"I/O端口"中描述,示例代码在汇编和C中.
Bonus rant:如果你想watch_dog_timer( STOP );在你的代码中写一下,你可以自己定义必要的宏和/或函数(最好是函数,除非你的编译器不好,有时候嵌入式系统会发生这种情况2).
当你说裸机编程是"用户友好的"时,我希望你是讽刺的.
脚注:
1:例如,如果没有大订单和NDA,您无法获得Raspberry Pi上芯片的数据表.
2:根据我的经验,你经常想选择一个芯片,因为它有很好的编译器支持,而不是试图为你已经拥有的芯片找到一个好的编译器.至少,如果你是一个业余爱好者.GCC针对的是Atmel和ARM,与我使用过的一些无用的IDE相比,它非常豪华.