查看: 419|回复: 15

随便来一个芯片,来跟我移植Arduino

[复制链接]

该用户从未签到

发表于 2019-1-11 11:21 | 显示全部楼层 |阅读模式
本帖最后由 TOMATO-ZLM 于 2019-1-11 12:19 编辑

      一直以来挺喜欢Arduino的,也非常佩服国外老师的技术以及开源精神。非常可惜的事情是我没有拿
Arduino来做过东西,挺对不起她。今天我就来拿STM8S103F3芯片来移植Arduino,也算是一种情怀。

      平台
      硬件:STM8S103F3
      开发环境:STVD+COSMIC(免费软件)
      作者:TOMATO

先来看张图后面再来慢慢唠叨吧。这是我直接复制Arduino的示例文件来运行的。
微信图片_20190111110411.png


Arduino安装完后的,我们可以找到这个路径\hardware\arduino\avr\cores\arduino
此文件夹内部为Arduino的核心软件文件。这里我们仅仅移植IO口的读写作为示例讲解

1.Arduino.h            ------核心h文件,必须
2.binary.h               ------核心h文件,建议包含
3.main.c                  -------核心,入口函数
4.wiring.c                -------核心,延时函数delay
5.wring_digtial.c      -----核心,数字端口读写
6.wring_private.h      -----核心h文件
此文件夹的文件为Arduino的端口索引表   \hardware\arduino\avr\variants\standard

我们把这些个文件拷贝过来。我们对6个文件进行小部分修改。Arduino的本质是AVR单片机
而我们的是STM8单片机,因此底层需要做部分的修改

第1章  修改Arduino.h文件
修改一下中断的开关函数
#define interrupts() _asm("RIM")
#define noInterrupts() _asm("SIM")


AVR的Makefile定义了F_CPU的频率,如UNO是16MHZ,但是我们的芯片没有定义,为此
我们来定义一个主频

#define F_CPU   8000000UL

关于avr-libc的nop函数,我们STM8是需要修改的。为什么?因为编译器和指令均不同
#ifndef _NOP
#define _NOP() do { _asm("nop"); } while (0)
#endif
注释掉此行代码
//int atexit(void (*func)()) __attribute__((weak));

其他的涉及到AVR底层的代码可删除可保留,因为为预编译,一般也编译不到。不过建议删除
无效代码

第2章  修改pins_arduino.h和pins_arduino.c文件

       这章节比较重要了,是Arduino用来管理的pin脚的文件,每一个型号的Arduino均有
一个与之对应的文件,我们需要重点修改。
       基本的思想为,通过一个pin脚要能找出与之对应的管脚,例如我们STM的1脚为PD5
那么我们通过1就需要索引到PD5以及对应的GPIO口的寄存器

Arduino主要是通过这7个宏定义来导出对应的端口以及相关的寄存器,下面为我为STM8稍
做修改后的定义。
#define digitalPinToPort(P) ( ( digital_pin_to_port_PGM [P] ) )
#define digitalPinToBitMask(P) ( ( digital_pin_to_bit_mask_PGM[P] ) )
#define digitalPinToTimer(P) ( ( digital_pin_to_timer_PGM + (P) ) )
#define analogInPinToBit(P) (P)
#define portOutputRegister(P) ( (volatile uint8_t *)( ( port_to_output_PGM[P])) )
#define portInputRegister(P) ( (volatile uint8_t *)( ( port_to_input_PGM[P])) )
#define portModeRegister(P) ( (volatile uint8_t *)( ( port_to_mode_PGM[P])) )


我只将其中的一个为例,pin导出对应的mask。例如PD5 就应该导出 00010000这个值
或者16进制0x10;

AVR可以用_BV()进行位操作,但是我们的STM8所带库并不支持。没关系,我们可以来
宏定义一个。
#define _BV(N)      (uint8_t)(1<<N)  
好了,我们定义好_BV后就可以来定义索引表了。例如pin脚1就能导出mask值_BV(5)即为0x10。
const uint8_t  digital_pin_to_bit_mask_PGM[] = {
    _BV(0), /* 0, port D */
        _BV(4), /* 0, port D */
        _BV(5),
        _BV(6),
        _BV(0),
        _BV(1),
        _BV(2),
        _BV(0),
        _BV(0),
        _BV(0), /* 8, port B */
        _BV(3),
        _BV(5),
        _BV(4),
        _BV(3),
        _BV(4),
        _BV(5), /* 14, port C */
        _BV(6),
        _BV(7),
        _BV(1),
        _BV(2),
        _BV(3),
};



明天继续吧,大家有喜欢的我就继续更新吧。


打赏作者鼓励一下!
  • TA的每日心情
    奋斗
    2018-12-6 11:03
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    发表于 2019-1-11 11:40 | 显示全部楼层
    高端话题,继续!
  • TA的每日心情
    无聊
    2019-1-7 14:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 11:43 | 显示全部楼层
    中午,喝点,移植代码将更飘逸。。。

    该用户从未签到

     楼主| 发表于 2019-1-11 12:22 | 显示全部楼层
    lxw1997 发表于 2019-1-11 11:40
    高端话题,继续!

    精力有限,我抽空写吧
    打赏作者鼓励一下!
  • TA的每日心情
    无聊
    2018-7-17 17:38
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 15:07 | 显示全部楼层
    本帖最后由 brucewoo 于 2019-1-11 15:08 编辑

    可以参考一下 github上的 STM32duino,这是老外的。另外还有一个是国人写的: https://github.com/FASTSHIFT/Arduino-For-Keil
  • TA的每日心情
    开心
    2019-1-18 11:50
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 16:14 | 显示全部楼层
    厉害了楼主,赞一个
  • TA的每日心情
    开心
    2019-1-18 11:50
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 16:17 | 显示全部楼层
    我们有颗国产32位MCU芯片正在做移植,有兴趣的话可以入qq群:533680064
  • TA的每日心情
    无聊
    2018-7-17 17:38
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 16:56 | 显示全部楼层
    ghzhao 发表于 2019-1-11 16:17
    我们有颗国产32位MCU芯片正在做移植,有兴趣的话可以入qq群:533680064

    GD32吗?
  • TA的每日心情
    开心
    2019-1-18 11:50
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 17:01 | 显示全部楼层

    是我们公司自己的产品,士兰 SC32F58128。相关信息可以从 https://pan.baidu.com/s/10Hi9TrtHXDj3Ua2-R2tdHw 获取。有兴趣玩的话,进QQ群可以获取开发板哦。
  • TA的每日心情
    无聊
    2018-7-17 17:38
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 19:03 | 显示全部楼层
    ghzhao 发表于 2019-1-11 17:01
    是我们公司自己的产品,士兰 SC32F58128。相关信息可以从 https://pan.baidu.com/s/10Hi9TrtHXDj3Ua2-R2t ...

    先谢谢了,不过现在没这个精力。
    目前还在用STM32F103做产品,下一步还要上手F4系列。只能精神上支持。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    游戏机和开发板脑洞一下;这个本来就是开源的。
    游戏机和开发板脑洞一下;
    这个开发板和标准UNO是1;1的;通用。做在一起是因为可以不用游戏机时可以切换回来做开
    新人求助,关于舵机和限位开关。
    新人求助,关于舵机和限位
    新人求助社区各位哥哥姐姐,具体需要用航模遥控器的3段开关控制Arduino nano控制一个3
    基于MWC开源飞控DIY关键总结分享:
    基于MWC开源飞控DIY关键总
    很早就已经很想写这么一个帖,但总是由于各种原因没能落实,但最后还是找了时
    有关函数返回值的问题
    有关函数返回值的问题
    求助大神们,这个程序中有return返回值,但为什么有这个“ warning: return-statement
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表