数码之家

 找回密码
 立即注册
搜索
查看: 31252|回复: 209

[Arduino] Arduino for C51 正式开源发布(一) 快速启动指南

    [复制链接]
发表于 2019-7-30 09:02:59 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第一部分:安装及快速启动


    1.已安装arduno IDE,直接至步2,否则在arduino管网上下载最新arduino ide,并安装且能正确运行无误;
    2.在我共享给坛友的百度网盘上下载:read.txt 文件,这是一个包含最新内容的说明文档,如和本文不一致,以该文档为准;阅后下载压缩包:sduino.rar;
    3.打开sduino.rar, 将压缩包中sduino文件夹拖放到 arduino->hardware 文件夹中; 该包含已mcs51 系列 arduino core 和 更新到最新版本的stm8  支持;如有老的stm8 sduino 则先删除旧版本;(按下图操作)
    sduino.jpg

   4.如已经安装过我EFM32/STM32/LM3S/NUVOTON ARM 版本的坛友可跳过以下 5 部分,直接第6步;否则下载另一个包:tools.rar
   5.tools.rar 包含了stlink/和nulink ice命令行版本,前者用于 stm8,后者用于 n76e003和ML51的上传;由于这些工具是和arm core共享的,因此也需将包中 tools文件夹拖放到 arduino->hardware 文件夹中:
tools.jpg

   6.再次运行arduino,应该能看到支持的mcs51系列芯片和stm8芯片的选择菜单;
   7.其它:请关注SDCC 官网:http://sdcc.sourceforge.net/  发布的最新版本,下载后解压,并替换 arduino/hardware/sduino/tools/sdcc 同名全部内容,当前已经是最新版本 build 3.9.0



第二部分:工具菜单选项:


一/二、选择目标板子和芯片:

    1.Board(系列):
board.jpg

    2.Processor(板/处理器) :
process.jpg

      首先选择系列(Board),接着理器(Processor) 中选择对应系列的芯片/板子,如 Nuvoton ML51 系列 / NuMaker_ML51PC 板(芯片)
    当前已支持并加入菜单的芯片系列如下:
          NUVOTON :N76E003
                             ML51PC/D
         STC:             STC8A/F
                                STC12C5A/LE5A
                                STC12C56/54/STC12LE56/54
                                STC15F/L/W
                                STC89CxRC/RD+
          SILICON: C8051Fxxx
          AT     : AT89C51/52
         
      以后还会增加更多的芯片如:
          TI CC1110/2430/2510/2530
          CY7C68XXX
         


三、确定时钟源及频率:

    3.Clock source(时钟源):
    4.OSC  Speed(晶振频率):
    5.CPU Speed(CPU速度)
osc.jpg

     必须选择正确的时钟源和CPU速度,这影响到通信速率如 uart/spi/iic和定时器的准确度,也影响PWM的频率;
      时钟源有内部RC振荡器和外部晶振(如有可选用),如果你板子上的的外部晶振和菜单上显示的不一致,可修改boards.txt 文件;
      STC内部RC频率注意,这个频率值一定要和STC_ISP下载时选择的参数一致,并且点上[在程序区的结束处添加重要测试参数];
     不同板子这些菜单选项项目数和内容有所不同。


四、确定代码的内存模式:

    6.Mode(内存模式): 生成的代码可选以下三个模式之一:small/medium/large;
mode.jpg

    补充下知识:内存模式决定了未明确指定存储类型的变量放在何处的缺省存储区域,其中small 都放在idata,medium为pdata(1 页),而large则为xdata,因此当在small模式下编译出现超内存错误的情形可以试试large模式,或将比较大的数组指定使用外部存储器__xdata;



五、需要连接的整数运算库:

    7.Link libs:
linklib.jpg

        SDCC 对于整数运算,分别提供了int/long/long_long三个库,对应的是 16/32/64 位整数运算,菜单提供了两个选项,即:



         全部   int+long+long_long 支持 全部整数运行,long_long模式既耗费时间也耗费内存资源;
         和部分 int+long, 仅支持 8/16/32 整数运算,因为大多数应用不会用到8字节64整数运算,可节约内存;


六、浮点运算:

   8.float lib:
float.jpg

   SDCC51 将浮点运算放在一个单独的库中,因此,我们用到浮点运算,就需要连接该库;浮点运算和64位整数运算一样耗费较多的机时和内存资源,因此提供该选项;
   64 位 long_long int 整数运算库和float 浮点运算库sdcc都是独立的库,这样我们可以决定是否连接,这取决于我们是否用到了这些运算功能,不使用可节约内存。

七、串口选择:

   9.Serial communication: 许多芯片有多个串口及不同的波特率生成方式,可供选择,同时,应用中如同时需用到定时器,则需要注意不要引起资源冲突;
serial.jpg

八、 printf 使用:

   10.printf use
printf.jpg
     由于SDCC不支持C++,因此SDUINO采用了一组系列函数来代替arduino的 Serial.print() 和 Serial.println(),我不喜欢这样,增加了对标准printf的支持,相信大家都会用,不用去了解这一组函数 :
     Serial_print_xx() 和 Serial.println_xx(), 直接用C标准库函数printf,或 arduino 方式 Serial.printf;但SDCC并未全部支持全部格式输出,提供了不同的库函数来支持,它们分别是:
     printf/printf_fast/printf_fast_f/printf_small/printf_tiny/来兼顾 需要内存开销
     因此我这里也提供这样的选项,来指定 Serial.printf调用那个函数;auto 选项则根据 8 是否连接浮点库来缺省选择printf_fast_f/printf_fast
     该选项不影响库 printf/printf_fast/printf_fast_f/printf_small/printf_tiny/及 Sduino  Serial_print_xx() 和 Serial_println_xx()的使用;

九、供电电压:

   11.VCC volts:51 芯片有不同的供电电压,这对生成代码没有影响,但如果我们在ADC中采用VCC为参考电压,则需要提供该电压值,这里提供了宏定义 POWER_VCC 的毫伏值来供应用程序使用,缺省值是定义在pins_arduino.h中;
     系统中并未用到该定义,


十、上传更新方法:

   12.upload methed: 51 不同系列的芯片采用不同的flash上传方法,如 Nuvoton可以用 ice 或 串口bootload,而 stc 则用 stcisp/stc_isp(IDE),这部分最最复杂的,因为不同的mcu上传方法接口都不同,而且需要使用命令行版本;因此仍然需要不断完善;
upload.jpg




十一、当前选项摘要:

上述选项,都会在底部状态行上显示选项的摘要:
info2.jpg

编译一个空的 sketch,如能看到这样的编译信息,则恭喜你,安装启动成功!

下一步,我们就可以点灯试试了,  内容较多,只能边写,边完善,敬请谅解和等待!
百度网盘:https://pan.baidu.com/s/1i48rVNJ


next

打赏

参与人数 25家元 +451 收起 理由
信徒1102 + 2 優秀文章
llcc + 20
eros8269 + 20
人艰不拆了 + 20
wpppmlah + 10 優秀文章
liaozheny + 20 優秀文章
jf201006 + 18 謝謝分享
杨雪飞 + 20 这个才是真正的技术贴
jtcat + 15 優秀文章
沙漠臭屁虫 + 16

查看全部打赏

 楼主| 发表于 2019-7-31 23:57:39 | 显示全部楼层
本帖最后由 huaweiwx 于 2019-8-1 16:50 编辑

第三部分:引脚编号, arduino for 51 采用格式为 Pa_b,其中 a是端口号,b 是bit位号,如 P0_1

arduino 采用对全部引脚按 序数 1,2,3,....这样的方式,优点是封装端口及bit位,让使用者在应用层面和硬件层作了隔离,应用时可以不管端口和位,但缺点是明显的:
1 需要保存一个数字(脚号)和对应实际端口的对照表,这样既要多开销存储空间,也要多开销查表所需的机器时间,而且对我们学习者来说有时想知道是那个端口和bit还需要查相应的文档,最为致命的是不同的板子对同一个脚还编号是不同的。
2 对于arduino官方板子来说,这样的方法还算可行,已经把这个编号标在板子上了,但对非官方板子来说,这简直是多此一举,毫无意义,因为我们板子上根本没有1,2,3,....,到是有着PA0,PC13这样好记又有具体含义的名称,在51中,通常对于一个具体的引脚我们表示为 Pa.b,a为端口号,b为bit位号, 如:
P0.1  表示 P0端口bit1脚;
在 51 构架中,该脚是可位寻址读写的,因此,头文件中通常对该脚通过类型修饰符sbit进行了定义:
sbit  P01 =  P0^1;  // 规则1   Pab
这里 P01 也可以用其他合法的符号,如我们也可以定义为:
sbit P0_1 = P0^1;  //规则2   Pa_b
这里 a 是端口号,51 构架通常用 0,1,2 数字来表示,而 avr stm等 则用 A,B,C 这样的字母来表示;
       b 是位号 0~7 对应 8位端口的最低位至最高位;
大多数芯片厂给出的头文件是以上述规则1来命名,但也有些厂商采用的是规则2 如 silicon的 C8051 头文件,对于这样的不同规则,在我们这个sduino51 系统中必须统一,否则会造成混乱,因此我采用了规则1 来定义位寻址变量,所以对所有C8051头文件均作了这样的替换(C8051老用户要注意);

现在,在arduino for 51 所有gpio sbit 的脚名称 均统一 用 Pab来表示,51 相对 avr 和 stm8/32来说都要简单,读写访问的是同一个地址, 我们仍然能够用这样的语句来设置该脚的电平高低,如程序中可用:

P01 = 1;    // set P0.1
P01 = 0;    //reset P0.1
而读取电平是
v  = P01; //get P0.1  level

因此 Pab 是系统 sbit类型的变量名称,而arduino脚号则是一个数字序数,因此我们仍需要对此定义,为了好记,我们采用这样的表示:
Pa_b;
对应上面P0.1脚,系统有这样的宏定义:
#define  P0_1    0x01  /*端口号对应的hex 数字,是不是很好记*/
对于每个芯片(板子)都有一个定义文件pins_arduino.h ,位置在 variants对应的文件夹中。
我没有像 官方arduino那样从0开始连续编号,而是用个8位整数类 uint8_t,  其高4位表示端口号 低4位表示位号(由于只有8位,实际只用低3位),显然,这样有以下好处:
1 不需要专门设置个对照表来建立 数字 0, 1,2,3,....所对应的物理引脚了,编程时 我们一眼就能判断出端口和bit位;在程序中我们只要通过:
    pin & 0x0f  屏蔽高4位,就知道是那个bit了;而
    pin >> 4;  取高4位,就是端口号;

2 按这个方案 只要未定义 P0_1 (如STC12C54), 程序编译时 用到这个符号就会发出错误信息,因此我们还可简化非法引脚编号的检查,对51资源不足的芯片上,减少了代码开销是有实际意义的;

上面出现三种格式,分别是用P0.1 / P01  /P0_1 这样的格式来表示,对于初学者来说,也许有点混乱,有必要对此做个小结:
第一个 P0.1  因为对C的变量符号来说,符号中含小数点是非法的;因此这通常只有出现在数据表文档或程序注释中;
第二个 P01   是一个 51 专有的预定义sbit类型变量,实际上代表了该位寻址的地址;
第二个 P0_1  才是arduino系统预定义该引脚的arduino编号(可以是C变量或宏定义),是个8位整数类型(uint8_t)常数;
尽管这三个助记符对我们来说都表示了端口 0 的bit1 位,但系统中只出现后两种,并且含义是不同的:具体在对应在宏/函数中用到它,如果是sfr/sbit类型,就用 P01,而如果需要的是一个数表示arduino脚号,则用P0_1;


第四部份   SDUINO 系统简介:
一、 语言和工具链
  现有所有arduino ide 支持的移植版本均采用了支持 C++ 的工具链如 GCC ,对51这个古老的构架,根本不在GCC 开发者的支持计划中,虽然 IAR 集成环境支持 51 C++代码,但也只是有限支持,我试过,IAR 连接时只能选 c库,如选择 连接 c++库会出现找不倒库文件的错误提示,因此支持有限,更主要的问题是
  a.  IAR 不是免费的;
  b.  IAR 是集成环境,不支持命令行操作;
  上述两点导致我们没有现成的C++工具链来支持 arduino ide 环境;
  因此我们退一步,采用有个专门针对小设备 c 的开源工具链  SDCC ,支持 stm8/mcs 51/ pic/z80,通过一些小技巧集成到arduino ide中;正因为如此,sduino和 arduino由于采用编程语言不同,而导致使用上的差异;

二、 sdcc 和 gcc 及 keil c51 的主要差异:
  sdcc 是个优秀的编译器,支持到最新的ISO C17标准,因此,基本兼容于keil C51,c风格也基本兼容于GCC;但针对目标mcu为51的应用和keil C51仍然有些差异,主要是:

  a.指定不同内存区域的修饰词,sdcc 需加双下划线:                     
            keil          idata                    
                          pdata                    
                          xdata                    
                           code                    
                             bit           

        sdcc                 __idata                           
                         __pdata                          
                            __xdata                                 
                                __code                           
                                __bit                          

  b.修饰词位置:sdcc则需要将修饰词前置
          keil              uint8_t  xdata  val;
          sdcc              xdata  uint8_t  val;
  c.sfr寄存器寻址变量/sbit位寻址变量定义格式不同:
          keil              sfr     P0  = 0x80;
                            sbit    P01 = P0^1;

          sdcc           __sfr   __at(0x80)   P0;
                           __sbit  __at(0x80+1) P01;
  d.中断矢量定义格式不同:
          keil             void name(void)  interrupt vector;
                           void name(void)  interrupt vector   using regnum;
          sdcc            void name(void) __interrupt(vector);
                           void name(void) __interrupt(vector) __using (regnum);
          另外,中断处理代码函数必须在main.c 声明,否则不会被连接!

三、 sdcc 和 arduino 官方采用的gcc差异,这两个编译器针对的目标不同,功能也相差太大不是一个数量级的,因此放在一起比较是不合适的,但如果仅从C角度来看,差异并不大,但gcc支持C++代码,而arduino 核心部分就是用C++写成的,因此这部分在sduino中无法实现或是只能有限部分实现,核心(core)部分主要是:
   1 String 类:    这是通用arduino 字符串支持C++类,sduino不支持,替代方案是用c方法来处理字符串,如用c vprintf 来格式化字符串,用printf来格式化并输出字符串;
   2 Stream/Print:  输入输出IO流控制,不支持,好在对51来说,人机接口和文件处理不是主要的,
   3 HardwareSerial/Serial: 这是串口输出,也是玩单片机最重要的部分,用来观察运行结果或输入指令数据控制单片机运行,但arduino该模块是C++写成的类结构,并且继承了Stream/Print基础类,因此是移植的难点,现在采用部分兼容和替代方案;C++支持同一函数的不同类型和数量的参数,但在C是不合法的;因此原来arduino:
     Serial.print(x,x) 及Serial.println(x,x) 使用了一组函数替代,它们是:
                Serial_print_s
                Serial_print_sn
                Serial_print_i
                Serial_print_u
                Serial_print_ib
                Serial_print_ub
                Serial_print_fd
                和
                Serial_println_s
                Serial_println_sn
                Serial_println_i
                Serial_println_u
                Serial_println_ib
                Serial_println_ub
                Serial_println_fd

        另外干脆直接用c标准输出输入库(stdio)的 printf含数;
        为了便于移植及和其他核心的arduino 应用代码兼容,对Serial 增加了一个运行代码的指针结构,从而使其具有arduino的风格(style),为了不至于耗费过多的资源,仅包含:
        Serial.avalible();
        Serial.read();
        Serial.write(unsigned char);
        Serial.printf(fmt,...);
        其中 Serial.printf(fmt,...)等价于直接调用printf(fmt,...);用来替代arduino Serial.print() 和 Serial.println();
               
    4 arduino 库:
   和内核一样,由于大部分arduino库都是由C++写成,因此基本不能直接使用,但只要不是反复建立在C++类基础上的库,还是可以很方便地移植到sduino,其中libraries有多个这方面的例子;以后我会祥述,并移植一些;

    5 实际上用C语言为SDUINO写成的库,只要不要硬件依赖的,都可以在ARDUINO/gcc下运行,反之则不行!











打赏

参与人数 2家元 +40 收起 理由
人艰不拆了 + 20
杨雪飞 + 20

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2019-7-30 11:00:28 | 显示全部楼层
这真是太好了,一直对STC很有好感,简单,好用,不贵。

如果用STC8A的画,arduino的标准库有哪些支持的?
回复 支持 2 反对 0

使用道具 举报

发表于 2019-7-30 14:21:54 | 显示全部楼层
支持楼主,赞一个
回复 支持 反对

使用道具 举报

发表于 2019-7-30 14:23:08 | 显示全部楼层
强烈支持楼主的无私奉献。
回复 支持 反对

使用道具 举报

发表于 2019-7-30 14:55:36 来自手机浏览器 | 显示全部楼层
感谢楼主的无私奉献!
回复 支持 反对

使用道具 举报

发表于 2019-7-30 19:09:04 | 显示全部楼层
来了来了,支持一下
回复 支持 反对

使用道具 举报

发表于 2019-7-30 20:30:24 | 显示全部楼层
哈,一上论坛就看到好东西:lol:
回复 支持 反对

使用道具 举报

发表于 2019-7-30 21:08:39 | 显示全部楼层
强烈支持楼主的无私奉献,希望自己将来也能为这个包贡献点力量。
回复 支持 反对

使用道具 举报

发表于 2019-7-30 23:10:53 | 显示全部楼层
好贴,强技术.必须顶上去.楼主是arduino软件顶级高手,有机会必须向您学习.
回复 支持 反对

使用道具 举报

发表于 2019-7-31 00:21:57 | 显示全部楼层
好贴,强贴,关注楼主arduino相关的贴子好久,必须顶上去.楼主是这个软件的高手.有机会一定向您学习.
回复 支持 反对

使用道具 举报

发表于 2019-7-31 09:53:26 | 显示全部楼层
arduino达人,顶一个!
回复 支持 反对

使用道具 举报

发表于 2019-7-31 16:50:36 | 显示全部楼层
支持楼主无私奉献
回复 支持 反对

使用道具 举报

发表于 2019-7-31 20:20:21 | 显示全部楼层
谢谢分享。一直玩51单片机,都是C语言的,换个玩法看看?
回复 支持 反对

使用道具 举报

发表于 2019-7-31 20:24:54 | 显示全部楼层
先围观大佬,求带萌新
回复 支持 反对

使用道具 举报

发表于 2019-7-31 20:57:23 | 显示全部楼层
本帖最后由 kkstun 于 2019-7-31 21:03 编辑

这么厉害。我看还支持N76E003。还支持stc8。
回复 支持 反对

使用道具 举报

发表于 2019-7-31 21:04:26 | 显示全部楼层
不知能否放github上 大家共同研究呢

点评

现在是测试阶段,基本排除错误后,会上传到 github.  详情 回复 发表于 2019-7-31 21:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 21:15:01 | 显示全部楼层
kkstun 发表于 2019-7-31 21:04
不知能否放github上 大家共同研究呢

现在是测试阶段,基本排除错误后,会上传到 github.
回复 支持 反对

使用道具 举报

发表于 2019-8-1 15:30:56 | 显示全部楼层
这个必须要支持一下,现在常见的esp系列,STM系列,都可以用arduino,太方便了
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-1 18:19:42 | 显示全部楼层
楼主超级强大,51用上ARDUINO将会如虎添翼,加大51的用量,对我们软件小白是大大的好事
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 04:22 , Processed in 0.171600 second(s), 20 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表