如何在芯片保留地址和魔术位上找到官方信息?

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 );我的?

Die*_*Epp 5

此信息可从制造商的数据表中获得.并非所有芯片都有可用的数据表1,因此在挑选芯片时请记住这一点.

举个例子,让我们来看看ATmega48.这是一个简单的芯片,带有一套很好的基本外设.

  1. 转到制造商的网站并找到产品页面.您可以在他们的网站上搜索它,或者您甚至可以使用Google,但我只是点击制造商网页上的链接获得了最大的成功.转到页面的"文档"部分.

    对于ATmega48,可从http://www.atmel.com/devices/ATMEGA48.aspx?tab=documents获取这些文档.

  2. 下载相应的PDF文件.这可能被称为"数据表"或"用户手册".它绝对不是"应用笔记"或"概述".如果文件小于大约一兆或少于一百页,则可能不是正确的文件.

    对于ATmega48,该文件名为"ATmega48/88/168 Complete"

  3. "魔术地址"称为寄存器. 这些是IO寄存器或外设寄存器,而不是您在编写用户空间程序时使用的寄存器类型.寄存器通常是唯一的,可以是只读,只写或读写.

    对于ATmega48,您可以在第31节"注册摘要"中查看所有寄存器的列表.有关如何使用每个寄存器的说明,请参阅描述相关外设的部分.例如,GPIO寄存器在第14节"I/O端口"中描述,示例代码在汇编和C中.

Bonus rant:如果你想watch_dog_timer( STOP );在你的代码中写一下,你可以自己定义必要的宏和/或函数(最好是函数,除非你的编译器不好,有时候嵌入式系统会发生这种情况2).

当你说裸机编程是"用户友好的"时,我希望你是讽刺的.

脚注:

1:例如,如果没有大订单和NDA,您无法获得Raspberry Pi上芯片的数据表.

2:根据我的经验,你经常想选择一个芯片,因为它有很好的编译器支持,而不是试图为你已经拥有的芯片找到一个好的编译器.至少,如果你是一个业余爱好者.GCC针对的是Atmel和ARM,与我使用过的一些无用的IDE相比,它非常豪华.