8-bit Knowledge Base

    Publish
     
      • STARTUP.A51是什么文件,如何使用?

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

                STARTUP.A51是 Keil C51 的项目中的初始化文件。里面包含了中断向量表和变量初始化代码。此文件为可选文件,如果项目中没有此文件将使用编译器中的默认配置。在Simplicity Studio中建立项目时会自动添加此文件。在旧的8比特 IDE中如果想添加此文件可以到如下路径复制一份到项目中:
                        C:\Keil\C51\LIB\STARTUP.A51

         

                不同的MCU上XRAM大小不同,可以在此文件中修改XRAM的大小以实现初始化。

        ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
        ; <i> The absolute start address of XDATA memory
        XDATASTART EQU 0 

         
                如果系统中定义变量比较多,尺寸比较大,那么初始化时间比较久可能导致看门狗复位,所以可以在初始化函数执行之前关闭看门狗,比如看门狗在PCA模块的设备上可以使用如下代码:

        PCA0MD DATA 0D9H
        CSEG AT 0
        ?C_STARTUP: LJMP STARTUP1
        RSEG ?C_C51STARTUP
        STARTUP1:
        ANL PCA0MD, #0BFH

        而看门狗为独立模块的处理器比如C8051F85x/F86x, EFM8(除 EFM8SB1/SB2/UB2外)上使用如下代码:

         

        STARTUP1: MOV 097H,#0DEH
                  MOV 097H,#0ADH


                附件中的文件是STARTUP.A51的例子。相关参考文章:

                         芯片不停重启,代码无法执行至main()函数。

      • Keil C51中如何在特定地址定义变量、常量?

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

        可以通过在C语言、汇编语言定义变量时指定地址。也可以通过连接器参数中控制变量、常量的地址。需要注意的是在C语言中定义变量/常量不能同时指定地址和初值。如果在C语言中定义了初值,则需要在连接器选项中指定地址。
        具体的方法参见附件。

      • 烧录程序时如何锁定Flash?

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

                锁定Flash可以通过烧录工具进行,在烧录工具上选择锁定,这样烧录完毕之后Flash将会被锁定。还有另外的一个锁定Flash的方法就是在lock byte写入特定的值,可以在源代码中加入也可以直接修改hex文件。如下是锁定Flash的例子。
                1. 修改 Hex 文件在文件结束符之前加入一行用来锁定Flash

                新加入02FDFE00000003可以锁定 F02x MCU,例子如下:

        ...
        ...User code...
        ...
        :02FDFE00000003
        :00000001FF
        其中
        02 表示包含2个字节数据
        FDFE 表示起始地址
        00 表示记录类型(普通数据)
        0000 待写入的值
        03 校验和(下面链接中的intel hex文件规范中有解释如何计算)
        00000001FF 文件结束符


        附件中的两个文件一个是 F32x 的例子,一个是 F02x 的例子。

                2. 可以在项目中添加一个常量定义,将这个常量定义到lock byte所在地址,编译器即会在hex文件中生成对应的数据。锁定变量位置的方式参见如下文章:

               Locating a variable in code space (Keil BL51 Linker)

         

        相关链接及软件

        Silicon Laboratories IDE 及Flash编程工具(Flash Programming Utilities):

        https://www.silabs.com/products/mcu/Pages/SoftwareDownloads.aspx

        Intel HEX 文件格式:
        http://www.keil.com/support/docs/1584.htm
        http://www.8052.com/tutintel.phtml

        Flash相关的知识库文章:

        Updating Locked FLASH
        Locating a variable in code space (Keil BL51 Linker)
        Copying firmware from one MCU to another
        Locking Code Memory
      • Keil C51 编译的时候 Large Mode 、Compact Mode 与 Small Mode 区别有哪些?

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

                Large ModeCompact ModeSmall Mode 是Keil编译时的不同模式,通过传递给编译器的参数来实现,RAM分配和代码编译模式可以分别独立选择三种中的一种。
                Small Mode
                        代码调用、跳转时使用的指令CALL/JMP被编译为ACALL/AJMP,这样就限制代码的整体尺寸不超过2K bytes
                        局部变量被分配在DATA内存中,参数传递也通过DATA内存进行。
                Compact Mode
                        代码调用、跳转时使用的指令CALL/JMP被编译为LCALL/AJMP,这样就限制代码整体尺寸不超过64K bytes,单个函数尺寸不超过2K bytes.
                        局部变量被分配在PDATA内存中,参数传递也通过PDATA内存进行。
                Large Mode
                        代码调用、跳转时使用的指令CALL/JMP被编译为LCALL/AJMP,这样就限制代码整体尺寸不超过64K bytes,单个函数尺寸不超过2K bytes.
                        局部变量被分配在XDATA内存中,参数传递也通过XDATA内存进行。
                参见Keil官方帮助文档:
                                http://www.keil.com/support/man/docs/c51/c51_le_memmodels.htm
                                http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm
                                http://bubuko.com/infodetail-715474.html

      • C8051Fxxx / EFM8 可以使用哪些编译器?

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

                C8051Fxxx / EFM8 体系支持标准的C51编译器生成的代码。Keil C51、IAR、SDCC、Raisonace、Tasking、Hi-Tech等。 如果要使用某些型号上的特殊功能则需要特定编译器的支持, 比如在C8051F12x上的有一个硬件乘/累加模块MAC0,此模块非C51的标准模块。编译器在处理乘/累加语句时通常会调用库函数使用C51的8位A、B寄存器进行乘法和加法运算来实现,效率比较低。Keil C51支持可以将乘/累加的C语言代码转换为调用F12x的MAC0模块的指令。

         

                我们与Keil公司达成协议免费为用户提供C51编译器,只需注册即可免费使用。可以通过如下方式之一获取:

                1. 独立版本:

                在如下页面下载并按照AN014的说明进行安装。
                http://www.silabs.com/products/mcu/Pages/8-bit-microcontroller-software.aspx#keil-pk51
                2. 安装Simplicity Studio

                Simplicity Studio中包含了C51编译器。通过Help->Licensing菜单可以注册。

      • 如何消除Keil C51 的 uncalled functions警告?

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

                由于C51内存比较小,所以Keil C51对于形参、局部变量按照函数的调用关系进行时分复用。这种时分复用不像一般的系统中那样由栈指针管理,而是给变量分配固定地址。所以有时候如果编译器无法知道调用关系就必须为函数分配独立的内存,比如函数定义了但是没有地方显式的调用,但是有可能通过函数指针调用。比如编译器警告function_a未调用,则解决办法可以在函数中加入

        const char NOT_ZERO = 0x0F;
        if (NOT_ZERO == 0)
        {
            function_a();
        }

            详细情况请在Keil帮助文档 C:\Keil\C51\Hlp\c51tools.chm 搜索 overlay。

         

      • 如何安装并注册免费的Keil C51编译器?

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

        Keil C51编译器适用于我们的EFM8、C8051系列51内核的MCU。对应的IDE有两个
                Legacy 8bit IDE(旧的8比特IDE)
                        推出Simplicity Studio之前的IDE,支持C8051系列MCU,不包含编译器,Keil C51编译器要单独安装
                Simplicity IDE
                        Simplicity IDE是Simplicity Studio中的一个组件。在安装Simplicity Studio时如果选择了8比特MCU的支持,则会自动安装Keil C51编译器。

         

                单独安装并注册Keil C51的流程为。
                        1. 下载PK51
                        2. 运行Keil uVision注册
                        如果在Windows 7及以后系统需要选择以管理员身份启动。下图是在Windows 7上启动的方式
                                  Register_C51.png
                        3. 跳转至Keil网站注册
                        4. 将邮件中收到的注册码输入至uVision中。
                        具体过程参见 AN104 第九章 9. Registering the Evaluation Keil Toolset

         

                在 Studio 中注册方法如下

                        1. 跳转至 Simplicity IDE 界面

                        2. 选择菜单 Help->Licensing Helper,选择一个Keil版本号

                        3. 如果未注册,则会显示如下界面

                                   Licensing_helper.png

         

                        4. 点击 "this form" 跳转至 Keil 网站。输入联系信息并提交,Keil会发送注册码至邮箱。

                        5. 将Keil发送过来的注册码输入值上图空白处然后单击”OK“即可完成注册。显示类似如下图信息:

                                   Licensing_helper_OK.png

         

         

      • 使用Keil C51编译器时C8051Fxxx/EFM8 MCU的bootloader和应用程序怎么共享代码?

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

                由于 Keil C51 分配变量时采用了固定地址的分配方案,所以在复用时需要在编译时告知bootloader项目、应用程序分别使用不同的内存区域。这就需要使用Keil C51的连接器命令告诉连接器内存分配在什么单元。比如在AN200中,bootloader的变量使用的是XRAM的最后一部分。为实现这种配置需要在用户项目、bootloader中都需要进行特殊配置。

         

                在bootloader中
                        1. 将代码按照 large 模式编译(在源代码中函数的后面使用了 large 关键字来实现)。这样变量、参数都会被放在XRAM中
                        2. 通过在编译脚本里面(AN200SW\USB_Bootloader_Firmware_Source\LINK_CMD\)指定XDATA的区域: XDATA(?XD?_USB_INIT?USB_API(0x7AF))

         

        在用户项目中需要告知编译器bootloader中共享代码的信息
                        1. 包含特定的头文件,告知常量、变量、函数类型
                        2. startup.a51中包含变量、常量、函数的地址
                        3. 在编译选项中指定可用的RAM、ROM的范围避免冲突。由于bootloader的变量放在RAM最后部分,而AN200中的用户项目的例子比较简单内存使用比较少,所以没有指定XRAM的范围。

         

        具体的例子参见an200sw\AN200SW\Device_Specific\

        AN200的文档及软件包:
        http://www.silabs.com/Support%20Documents/Software/an200sw.zip
        http://www.silabs.com/Support%20Documents/Software/an200.pdf

      • 为什么我在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