使用sdcc开发stm8项目

[复制链接]
4415|18
 楼主| 叶春勇 发表于 2019-10-27 09:59 | 显示全部楼层 |阅读模式
准备工作:
编译器sdcc,在 http://sdcc.sourceforge.net/ 下载
学习sdcc的好处:
1、开源编译器,我用了10年了。
2、热门核基本都支持,其中包括51,pic,stm8。像低成本的国产stc,国产pic克隆核都能用,只用装一套软件。对于使用fpga软核的人,基本都是热门软核。

3、编译器+notepad+makefile的方式,电脑少装很多东西。减少垃圾。:)
缺点:
1、调试稍麻烦。对于使用串口调试可忽略。
2、有点硬核,刚开始丢掉ide,的确有点难受
3、经比较,sdcc代码比keilc51,iar for stm8 略大些。

本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2019-10-27 10:00 | 显示全部楼层
本帖最后由 叶春勇 于 2019-10-27 10:04 编辑

一、sdcc的安装
安装成功后,进入cmd

输入:
sdcc -v

代表安装成功。

本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2019-10-27 10:11 | 显示全部楼层
二、第一个程序
  1. void main( void)
  2. {
  3.         while(1)
  4.         {
  5.         }
  6. }

在windows cmd框中输入:
  1. sdcc -mstm8  main.c

生成hex的方法:
  1. packihx main.ihx >main.hex




本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2019-10-27 10:37 | 显示全部楼层
三、点亮LED
很遗憾,你使用了开源系统。没有相关设备的寄存器文件,类似51系统的,8051.h reg51.h
这需要我们自己去建立。当然也可以去github里去翻翻别人怎么去弄得。
先翻翻stm8s103f3p6的datasheet

定义一个外设寄存器,这是用c语言指针的方法。
  1. #define PB_ODR *(volatile unsigned char *)0x5005
当然在sdcc中,有自己的定义方式
  1. typedef struct {
  2.         uint8_t odr;
  3.         uint8_t idr;
  4.         uint8_t ddr;
  5.         uint8_t cr1;
  6.         uint8_t cr2;
  7. }GPIO_TYPEDEF;

  8. GPIO_TYPEDEF __at (0x5005) pb;
  9. unsigned char  __at (0x5000) PB_ODR;

就是用 __at 来定义绝对地址。

我调试的用stm8 最小系统板,led在pb5



  1. #include<stdint.h>
  2. #define setbit(x,n) ((x)|=(1<<(n)));
  3. #define rstbit(x,n) ((x)&=~(1<<(n)));
  4. #define CLK_CKDIVR        *(volatile unsigned char *)0x50C6  //定义方式1
  5. typedef struct {
  6.     uint8_t odr;
  7.     uint8_t idr;
  8.     uint8_t ddr;
  9.     uint8_t cr1;
  10.     uint8_t cr2;
  11. }GPIO_TYPEDEF;
  12. GPIO_TYPEDEF __at (0x5005) pb;  //定义方式2
  13. uint8_t __at (0x5005) PB_ODR;   //定义方式3

  14. void delay(unsigned long count) {
  15.     while (count--)
  16.         __asm__("nop");//sdcc内嵌入汇编
  17. }

  18. void main( void)
  19. {
  20.     CLK_CKDIVR = 0;  //16MHz
  21.     setbit(pb.ddr,5);//设置pb5为输出
  22.     setbit(pb.cr1,5);//设置pb5为推挽输出,实际不存在:)
  23.     while(1)
  24.     {
  25.          setbit(pb.odr,5); //高电平灭
  26.          delay(100000L);
  27.          rstbit(pb.odr,5); //低电平亮
  28.          delay(300000L);
  29.     }
  30. }







本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2019-10-27 10:47 | 显示全部楼层
四、SDCC关于stm8其他语法
1、中断
先翻datasheet


中断的定义如下 采用__interrupt (x)  其中与iar stm8 区别的是不用+2。
  1. void TIM4_OVF_IRQHandler(void) __interrupt (23)
  2. {
  3.     TIM4_SR=0;;  //清除中断标志位 该位由软件清零
  4.     flag=1;
  5. }
2、内联汇编

  1. __asm__("nop");//推荐
大段汇编
  1. __asm
  2. label:
  3.       nop
  4. __endasm;






本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2019-10-27 11:00 | 显示全部楼层
五、sdcc 常用命令
1、查看c语言生产的汇编
  1. sdcc -mstm8 -S -c main.c -o main.asm
  1. _main:
  2. ;        main.c: 23: CLK_CKDIVR = 0;  //16MHz
  3.         mov        0x50c6+0, #0x00
  4. ;        main.c: 24: setbit(pb.ddr,5);//设置pb5为输出
  5.         ld        a, _pb+2
  6.         or        a, #0x20
  7.         ld        _pb+2, a
  8. ;        main.c: 25: setbit(pb.cr1,5);//设置pb5为推挽输出,实际不存在:)
  9.         ld        a, _pb+3
  10.         or        a, #0x20
  11.         ld        _pb+3, a
  12. ;        main.c: 26: while(1)
  13. 00102$:
  14. ;        main.c: 28: setbit(pb.odr,5); //高电平灭
  15.         ld        a, _pb+0
  16.         or        a, #0x20
  17.         ld        _pb+0, a
  18. ;        main.c: 29: delay(100000L);
  19.         push        #0xa0
  20.         push        #0x86
  21.         push        #0x01
  22.         push        #0x00
  23.         call        _delay
  24.         addw        sp, #4
  25. ;        main.c: 30: rstbit(pb.odr,5); //低电平亮
  26.         ld        a, _pb+0
  27.         and        a, #0xdf
  28.         ld        _pb+0, a
  29. ;        main.c: 31: delay(300000L);
  30.         push        #0xe0
  31.         push        #0x93
  32.         push        #0x04
  33.         push        #0x00
  34.         call        _delay
  35.         addw        sp, #4
  36.         jra        00102$
  37. ;        main.c: 33: }
  38.         ret



2、查看flash使用情况
查看自动生成的.map文件,包括内存和flash使用。其中flash主要看code段


本帖子中包含更多资源

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

×
airwill 发表于 2019-10-28 22:37 | 显示全部楼层
我曾经对比过51编译效果,性能和空间上, SDCC 都是弱点
zeshoufx 发表于 2019-10-28 22:58 | 显示全部楼层
谢谢分享,,,,,,,,,,,
 楼主| 叶春勇 发表于 2019-10-29 08:07 | 显示全部楼层
airwill 发表于 2019-10-28 22:37
我曾经对比过51编译效果,性能和空间上, SDCC 都是弱点


在stm8上,sdcc有高人,现在敢说fastest了。
至于51,keil c51 是最好的。
sdcc 有--opt-code-size和--opt-code-speed 还有一些内存规模的选项,要在选项一致的时候比较。

本帖子中包含更多资源

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

×
airwill 发表于 2019-10-29 21:20 | 显示全部楼层
嗯, 从这图看, 表现不错嘛
pq113_6 发表于 2019-10-30 09:51 | 显示全部楼层
 楼主| 叶春勇 发表于 2019-10-30 10:05 | 显示全部楼层
airwill 发表于 2019-10-29 21:20
嗯, 从这图看, 表现不错嘛

sdcc浮点库垃圾,倒数第一。其他整数,字符串,基本都是第一。
yiy 发表于 2019-12-6 18:47 | 显示全部楼层
应该可以直接用官方的头文件的。
yiy 发表于 2019-12-6 18:47 | 显示全部楼层
我试过了可以用官方的头文件。。
liangbowen 发表于 2019-12-17 00:36 | 显示全部楼层
sdcc在sf.net上的最新版本我看了才3.9.0,你的却是3.9.1,你是怎么做到的?
wdliming 发表于 2020-6-11 16:23 | 显示全部楼层
请问这个编译器,能编译合泰,义隆单片机吗?
 楼主| 叶春勇 发表于 2020-6-11 16:37 | 显示全部楼层
wdliming 发表于 2020-6-11 16:23
请问这个编译器,能编译合泰,义隆单片机吗?

不能。
合泰目前有c编译器。
义隆的没有搞过,不太清楚。
wdliming 发表于 2020-6-11 17:25 | 显示全部楼层
叶春勇 发表于 2020-6-11 16:37
不能。
合泰目前有c编译器。
义隆的没有搞过,不太清楚。

好的谢谢,答复好快,下午都在看你 的帖子
pq113_6 发表于 2020-6-12 07:52 来自手机 | 显示全部楼层
ide可以选择已经停更的周立功的那个ide,对比eclipse比较符合keil的使用习惯
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝
快速回复 在线客服 返回列表 返回顶部