linux开发 stc_仿STC-ISP写的Linux版编程烧录软件,附源代码

这是一个使用C语言编写的Linux版STC单片机编程烧录软件,包含源代码。软件能根据不同的MCU时钟配置,调整通信波特率,并支持不同型号的STC单片机。程序通过串口与单片机交互,进行数据发送和接收,包含了错误处理和波特率切换等功能。
摘要由CSDN通过智能技术生成

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#pragma pack(1)

// config MCU clock

#define MCU_CONFIG

//#define MCU_6TO6

//#define MCU_6TO12

//#define MCU_12TO12

//#define MCU_12TO6

#ifdef MCU_6TO6

#define MCU_CLOCK

#endif

#ifdef MCU_6TO12

#define MCU_CLOCK

#endif

#ifdef MCU_12TO12

#define MCU_CLOCK

#define MCU_CLOCK_12MHZ

#undef MCU_CONFIG

#endif

#ifdef MCU_12TO6

#define MCU_CLOCK

#define MCU_CLOCK_12MHZ

#endif

#ifndef MCU_CLOCK

#error "You must define MCU clock!"

#endif

#define VERSION "0.1"

#define DEFAULT_PORT "/dev/ttyS1"

#define LOW_BAUD B2400

#ifdef MCU_CLOCK_12MHZ

#define HIGH_BAUD B57600

#define MSG_HIGH_BAUD "57600bps"

#else

#define HIGH_BAUD B38400

#define MSG_HIGH_BAUD "38400bps"

#endif

#define BUFFSIZE 1024

#define TIMEOUT 2

#define BLOCK_SIZE 128

#define PKG_MINIMAL_LEN 9

#define PKG_SIGN1 '\x46'

#define PKG_SIGN2 '\xb9'

#define PKG_SIGN3 '\x16'

#define PKG_SIGN  0x46b9

enum pkg_type {

PKG_TYPE1=0x68,

PKG_TYPE2=0x6a,

};

enum pkg_code {

CODE_INFO=0x50,

CODE_MODI=0x8f,

CODE_NEWB=0x8e,

CODE_ERASE=0x84,

CODE_DATA=0x00,

CODE_END =0x69,

CODE_CONF=0x8d,

CODE_BYE =0x82,

};

int port_fd=-1;

FILE *rom_file;

int file_length;

int debug=0;

enum pkg_code step;

int block_no;

struct timeval start_tv;

typedef unsigned int uint32;

typedef unsigned short int uint16;

typedef unsigned char uint8;

// Package format: head + data + tail

typedef struct _pkg_head {

uint16 sign;                // 0x46b9

uint8  type;                // 68: MCU to PC; 6a: PC to MCU

uint16 lenth;                // from 'type' to 'pkg_tail.sign'

uint8  code;

} pkg_head, *ppkg_head;

typedef struct _pkg_tail {

uint16 cksum;                // from 'pkg_head.type' to 'data'

uint8  sign;                // 0x16

} pkg_tail, *ppkg_tail;

typedef struct _pkg_data_head {

uint16 dummy;                // always 0x0000

uint16 addr;                // start addr

uint16 lenth;                // 0x0080

} pkg_data_head, *ppkg_data_head;

void print_data(char *data, int len)

{

unsigned char ch;

int i, j;

printf("Length: %x\n", len);

for(i=0; i

ch=data[i];

if((i&0x0f)==0)

printf("%04x: ", i);

if((i&0x07)!=0x07)

printf("%02x ", ch);

else

if((i&0x0f)!=0x0f)

printf("%02x-", ch);

else {

printf("%02x  ", ch);

for(j=0x0f; j>=0; j--) {

ch=data[i-j];

if(!isascii(ch) || iscntrl(ch))

ch='.';

putchar(ch);

}

putchar('\n');

}

}

if(len&0x0f) {

for(; i

printf("   ");

putchar(' ');

for(j=len&~0x0f; j

ch=data[j];

if(!isascii(ch) || iscntrl(ch))

ch='.';

putchar(ch);

}

putchar('\n');

}

}

enum dbg_type {RECV, SEND};

void print_dbg(int type, char *buf, int buf_len)

{

struct timeval tv;

unsigned int sec, usec;

if(debug) {

if(type==SEND)

printf("\n[Send]\t\t");

else

printf("\n[Received]\t");

gettimeofday(&tv, NULL);

if(start_tv.tv_usec>tv.tv_usec) {

usec=tv.tv_usec-start_tv.tv_usec+1000000;

sec=tv.tv_sec-start_tv.tv_sec-1;

} else {

usec=tv.tv_usec-start_tv.tv_usec;

sec=tv.tv_sec-start_tv.tv_sec;

}

printf("[%d.%06d]\n", sec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值