数码之家

 找回密码
 立即注册
搜索
查看: 4076|回复: 7

[STM] 求助 STM8用STVD的编译报错!

[复制链接]
发表于 2019-7-15 12:40:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zjhchp 于 2019-7-16 07:11 编辑

网上下的别人打包的程序,STM8用STVD的编译报错!请高手指点一下,如何报错,如何修改,谢谢!

{A8BD7076-A687-4D5C-9F55-2B3F9F4426FD}_20190715123702.jpg

----------- Project 12864-7675 - STM8 Cosmic - Configuration Debug -------------

Compiling main.c...
cxstm8 -i"..\..\..\..\program files (x86)\cosmic\cxstm8\hstm8" +debug -pxp -no -l +mods0 -pp -i"C:\Program Files (x86)\COSMIC\Hstm8"  -clDebug\ -coDebug\ main.c
#error cpstm8 ST7565_12864.h:89(4+11) PC_ODR_ODR5 undefined
#error cpstm8 ST7565_12864.h:90(4+11) PC_ODR_ODR7 undefined
#error cpstm8 ST7565_12864.h:91(4+11) PC_ODR_ODR4 undefined
#error cpstm8 ST7565_12864.h:96(12+11) PC_ODR_ODR6 undefined
#error cpstm8 ST7565_12864.h:109(4+11) PC_ODR_ODR5 undefined
#error cpstm8 ST7565_12864.h:110(4+11) PC_ODR_ODR7 undefined
#error cpstm8 ST7565_12864.h:111(4+11) PC_ODR_ODR4 undefined
#error cpstm8 ST7565_12864.h:116(12+11) PC_ODR_ODR6 undefined
#error cpstm8 ST7565_12864.h:155(4+11) PC_ODR_ODR3 undefined
#error cpstm8 main.c:163(6+11) PA_IDR_IDR3 undefined
#error cpstm8 main.c:190(6+11) PA_IDR_IDR3 undefined
#error cpstm8 main.c:214(6+11) PA_IDR_IDR3 undefined
#error cpstm8 main.c:240(6+11) PA_IDR_IDR3 undefined
#error cpstm8 main.c:266(6+11) PA_IDR_IDR3 undefined
#error cpstm8 main.c:288(9) missing prototype
#error cpstm8 main.c:291(8+11) PA_IDR_IDR3 undefined
main.c:
The command: "cxstm8 -i"..\..\..\..\program files (x86)\cosmic\cxstm8\hstm8" +debug -pxp -no -l +mods0 -pp -i"C:\Program Files (x86)\COSMIC\Hstm8"  -clDebug\ -coDebug\ main.c " has failed, the returned value is: 1
exit code=1.

12864-7675.elf - 18 error(s), 0 warning(s)


程序包
12864-7576.rar (16.11 KB, 下载次数: 2)














 楼主| 发表于 2019-7-15 12:44:43 | 显示全部楼层
#ifndef __ST7565_12864_H__         
#define __ST7565_12864_H__
#include <STM8S003F3P.h>
#include "ziku.h"
#define uchar unsigned char
#define uint  unsigned int

/*
//LCD接口配置
#define CS0 PC_ODR_ODR3      // 片选
#define RST PC_ODR_ODR5      // 液晶复位,低电平复位
#define CD  PC_ODR_ODR4      // 数据=高,指令=低
#define SCK PC_ODR_ODR6
#define SDA PC_ODR_ODR7
*/
//LCD接口配置
#define CS0 PC_ODR_ODR7      // 片选
#define RST PC_ODR_ODR3      // 液晶复位,低电平复位
#define CD  PC_ODR_ODR4      // 数据=高,指令=低
#define SCK PC_ODR_ODR5
#define SDA PC_ODR_ODR6


// Define the register command   /
#define Page_Add 0xb0     // Page Address Start
#define Row_Add  0x40     // Scroll Line Start


//LCD接口GPIO初始化   
void GPIO_Init(void)  //GPIO初始化   
{
    PA_DDR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;     
    PA_CR1 = 0<<1|0<<2|1<<3|0<<4|0<<5|0<<6;
    PA_CR2 = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;
//    PA_ODR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;
    PB_DDR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PB_CR1 = 0<<0|0<<1|0<<2|0<<3|0<<4|0 <<5|0<<6|0<<7;
    PB_CR2 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PB_ODR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PC_DDR = 1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7;
    PC_CR1 = 1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7;
    PC_CR2 = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PC_ODR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PD_DDR = 1<<0|1<<1|1<<2|1<<3|1<<4|0<<5|0<<6|1<<7;
    PD_CR1 = 1<<0|1<<1|1<<2|1<<3|1<<4|0<<5|0<<6|1<<7;
    PD_CR2 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
    PD_ODR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
/*
    PC_DDR |= 0xf0;
    PC_CR1 |= 0xf0;
    PB_DDR |= 0x30;
    PB_CR1 |= 0x30;
    PA_CR1 |= 0x08;
*/
}

uchar busy_bit=0;
uchar rev_bit=0;

typedef enum
{
        FONT_5X8 = 1,
        FONT_8X16,
        FONT_16X16,
        FONT_128X64,
        SCRIBING
}Typeface;


void Delay1(uint j)  //长延时
{
        uint i=0;
        while(j--)
        {
          for(i=0;i<1310;i++);
        }
}
void Delay(uint x)   //短延时
{
        uint a,b;
        for(a=x;a>0;a--)
        for(b=10;b>0;b--);
}

//------------------写命令到LCD-----------------------------/
void Write_Com(uchar cmd )
{
    int i;
    SCK=0;
    CS0=0;
    CD=0;
    for (i=0;i<8;i++)
    {
        SCK=0;
        if (cmd &0x80)
            SDA=1;
        else
            SDA=0;
            cmd =cmd <<1;
            SCK=1;
    }
    CS0=1;
}

//-------------------写数据到LCD----------------------------/
void Write_Data(uchar data)
{
    int i;
    SCK=0;
    CS0=0;
    CD=1;
    for (i=0;i<8;i++)
    {
        SCK=0;
        if (data&0x80)
            SDA=1;
        else
            SDA=0;
            data=data<<1;
            SCK=1;
    }
    CS0=1;
}

//———————— LCD数据指针位置程序————————/
//带 入参 数::pag,col
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Setadd(uchar pag,uchar col)
{   
    Write_Com(Page_Add+pag);   //页地址的命令 0xb0+? , 第?页地址的设置 0-7
    Write_Com(0x10+(col>>4&0x0f));   //设置列地址的命令:0x1?和0x0?。命令0x1?的?是列地址的“高四位” 0-127
    Write_Com(col&0x0f);        //0x0?的?是列地址的“低四位”
}  

//———————— LCD全屏填充————————/
void ClearScreen(void)
{   
    uchar i,j;   
        for(i=0;i<8;i++)
        {
                Write_Com(0xb0+i);  //从第0页开始
                Write_Com(0x10);    //从每页的0列开始
                Write_Com(0x00);
                for(j=0;j<132;j++)
                {
                         Write_Data(0x00);
                }
        }
}

//————————LCD初始化设定 ————————/
void Lcd_Init()
{   
    RST=0;      //复位 复位时为 display off
    Delay(50);  //最少2us  
    RST=1;  
    Delay(20);         
    Write_Com(0xe2);  //软件复位  
    Write_Com(0xa3);  ////设置LCD 的偏压比        0xa2 1/9, 0xa3 1/7
    Write_Com(0xa1);  //ADC seg镜像选择 0xa0正常,0xA1左右镜像  
    Write_Com(0xc0);  // com镜像选择 0xc0正常,0xC8上下镜像   
    Write_Com(0x40);  //从首行开始显示   
        Write_Com(0xa6);  //0xa6:正常 0xa7:反白
        Write_Com(0xa4);  //全屏        0xa4:normal display  0xa5:all points ON
    Write_Com(0x2f);  //设置开关内部电路的电源  0x2f 全开
    Write_Com(0x26);  //电压调整寄存器高位 粗调对比度  范围:0x21-0x27 ,值越大,显示效果越浓(底影越浓)   
    Write_Com(0x81);  //1:细调对比度 亮度调节 进入Electronic Volume Mode
    Write_Com(0x20);  //电压调整寄存器低位 细调对比度 亮度调节 范围:0x00-0x3f   
    Write_Com(0xaf);  //显示开  
    ClearScreen();    //清除屏幕
    //当同时执行“0xa5 Display All Points ON(命令10)”和“0xae Display OFF”命令时,模块进入省电模式
    //当 display all points ON 和display OFF 同时作用时,进入省电模式。如果进入省电模式时,第19 项STATIC
    //INDICATOR 为ON 时,系统是待机模式(Standby Mode), 如果进入省电模式时,第19 项STATIC INDICATOR
    //为OFF,那么系统将是睡眠模式(Sleep Mode),睡眠模式比待机模式要更省电。由于本模块的STATIC
    //INDICATOR 没有使用,因此在初始化时将第19 项设置为OFF 即可。要退出省电模式并显示数据,需要 执
    //行display all points OFF 和 display ON 两个命令。
}   

//---显示5*8点阵图像、ASCII, 或5x8点阵的自造字符、其他图标---/
void Disp5x8(uchar pag,uchar col, uchar const  *ptr)
{
        uint  col_cnt;
    Setadd(pag,col);
        for (col_cnt=0;col_cnt<5;col_cnt++)
        {       
                Write_Data(*ptr);
                ptr++;
        }
}
//---显示ASCII, 半角字符8×16汉字或8x16点阵图像、自造字符----/
//带 入参 数:col, pag, *ptr字符串首地址
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Disp8x16(uchar pag,uchar col, uchar const  *ptr)
{
    uchar j=0,i=0;
    for (j=0;j<2;j++)    // 整个字符分上下半部分字符
    {
                Setadd(pag+j,col);
                for (i=0;i<8;i++)
                {       
                        Write_Data(*ptr);                 //写数据到LCD,每写完一个8位的数据后列地址自动加1/
                        ptr++;
                }
    }
}

//---显示16x16点阵图像、全角字符16×16汉字、生僻字或16x16点阵的其他图标----------/
//带 入参 数:col, pag, *ptr字符串首地址
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Disp16x16(uchar pag,uchar col, uchar const  *ptr)
{
        uint i,j;
        for(j=0;j<2;j++)      // 整个字符分上下半部分字符
        {
                Setadd(pag+j,col);
                for (i=0;i<16;i++)
                {       
                        Write_Data(*ptr);         //写数据到LCD,每写完一个16位的数据后列地址自动加1/
                        ptr++;
                }
        }
}

//------全屏显示128x64点阵图像------/
void Disp128x64(uchar const  *ptr)
{
        uint i,j;
        for(j=0;j<8;j++)
        {
                Setadd(j+1,1);
                for (i=0;i<128;i++)
                {       
                  Write_Data(*ptr);                 //写数据到LCD,每写完一个8位的数据后列地址自动加1/
                  ptr++;
                }
        }
}

//------画线128列------/
void Scribing(void)
{
        uint i;
        Setadd(2, 1);
        for (i=0; i<128; i++)
        {
                Write_Data(0x08);
        }               
}

void DisplayFont(uchar pag, uchar col, uchar typeface, uchar No)
{
        uchar const *ptr;
        switch (typeface)
        {
                case FONT_5X8:
                        ptr = font5x8[No];
                        Disp5x8(pag, col, ptr);
                        break;
                case FONT_8X16:
                        ptr = font8x16[No];
                        Disp8x16(pag, col, ptr);
                        break;
                case FONT_16X16:
                        ptr = font16x16[No];
                        Disp16x16(pag, col, ptr);
                        break;
                case FONT_128X64:
                        ptr = IMG128x64;
                        Disp128x64(ptr);
                        break;
                case SCRIBING:
                        Scribing();
                        break;
                default:
                        break;
        }                  
}










/*
//-------------半角字符8×8点阵码----------------
void disp8(uchar pag,uchar col, uchar   *k)
{
    uchar j=0,i=0;
    uchar lie;
    lie=col&0xf0;
    lie>>=4;
    write_com(Page_Add+pag);
    write_com(0x10+lie);
    write_com(0x00+col&0x0f);
    for (i=0;i<8;i++)
    {   
        write_data(*k);
    }
}


void dispfull(uchar *p)
{
uint i,j,k;
uchar *q;
for (i=0;i<8;i++)
{
  write_com(i+0xb0);   //SET PAGE ADDRESS
  write_com(0x10);   //SET Column Address MSB
  write_com(0x00);   //SET Column Address LSB
  for (j=0;j<16;j++)
  {
   q=p;
   for (k=0;k<8;k++)
    write_data(*q++);
  }
}
}
//----------------------一个字符串的输出------------------/
void Putstr(uchar *str,uchar i,uchar page,uchar lie)
{
uchar j,X;
for (j=0;j<i;j++)
{
  col = lie+8*j;    // 换列
  row = page;
  X = str[j];
  Putedot(X-0x20);   // ascii码表从0x20开始
}
}
//-------------半角字符8×16点阵码数据输出----------------/
void Putedot(uchar Order)
{
uchar j=0,i=0;
uchar lie,cbyte;
int x;
x = Order * 0x10;       // 如字符!,在Ezk[]中的位置为1,对应Order=1,但其第1个点阵字节在Ezk[16]中,将Order乘以0x10的值x作为该字符在Ezk[]中的第一个点阵码的下标
for (j=0;j<2;j++)    // 整个字符分上下半部分字符
{
  lie=col&0xf0;
  lie>>=4;
  write_com(Page_Add+row+j);
  write_com(0x10+lie);
  write_com(0x00+col&0x0f);
  for (i=0;i<8;i++)
  {
   cbyte = Ezk[x];
   write_data(cbyte);  // 输出一字节
   x++;
  }
}
}

*/

#endif
回复 支持 反对

使用道具 举报

发表于 2019-7-15 13:18:25 | 显示全部楼层
头文件包含不全吧,
看提示PC_ODR_ODR5未定义,你找下这个PC_ODR_ODR5在哪个.h里定义的,然后哪个c文件调用的话,就需要include相应的.h文件
如果是全局变量,也是类似的需要自己指明extern关系,或是直接包含定义extern关系的.h文件
回复 支持 反对

使用道具 举报

发表于 2019-7-15 13:26:06 | 显示全部楼层
本帖最后由 chenlei1910 于 2019-7-15 13:30 编辑

两个003f3.h和103.h要去掉一个,
回复 支持 反对

使用道具 举报

发表于 2019-7-15 23:52:27 来自手机浏览器 | 显示全部楼层
一直都是IAR没有用过这玩意儿:titter:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-16 07:14:27 | 显示全部楼层
chenlei1910 发表于 2019-7-15 13:26
两个003f3.h和103.h要去掉一个,

Include Files 选了  stm8s003f3.h  下面就会自动出来一个 stm8s103f.h
回复 支持 反对

使用道具 举报

发表于 2019-7-16 08:44:58 | 显示全部楼层
应该是iar的工程,我记得PC_ODR_ODR5这个宏在IAR里面可以直接调用,STVD中好像没有。
你可以换iar编译一下试试。如果工程本身就是stvd的,辣么就是你少头文件了。
回复 支持 反对

使用道具 举报

发表于 2022-11-29 18:07:08 | 显示全部楼层
楼主能否说下STVD+COSMIC的环境,折腾了下
提示 FlexLM Feature has expired,应该是license过期了,官网申请,又有1年的有效期,如何彻底破解
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 15:13 , Processed in 0.358800 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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