8-bit Knowledge Base

    Publish
     
      • 在BL51或LX51中使用常量来设定flash lock字节值

        yucheng | 01/13/2017 | 03:10 AM

        问题

        是否可以在编译代码时指定8051 MCU lock 字节的值 ?

        答案

         

        可以,在使用Keil C51工具链时,可以很容易的通过BL51或LX51来实现

        首先,需要在代码中的某个位置初始化lock 字节的设定。譬如,可以创建一个新的文件,并命名为”lockbyte.c”,然后在其中加入如下的代码,

         

        #include <si_toolchain.h> 
        const uint8_t code lockbyte = 0x00;

        这段代码将会在flash中占用一个byte,且其初始值为0,但此时并未指定其具体地址。为了将这个字节放置在flash的lock字节位置,需要使用到链接器。

        关于lock字节的地址,请查阅相应MCU的参考手册。例如EFM8BB1F8的lock 字节在flash的0x1FFF位置。

         

        如果使用Simplicity Studio,链接器的指令可以在如下位置修改,Project -> Properties -> C/C++ Build -> Settings-> Keil 8051 Linker > Miscellaneous。然后在[Additional Flags]中添加链接器指令。

        如果使用LX51,请在[Additional Flags]中添加如下命令:

         

        SEGMENTS (?CO?LOCKBYTE(C: 0x1FFF))

         如果使用LX51,同时该MCU有code banking, 则需要指定code bank以及地址。例如,使用如下命令将LOCKBYTE放置在bank3 0x1FFFF位置。

         

        SEGMENTS (?CO?LOCKBYTE(B3:0x1FFFF)) OVERLAY (* ! ?CO?LOCKBYTE)

         如果REMOVEUNUNUSED有被使能,那么需要使用OVERLAY命令以保证其不会处理该lock字节,否则链接器会将LOCKBYTE从代码段移除掉。REMOVEUNUNUSED设定在如下位置:

         

        removeable.png

         

        如果使用BL51,相应的命令如下

         

        CODE (?CO?LOCKBYTE(0x1FFF))

         编译完成之后,查看.m51文件或.hex文件,即可以确定是否有将常量放置在指定的lock字节(0x1FFF)位置,同时其初始值是否正确。

         

        map_file.png

         

        link_file.png

      • 为什么我在Simplicity Studio中编译项目的时候总提示Keil C51编译器没有注册?

        Shaolin | 12/357/2015 | 10:35 PM

        系统中有可能存在多个版本的 C51 编译器,项目所选择的编译器可能是一个未注册版本。通过如下步骤重新设置编译器即可:
           1. 查看系统中的编译器

                   在IDE界面下,查看菜单 Help->Licensing 可以看到系统识别到的编译器,如下图   

                           Help_Lice.png     

         

               点击对应的版本即可看到编译器是否注册。如果未注册请按照指引进行注册。不必将每个版本都注册,只需要注册一个版本即可。

         

           2. 选择合适的编译配置

               如果系统中有多个编译器时,项目选择的编译器可能是一个未注册的编译器。如果选择了未注册的版本,按照下图中方式进行修改。

            build_configuration.png


        3. 清理项目重新编译
            选定项目,并选择合适的编译配置之后,可以通过菜单 Project->Clean清理项目,然后再次编译即可。有时导入的项目引用了旧的配置,仅执行第3步即可。

         

      • 如何为一台无法上网的机器注册 Keil C51 编译器?

        Shaolin | 12/357/2015 | 10:34 PM

         

                Keil C51注册的关键信息是CID:Computer ID和PSN: Product Serial。这两个信息每台电脑都不一样,所以不能简单的将一个电脑的注册信息复制到另外一台。

               如果一个电脑无法上网,我们可以获取它的PSN/CID然后到另外一台可以上网的电脑进行注册。CID的获取方式可以采用如下方式之一:

               1. 如果有安装了Keil uVision,则在注册页面可以看到。详情参看AN104

                       http://www.silabs.com/Support%20Documents/TechnicalDocs/an104.pdf

               2. 如果是安装了Studio,那么可以在Studio中启动注册页面,在URL中看到注册信息。选择 Help->Licensing Helper,然后点击"this form"启动注册页面。

         

                        Licensing_helper.png

         

                       然后在浏览器的地址栏即可看到PSN和CID,可以直接将地址栏中地址输入到另外一台电脑注册,也可以在 https://www.keil.com/license/install.htm 输入PSN和CID注册。

         

        psn_cid.png

         

      • 使用 LFO时 EFM8BB1 高待机电流

        Jiehui | 12/341/2015 | 04:53 AM

        问题

        在使用低频振荡器(LFO)情况下,为何EFM8BB1的待机电流高于数据手册中规定的数值?

        答案

        在连接USB 调试适配器情况下,即使退出调试会话,调试器可能仍保留高频振荡器(HFOSC0)打开的状态,导致待机电流大于正常值。

         

        使用LFO情况下测量待机电流:

        1. 临时关闭Simplicity Studio中的USB自动检测(如果之后想要自动检测而不必点击"Refresh detected hardware"需要重新打开它)。

        - 在Simplicity Studio中点击"Refresh detected hardware"右边的下箭头

        - 点击"Configure device scanning..."

        - 在Device Manager下面选择TCF Device Discovery,将USB Discovery选项的刷新间隔从5秒更改为Never。

        USBDiscoveryRefreshInterval.png

         

        2. 如果调试器已经连接到MCU (例如下载固件之后或者通过每5秒自动检测选项),则需要复位MCU以关掉 HFOSC0。

      • 如何创建和链接一个静态库文件

        Jiehui | 11/316/2015 | 06:10 AM

        静态库文件包含可以被工程调用和链接的代码,它可以用于提供可重复使用的函数或以二进制代码形式(还需一个头文件)发布代码。

         

        在Simplicity Studio 中创建一个静态库,通过File -> New -> Silicon Labs MCU Project 并选择 Library: 

        lib1.png

         

        接着写下任何你想包含在这库文件中的函数。库函数可以被其它库函数调用。务必创建一个包含这些你想要被调用的函数原型的头文件。这库文件中不能含有main()函数,然后编译该工程。

        lib2.png

         

        再创建一个新工程以链接到这个库(也可以使用现有的工程)。

        lib3.png

         

        在这工程中,添加包含库头文件的目录到包含路径,这可以通过 Properties -> C/C++ Build -> Settings -> Tool Settings -> Compiler -> Includes -> Add directory实现。

        lib4.png

         

        添加库文件.lib到链接器,Properties -> C/C++ Build -> Settings -> Tool Settings -> Linker -> Libraries -> Add。之前必须先编译库文件工程才能产生.lib文件。

        original.png

         

        添加#include头文件名到工程中。至此,便可以调用库文件中的函数了。

        lib5.png

      • 输出由Keil PK51编译的工程的内存使用情况总结

        Jiehui | 11/316/2015 | 06:10 AM

        当使用Keil LX51链接器编译一个工程时,链接器会输出一个.m51的map文件,该map文件显示了工程的函数和模块在内存的使用情况,如下图。

         

        map.png

         

        为了帮助优化8051程序,用户可以在编译8051工程后运行附件的 Python 脚本 summarize.py 显示更多的内存使用信息。

         

        py.png

         

        该脚本在当前工作目录下搜索第一个.m51文件,并解析map文件通过模块(源文件)统计内存使用情况。

        使用步骤:

        1. 下载附件 summarize.zip 并解压 summarize.py 到工程的Debug和Release编译文件夹。

        2. 安装 Python 2.7 或 3.3

        3. 在工程的编译配置的 Post-build steps中,添加以下命令运行脚本:

        python summarize.py

         

        如果系统PATH变量没有包含python.exe的路径,则上面命令行必须包含python.exe可执行文件的完整路径以替换"python"

          

        更多关于Simplicity IDE Post-build steps,请查看下面文章:

        为Simplicity IDE添加post build step

      • 如何在Simplicity IDE中创建汇编工程

        Jiehui | 11/316/2015 | 06:09 AM

        问题

        如何在Simplicity IDE中创建汇编工程? 

        答案

        1: Simplicity IDE 中选择 File > New > Silicon Labs MCU Project

         

        2: 建议选择一个 SDK,这样无须手动添加包含的头文件到工程中,因为包含的头文件是 SDK 的一部分。

         

        3: 对于项目类型,选择空白的C项目(尽管我们将要写汇编代码)。

         

        4: Link to sources Link libraries and copy sources Copy contents  In-place

        在使用现有例程时,这些选项是有相关意义的。现有的例程位于 SDK 目录下。而基于Eclipse Simplicity IDE 有本地的 “workspace” 工作目录,用户可以选择导入例程的一份拷贝到此目录,这样就不会编辑到位于 SDK 安装目录下的例程原始文件。

        Link to sources - workspace 中创建IDE项目文件(.project and .cproject),链接到源文件,不复制源文件到 workspace 目录,对源文件的任何编辑都将直接作用在 SDK 路径下的源文件。

        Link libraries and copy sourcesworkspace 中创建IDE项目文件(.project and .cproject),不复制库文件,只复制源文件到workspace 目录。对源文件的任何编辑仅局限于workspace 目录下。

        Copy contentsworkspace 中创建IDE项目文件(.project and .cproject),复制库文件和源文件,对文件的任何编辑仅局限于workspace 目录下。

        In-place在源文件所在目录(非 workspace 工作空间目录)创建IDE项目文件(.project and .cproject)。所有源文件没有被复制到 workspace 中。

         

        提示: 在项目浏览窗口,任何时候在一个被链接的文件夹或文件旁边都可以看到一个快捷链接(正如Windows系统中的快捷链接)的箭头图标。

        当创建一个空白的工程时,通常在 workspace 目录中保留源文件。因此,我们建议使用 "Link libraries and copy sources"

         

        5. 在编译配置中仅选择 Keil 编译工具

         

        6. 点击Finish后,应该能够看到新建一个带有.c .A51文件的工程。由于要用汇编语言编程,这些不需要的文件可以从文件系统中删除。

         

        7. 新建一个.asm 后缀名的文件,并编译。如果第一步中选择 EFM8SB1 器件,附件有一个用汇编写的 blinky 实例供测试。

         

        提示:当启动调试会话框调试一个汇编工程时,Simplicity IDE将不会自动暂停 MCU。需要在 Debug 窗口中先点击 .omf 文件,再执行 Run > Suspend 或点击工具栏的暂停按钮以暂停 MCU

      • 在 Simplicity Studio 中用 Keil C51 产生内联汇编代码

        Jiehui | 11/316/2015 | 06:08 AM

        问题

        在 Simplicity Studio 中有可能编译包含内联汇编代码的 C文件吗?

        答案

        是的,这可以通过以下步骤来实现:

         

        1. 使用 #pragam asm 添加内联汇编代码

        详情请参阅:C51: Getting Inline Assembly to Work

         

        c_asm_1.png

         

        2. 编译 C 文件产生汇编代码

        这可以通过对该 C 文件编译属性添加 SRC 指令来实现。在工程浏览器中右键点击该 C 文件,并选择属性(Properties),然后在编译器配置的额外标志域处添加“SRC”。

        c_asm_2.png

         

        做完上面这一步,编译工程。编译器就产生 .SRC 文件,同时报告一个错误 - 这是因为链接器现在缺省我们所编辑的 .c 文件所对应的.OBJ文件,因为我们只告知编译器产生一个.SRC文件而非忽略该错误。产生的 SRC 文件应该包含该 C 文件的汇编代码加上我们已经添加的内联的汇编指令。

         

        c_asm_3.png

         

        3. 不编译原有.c文件

        这将会移除之前的错误。在工程浏览器中右键点击该文件,并选择Resource Configurations -> Exclude from Build...

         

        c_asm_4.png

         

        4.添加 SRC 文件到 Simplicity Studio中作为源文件编译

        默认情况下 .SRC不被识别为源文件,因此必须手动添加。点击菜单Window -> Preferences -> C/C++ -> File types。如下图,添加“.SRC”文件作为汇编源文件。

        c_asm_5.png

         

        5. 必要情况下可以添加 C51实时库文件

        如果你的工程中仅有汇编文件,C51库文件将不会自动被包含一起编译。可能是C51S.LIB、C51C.LIB 或 C51L.LIB,取决于存储器模型的选择(Small、Compact 或 Large)。这些可以在Keil安装目录下 C51\LIB 中找到。

        c_asm_6.png

         

        6. 编译工程

        现在 Studio将编译.SRC源文件以及其它添加的汇编文件。至此,你也可以直接修改这.SRC文件,或者修改原.c文件再重复以上这些步骤产生.SRC文件。

      • 如何把Silicon Labs IDE的8位工程导入Simplicity Studio?

        delu | 09/257/2015 | 03:44 PM

        问题

        如何把Silicon Labs IDE的8位工程导入Simplicity Studio?

        答案

          1. 在Simplicity Studio IDE界面,选择File > Import > Simplicity Studio > MCU Project > Next。另外一个方法是在“Project Explore”窗格 (左侧)内任意位置右击鼠标,然后到导航到Import >  MCU Project
          2. “Import MCU Project”窗口就会弹出。通过预览按钮选择Silicon Labs IDE的工程文件(.wsp,这里以C8051F85x_86xblinky为例)。单击Next
          3. 在下一个窗口:
          4. Kit = none

            Part = 选择器件编号(C8051F850)

            SDK = 保留默认设置(比如 SI8051 SDK (v3.0.0))

            Toolchain = 保留默认设置 (比如 Keil 8051 v9.51)

            Build Artifact = 可执行 

            单击Next。

          5. 在下一个窗口,重命名工程(可选),然后选择Finish
          6. 其他必要修改,比如包含文件名。
          7. 点击小斧头图标(或者菜单Project > Build Project)来编译该工程。