使用sdcc开发stm8项目

2020-03-11 19:37发布

准备工作:
编译器sdcc,在 http://sdcc.sourceforge.net/ 下载
学习sdcc的好处:
1、开源编译器,我用了10年了。
2、热门核基本都支持,其中包括51,pic,stm8。像低成本的国产stc,国产pic克隆核都能用,只用装一套软件。对于使用fpga软核的人,基本都是热门软核。

666.jpg



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

 

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
叶春勇
2020-03-12 07:52

三、点亮LED
很遗憾,你使用了开源系统。没有相关设备的寄存器文件,类似51系统的,8051.h reg51.h
这需要我们自己去建立。当然也可以去github里去翻翻别人怎么去弄得。
先翻翻stm8s103f3p6的datasheet
333.jpg

定义一个外设寄存器,这是用c语言指针的方法。

#define PB_ODR *(volatile unsigned char *)0x5005
当然在sdcc中,有自己的定义方式
typedef struct {
        uint8_t odr;
        uint8_t idr;
        uint8_t ddr;
        uint8_t cr1;
        uint8_t cr2;
}GPIO_TYPEDEF;

GPIO_TYPEDEF __at (0x5005) pb;
unsigned char  __at (0x5000) PB_ODR;
就是用 __at 来定义绝对地址。

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

444.jpg

#include
#define setbit(x,n) ((x)|=(1<<(n)));
#define rstbit(x,n) ((x)&=~(1<<(n)));
#define CLK_CKDIVR        *(volatile unsigned char *)0x50C6  //定义方式1
typedef struct {
    uint8_t odr;
    uint8_t idr;
    uint8_t ddr;
    uint8_t cr1;
    uint8_t cr2;
}GPIO_TYPEDEF;
GPIO_TYPEDEF __at (0x5005) pb;  //定义方式2
uint8_t __at (0x5005) PB_ODR;   //定义方式3

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

void main( void)
{
    CLK_CKDIVR = 0;  //16MHz
    setbit(pb.ddr,5);//设置pb5为输出
    setbit(pb.cr1,5);//设置pb5为推挽输出,实际不存在:)
    while(1)
    {
         setbit(pb.odr,5); //高电平灭
         delay(100000L);
         rstbit(pb.odr,5); //低电平亮
         delay(300000L);
    }
}






一周热门 更多>