diff --git a/source/.vscode/settings.json b/source/.vscode/settings.json new file mode 100644 index 0000000..ada5cf4 --- /dev/null +++ b/source/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "UART0.C": "cpp" + } +} \ No newline at end of file diff --git a/source/app/common.c b/source/app/common.c index 4235108..6c4c417 100644 --- a/source/app/common.c +++ b/source/app/common.c @@ -14,6 +14,7 @@ struct ts_eeprom_enc eep_enc; void L3_eeprom_read_param() { +#if 0 U8 dlen = 0; L0_Iap_Read_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + EEPROM_PARAM_DATA_MAX + 2); if(eep_param.filter == EEPROM_PARAM_FILTER) @@ -27,10 +28,18 @@ void L3_eeprom_read_param() Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,sizeof(G.p));//防止dlen>sizeof(G.P)引起的内存错误 } } +#endif + if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_PARAM_BLOCK_SIZE, (U8*)&G.p, NULL) == 0) + { + //L0_uart0_sendstr("e2p read success"); + return; + } + //L0_uart0_sendstr("e2p read failed"); } void L3_eeprom_persist_param() { +#if 0 U8 dlen = sizeof(G.p); eep_param.filter = EEPROM_PARAM_FILTER; eep_param.len = dlen + 2; @@ -41,8 +50,16 @@ void L3_eeprom_persist_param() L0_Iap_Erase(EEP_PARAM_ADDR); L0_Iap_Program_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + dlen + 2); +#endif + if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_PARAM_BLOCK_SIZE, (U8*)&G.p,sizeof(G.p),TRUE) == 0) + { + //L0_uart0_sendstr("e2p write success"); + return; + } + //L0_uart0_sendstr("e2p write failed"); } +#if 0 int L3_mcu_id_ok(void) { U8 i = 0,crc[2]; @@ -78,6 +95,48 @@ int L3_mcu_id_ok(void) return 1; } +#else + +/** + * + * @brief: eeprom的D_EEP_ENC_IN_SECTOR、D_EEP_ENC_IN_BLOCK中提前存放了加密信息: enc_key, enc_val(enc_key+chipid计算所得) + * @param: void + * @return: 1 is ok , 0 is failed + * + */ +int L3_mcu_id_ok(void) +{ + U8 i = 0; + + //1. 获取eeprom中存储的enc信息 + if(L1_eep_read_block(D_EEP_ENC_IN_SECTOR, D_EEP_ENC_IN_BLOCK, D_EEP_ENC_BLOCK_SIZE, (U8*)&eep_enc,NULL) == 1) + { + //L0_uart0_sendstr("e2p read enc failed"); + return 0; + } + //L0_uart0_sendstr("e2p read enc success"); + + //2.获取MCU_ID + L0_id_get_rom(G.e.mcu_id); + //L0_uart0_sendArray(enc_info.mcu_id,MCU_ID_LEN); + + //3.根据mcu_id和enc_key计算enc_val + //enc_key = ((U32)eep_enc.enc_key[0] << 24) | (eep_enc.enc_key[1] << 16) | (eep_enc.enc_key[2] << 8) |(eep_enc.enc_key[3] << 0); + Lc_encrypt_id1((U8*)G.e.mcu_enc_id, (U8*)G.e.mcu_id, eep_enc.enc_key, MCU_ID_LEN); + + //4.判断enc_val是否一致 + for(i=0;i +#include "../bsp/bsp_config_const.h" +#include "../clib/type.h" +#include "../clib/bit.h" -#include "bsp_config0.h" +//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT +#define TYPE_UASER_BOARD TYPE_BOARD_WEIGH_0B +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG +#if(TYPE_UASER_BOARD == TYPE_BOARD_WEIGH_0B) + #include + #include "../cpu/stc_stc8hxx.h" + #include "../cpu/stc_macro.h" + + //基本配置(工作频率、时钟、看门狗、字节序) + #define TYPE_MCU TYPE_MCU_STC_8H + #define TYPE_IDE TYPE_IDE_KEIL + #define D_CPUfamily_type D_CPUfamily_8bits + #define D_sys_MainFre MainFre_11M + #define D_sys_Jiffies TYPE_JIFFIES_10MS + #define D_WDT_STATUS TYPE_WDT_DISABLE //如果配置为enable,请在bsp_config.c中设置wdt溢出时间 + #define D_MCU_ENDIAN TYPE_MCU_BIGENDIAN + #define D_CODE_ENCRYPTION_TYPE TYPE_ENCRYPTION_ENABLE //是否代码加密 + + #define D_MCU_NAME "STC8H3K48S4" + //存储器特殊参数地址配置 + #define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + //...其他参数 + + //串口配置 + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 + #define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 + #define D_uart2_BRT BRT_115200 + #define D_uart3_BRT BRT_115200 + #define D_uart4_BRT BRT_115200 + + //485配置 + #define D_UART0_485_TYPE TYPE_485_SLAVER //UART0启用485 + #define D_UART0_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息 + #define D_UART0_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId + #define D_UART0_485_TX() P55 = 1; + #define D_UART0_485_RX() P55 = 0; + #define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART4_485_TYPE TYPE_485_NONE //UART2不启用485 + + //MODBUS协议配置 + #define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行 + #define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改 + #define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应 + + //外设定义 + #define LED0 P17 //D4 + #define LED1 P54 //D4 + + //EEP存储地址定义 + #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes + #define D_EEP_SECTOR_BLOCK_SIZE 0x80 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 + #define D_EEP_SECTOR_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + #define D_EEP_BLOCK_FILTER0 0xAA //扇区中每个数据块的Filter字段值 + #define D_EEP_BLOCK_FILTER1 0x55 + //EEP User Defined 参数区存储配置 + #define D_EEP_PARAM_IN_SECTOR 1 //eeprom参数区扇区地址,从0开始 + #define D_EEP_PARAM_IN_BLOCK 0 //eeprom参数区数据块地址,从0开始 + #define D_EEP_PARAM_BLOCK_SIZE (D_EEP_SECTOR_BLOCK_SIZE) //参数区每个块大小,必须:D_EEP_PARAM_BLOCK_SIZE<=D_EEP_SECTOR_BLOCK_SIZE!!!,因为eeprom.h中是按照D_EEP_SECTOR_BLOCK_SIZE分配的buf + #define D_EEP_PARAM_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + //EEP 加密区存储配置 + #if(D_CODE_ENCRYPTION_TYPE == TYPE_ENCRYPTION_ENABLE) + #define D_EEP_ENC_IN_SECTOR 0 //eeprom加密区扇区地址,从0开始 + #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 + #define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 + #endif +#elif + xxx #endif +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) #define D_SERVE_INT0 interrupt 0 #define D_SERVE_TIMER0 interrupt 1 #define D_SERVE_INT1 interrupt 2 @@ -74,226 +159,69 @@ #define D_SERVE_PWM interrupt 22 #define D_SERVE_PWMFD interrupt 23 #define D_SERVE_I2C interrupt 24 - - - -#if 0 -#define D_debug_sim #endif -//#define D_iic_inspect -#define D_open_save_f - -#define TYPE_UASER_BOARD ccSensor_WS_ps5ws //CC_SE_paper_main_m10_smt01.sch - -//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - #include - #include - - //#include "../cpu/STC_stc8a8k.h" - #include "../cpu/stc_stc8hxx.h" - #include "../cpu/stc_macro.h" - -#define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 - -#if 0//// 烧写配置 - . 内部IRC振荡器的频率: 22.128MHz - . 掉电唤醒定时器的频率: 35.575KHz - . 振荡器放大增益使能 - . P3.2和P3.3与下次下载无关 - . 上电复位时增加额外的复位延时 - . 复位引脚用作普通I/O口 - . 检测到低压时不复位,而产生低压中断 - . 低压检测门槛电压 : 2.20 V - . 上电复位时,硬件不启动内部看门狗 - . 上电自动启动内部看门狗时的预分频数为 : 256 - . 空闲状态时看门狗定时器停止计数 - . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 - . 下次下载用户程序时,将用户EEPROM区一并擦除 - . 下次下载用户程序时,没有相关的端口控制485 - . 下次下载时不需要校验下载口令 - . TXD脚直通输出RXD脚的电平 - . 芯片复位后,TXD脚为强推挽输出 - . 芯片复位后,P2.0输出高电平 - . 内部参考电压: 1341 mV (参考范围: 1270~1410mV) - . 内部安排测试时间: 2018年1月13日 - - . 芯片出厂序列号 : F64181C6219784 - 单片机型号: STC8F2K08S2 - 固件版本号: 7.3.10U - - . 用户设定频率: 22.118MHz - . 调节后的频率: 22.128MHz - . 频率调节误差: 0.043% - - - 操作成功 !(2019-02-24 18:16:24) - -该单片机的功能: 2.0-5v 8kflash 2kram DPTR EEPROM 4K - SPI IIC T0-T4 5个定时器 掉电唤醒专用定时器 比较器 内部电压检测中断 看门狗 tssop20 1.2元人民币 -#endif - -#define D_MCLKO_DIV2 2 -#define D_MCLKO_DIV4 4 -#define D_MCLKO_DIV8 6 -#define D_MCLKO_DIV16 8 -#define D_MCLKO_DIV32 10 -#define D_MCLKO_DIV64 12 - -#define D_CPUfamily_type D_CPUfamily_8bits - - #define D_uart0_BRT BRT_115200 - #define D_uart0_SBIT SBIT_1 -#ifdef D_debug115200 - #if 0 - #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)/// - #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// - #else - - #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)// - #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// - #endif - -#else - #define L2_task_L0_uart0_uc(x) //L0_uart0_uc_debug(x)/////// - #define L2_task_L0_uart0_uchex(x) // L0_uart0_uchex(x)///// - - - #define GC032a_L0_uart0_uc(x) //L0_uart0_uc_debug(x)///// - #define GC032a_L0_uart0_uchex(x) //L0_uart0_uchex(x)//// - - - #define GC032a_L0_uart0_sendArray(x,Y) //L0_uart0_uchex(Y)// - #define GC032a_L0_uart0_us(x) //L0_uart0_us(x)*/ - -#endif -///#define D_sys_MainFre MainFre_16M2 -#define D_sys_MainFre MainFre_11M -///#define D_sys_MainFre MainFre_22M - +//STEP 4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cdelay CONFIG #if(MainFre_5M == D_sys_MainFre) - #define D_Cdelay_200us 20 #define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 -#elif(MainFre_22M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#elif(MainFre_27M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#else ///MainFre_11M +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us + //xx +#endif//D_sys_MainFre) +//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -1, -串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T, -2, timer0 为task使用 -L1_tick_tick -3, - -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<****/ - -#define D_IO_LED1_OFF() D_P17_OFF() -#define D_IO_LED2_OFF() D_P54_OFF() -#define D_IO_485_RE_OFF() D_P55_OFF() -#define D_IO_485_DE_OFF() //D_P55_OFF() -#define D_IO_LED1_INIT() ///D_P35_INIT() -#define D_IO_LED2_INIT() ///D_P34_INIT() -#define D_IO_485_RE_INIT() ///D_P33_INIT() -#define D_IO_485_DE_INIT() ///D_P32_INIT() -#define D_IO_LED1_ON() D_P17_ON() -#define D_IO_LED2_ON() D_P54_ON() -#define D_IO_485_RE_ON() D_P55_ON() -#define D_IO_485_DE_ON() //D_P32_ON() - - -////////////////////////////////sim iic config -//根据sch的定义 -#define L0_IIC_SIM_INIT() BITN_0(P3M1,5);BITN_0(P3M0,5);\ - BITN_0(P3M1,4);BITN_0(P3M0,4); -///stc独有10 高阻 -#define L0_IIC_SIM_close() BITN_1(P3M1,5);BITN_0(P3M0,5);\ - BITN_1(P3M1,4);BITN_0(P3M0,4); #define L0_board_config() D_stdIO_P1(BITN7);D_stdIO_P5(BITN4);\ D_stdIO_P1(BITN0);D_stdIO_P1(BITN1);\ @@ -301,84 +229,8 @@ L1_tick_tick D_stdIO_P3(BITN2);D_stdIO_P3(BITN3);\ D_stdIO_P3(BITN4);D_stdIO_P3(BITN5);\ D_stdIO_P3(BITN6);D_stdIO_P3(BITN7); - - - -#if 10 -#define L0_SDA_ON() D_P34_ON() -#define L0_SDA_OFF() D_P34_OFF() -#define L0_SDA_AT() D_P34_AT() -#define L0_SCL_ON() D_P35_ON() -#define L0_SCL_OFF() D_P35_OFF() -#else - -#define L0_SDA_ON() //D_P34_ON() -#define L0_SDA_OFF() //D_P34_OFF() -#define L0_SDA_AT() //D_P34_AT() -#define L0_SCL_ON() //D_P35_ON() -#define L0_SCL_OFF() //D_P35_OFF() - -#endif - - -#if(BRT_4800 == D_uart0_BRT) -#define D_txd4_wakeup() P31 = 1 // >750us -#define D_txd4_low() P31 = 0 -////为适应433 模块的功耗问题 -////debug的时候切记 此处会对串口造成影响 low有效的情况下其他的发送不会好使,除非事先wakeup - - -#else -#define D_txd4_wakeup() //P31 = 1 // >750us -#define D_txd4_low() //P31 = 0 - - -#endif - -#define DR_who_wakeup22 i2ctxd - - -///// DR: Define Register DRB:bit of Define Register -#define DR_isr_times SADDR - -#define DR_who_wakeup SADEN -#define DRB_who_wakeup_timer0 BITN0 -#define DRB_who_wakeup_action BITN1 -#define DRB_who_wakeup_voice BITN2 -#ifdef doc342343 -BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); -BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); - -if(BITN_G(DR_who_wakeup, DRB_who_wakeup_timer0)) -{ - -} -#endif - - - - -#elif(TYPE_UASER_BOARD == TYPE_BOARD_TI26_MT01_M178)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- - #define TYPE_MCU TYPE_MCU_STC - #define TYPE_IDE TYPE_IDE_KEIL - - #include - #include - #include - - //#include "../cpu/STC_stc8a8k.h" - #include "../cpu/stc_stc8hxx.h" - - #define D_CPUfamily_type D_CPUfamily_8bits - -#elif(TYPE_UASER_BOARD == TYPE_BOARD_SMMM_MB_VH032_0E) - -#endif #endif//_BSP_CONFIG_H /*********************************end file*********************************************/ - - - diff --git a/source/bsp/bsp_config.h.1 b/source/bsp/bsp_config.h.1 new file mode 100644 index 0000000..fc6e36c --- /dev/null +++ b/source/bsp/bsp_config.h.1 @@ -0,0 +1,384 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file hard_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序 +/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +////////////////////////////////////////////////////////////////////////////// +/// @version 5.1 +/// @author CC +/// @date 20200301 +/// @note +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +#ifndef _BSP_CONFIG_H +#define _BSP_CONFIG_H +#include + + +#include "bsp_config0.h" + +#define D_version_v 'L' + + +#if 0 + +#define D_leda_OFF(); D_P35_OFF(); +#define D_leda_ON(); D_P35_ON(); +#define D_leda_REV(); D_P35_REV(); +#define D_ledb_OFF(); D_P34_OFF(); +#define D_ledb_ON(); D_P34_ON(); +#define D_ledb_REV(); D_P34_REV(); + +#else +#define D_leda_OFF(); ///D_P35_OFF(); +#define D_leda_ON(); ///D_P35_ON(); +#define D_leda_REV(); ///D_P35_REV(); +#define D_ledb_OFF(); ///D_P34_OFF(); +#define D_ledb_ON(); ///D_P34_ON(); +#define D_ledb_REV(); ///D_P34_REV(); + +#endif + + +#define D_SERVE_INT0 interrupt 0 +#define D_SERVE_TIMER0 interrupt 1 +#define D_SERVE_INT1 interrupt 2 +#define D_SERVE_TIMER1 interrupt 3 +#define D_SERVE_UART interrupt 4 +#define D_SERVE_ADC interrupt 5 +#define D_SERVE_LVD interrupt 6 +#define D_SERVE_PCA interrupt 7 +#define D_SERVE_UART2 interrupt 8 +#define D_SERVE_SPI interrupt 9 +#define D_SERVE_INT2 interrupt 10 +#define D_SERVE_INT3 interrupt 11 +#define D_SERVE_TIMER2 interrupt 12 +#define D_SERVE_INT4 interrupt 16 +#define D_SERVE_UART3 interrupt 17 +#define D_SERVE_UART4 interrupt 18 + +#define D_SERVE_TIMER3 interrupt 19 +#define D_SERVE_TIMER4 interrupt 20 +#define D_SERVE_CMP interrupt 21 +#define D_SERVE_PWM interrupt 22 +#define D_SERVE_PWMFD interrupt 23 +#define D_SERVE_I2C interrupt 24 + + + +#if 0 +#define D_debug_sim +#endif +//#define D_iic_inspect +#define D_open_save_f + +#define TYPE_UASER_BOARD ccSensor_WS_ps5ws //CC_SE_paper_main_m10_smt01.sch + +//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#if(TYPE_UASER_BOARD == ccSensor_WS_ps5ws)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- +//2.0-5.5 8K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k08s2 1.2yuan +//2.0-5.5 16K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.4yuan + + +//1.7-5.5 8K 1kram 3k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.1yuan + + + +#define D_version_h 0x37 +#define D_version_L 0x38 + + + #define TYPE_MCU TYPE_MCU_STC + #define TYPE_IDE TYPE_IDE_KEIL + + #include + #include + #include + + //#include "../cpu/STC_stc8a8k.h" + #include "../cpu/stc_stc8hxx.h" + #include "../cpu/stc_macro.h" + +#define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + +#if 0//// 烧写配置 + . 内部IRC振荡器的频率: 22.128MHz + . 掉电唤醒定时器的频率: 35.575KHz + . 振荡器放大增益使能 + . P3.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时不复位,而产生低压中断 + . 低压检测门槛电压 : 2.20 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . TXD脚直通输出RXD脚的电平 + . 芯片复位后,TXD脚为强推挽输出 + . 芯片复位后,P2.0输出高电平 + . 内部参考电压: 1341 mV (参考范围: 1270~1410mV) + . 内部安排测试时间: 2018年1月13日 + + . 芯片出厂序列号 : F64181C6219784 + 单片机型号: STC8F2K08S2 + 固件版本号: 7.3.10U + + . 用户设定频率: 22.118MHz + . 调节后的频率: 22.128MHz + . 频率调节误差: 0.043% + + + 操作成功 !(2019-02-24 18:16:24) + +该单片机的功能: 2.0-5v 8kflash 2kram DPTR EEPROM 4K + SPI IIC T0-T4 5个定时器 掉电唤醒专用定时器 比较器 内部电压检测中断 看门狗 tssop20 1.2元人民币 +#endif + +#define D_MCLKO_DIV2 2 +#define D_MCLKO_DIV4 4 +#define D_MCLKO_DIV8 6 +#define D_MCLKO_DIV16 8 +#define D_MCLKO_DIV32 10 +#define D_MCLKO_DIV64 12 + +#define D_CPUfamily_type D_CPUfamily_8bits + + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 +#ifdef D_debug115200 + #if 0 + #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)/// + #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// + #else + + #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)// + #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// + #endif + +#else + #define L2_task_L0_uart0_uc(x) //L0_uart0_uc_debug(x)/////// + #define L2_task_L0_uart0_uchex(x) // L0_uart0_uchex(x)///// + + + #define GC032a_L0_uart0_uc(x) //L0_uart0_uc_debug(x)///// + #define GC032a_L0_uart0_uchex(x) //L0_uart0_uchex(x)//// + + + #define GC032a_L0_uart0_sendArray(x,Y) //L0_uart0_uchex(Y)// + #define GC032a_L0_uart0_us(x) //L0_uart0_us(x)*/ + +#endif +///#define D_sys_MainFre MainFre_16M2 +#define D_sys_MainFre MainFre_11M +///#define D_sys_MainFre MainFre_22M + +#if(MainFre_5M == D_sys_MainFre) + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#elif(MainFre_22M == D_sys_MainFre) + +#define D_Cdelay_200us 10 +#define D_Cdelay_1us 10 ////while p21翻转时测定 500k 2us 一个指令 +#define D_Cdelay_1ms 36// 500 14ms 360--10ms +#define D_Cdelay_5ms 180// 500 14ms 360--10ms +#define D_Cdelay_15ms 900 +#define D_Cdelay_30ms 2400 + +#define L0_delay_1us() Lc_delay_nop(2) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(20) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us + + + +// 0x01/#define D_MCLKO_set D_MCLKO_DIV16 //1.389MHz/800ns@MCU.22MHz- +#define D_MCLKO_set D_MCLKO_DIV8 ////2.778MHz/400ns@MCU.22MHz- +///#define D_MCLKO_set D_MCLKO_DIV4 ////5.556MHz/ @MCU.22MHz- +///#define D_MCLKO_set D_MCLKO_DIV2 ////5.556MHz/ @MCU.22MHz- +#define D_0xfa 0x33 +//#define D_0xfa 0x11 + +/******************* +#define D_0xf7 0x01 +#define D_0xf8 0x02 + +#define D_P00x46 0x26////pclk /////cccc201805 hs low polarity +#define D_P00x4c 0x00 +#define D_P00x4d 0x04 +#define D_P00x43 0x10 ///EABLE CrCb fixed en 02 +#define D_P00x4a 0x83 ///div_gate+clk_en 82 + +#define D_P00xda 0xff /// Cr fixed +#define D_P00xdb 0xff /// Cb fixed + +#define D_0xfa 0x22 //00000000000000 + + +P0:0x4d Debug_mode3 8 0x04 RW +[7:4] test_image_fix_value + +[3] fix_value_mode +[2] remove_ff_mode +[1] subsample extend opclk disable when SPI +[0] clk2x_bypass +*******************/ + +#elif(MainFre_27M == D_sys_MainFre) + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 + +#else ///MainFre_11M + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 + +#define D_Cdelay_1ms 36// +#define D_Cdelay_5ms 180// +#define D_Cdelay_15ms 900 +#define D_Cdelay_30ms 2400 +#if 0 +#define L0_delay_1us() Lc_delay_nop(5) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(40) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(150) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#else +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us //绀烘尝鍣ㄦ祴璇曠粨鏋? +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#endif + +#endif//D_sys_MainFre) +/*******>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +1, +串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T, +2, timer0 为task使用 +L1_tick_tick +3, + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<****/ + +#define D_IO_LED1_OFF() D_P17_OFF() +#define D_IO_LED2_OFF() D_P54_OFF() +#define D_IO_485_RE_OFF() D_P55_OFF() +#define D_IO_485_DE_OFF() //D_P55_OFF() +#define D_IO_LED1_INIT() ///D_P35_INIT() +#define D_IO_LED2_INIT() ///D_P34_INIT() +#define D_IO_485_RE_INIT() ///D_P33_INIT() +#define D_IO_485_DE_INIT() ///D_P32_INIT() +#define D_IO_LED1_ON() D_P17_ON() +#define D_IO_LED2_ON() D_P54_ON() +#define D_IO_485_RE_ON() D_P55_ON() +#define D_IO_485_DE_ON() //D_P32_ON() + + +////////////////////////////////sim iic config +//根据sch的定义 +#define L0_IIC_SIM_INIT() BITN_0(P3M1,5);BITN_0(P3M0,5);\ + BITN_0(P3M1,4);BITN_0(P3M0,4); +///stc独有10 高阻 +#define L0_IIC_SIM_close() BITN_1(P3M1,5);BITN_0(P3M0,5);\ + BITN_1(P3M1,4);BITN_0(P3M0,4); + +#define L0_board_config() D_stdIO_P1(BITN7);D_stdIO_P5(BITN4);\ + D_stdIO_P1(BITN0);D_stdIO_P1(BITN1);\ + D_stdIO_P1(BITN2);D_stdIO_P1(BITN6);\ + D_stdIO_P3(BITN2);D_stdIO_P3(BITN3);\ + D_stdIO_P3(BITN4);D_stdIO_P3(BITN5);\ + D_stdIO_P3(BITN6);D_stdIO_P3(BITN7); + + + +#if 10 +#define L0_SDA_ON() D_P34_ON() +#define L0_SDA_OFF() D_P34_OFF() +#define L0_SDA_AT() D_P34_AT() +#define L0_SCL_ON() D_P35_ON() +#define L0_SCL_OFF() D_P35_OFF() +#else + +#define L0_SDA_ON() //D_P34_ON() +#define L0_SDA_OFF() //D_P34_OFF() +#define L0_SDA_AT() //D_P34_AT() +#define L0_SCL_ON() //D_P35_ON() +#define L0_SCL_OFF() //D_P35_OFF() + +#endif + + +#if(BRT_4800 == D_uart0_BRT) +#define D_txd4_wakeup() P31 = 1 // >750us +#define D_txd4_low() P31 = 0 +////为适应433 模块的功耗问题 +////debug的时候切记 此处会对串口造成影响 low有效的情况下其他的发送不会好使,除非事先wakeup + + +#else +#define D_txd4_wakeup() //P31 = 1 // >750us +#define D_txd4_low() //P31 = 0 + + +#endif + + +#define DR_who_wakeup22 i2ctxd + + +///// DR: Define Register DRB:bit of Define Register +#define DR_isr_times SADDR + +#define DR_who_wakeup SADEN +#define DRB_who_wakeup_timer0 BITN0 +#define DRB_who_wakeup_action BITN1 +#define DRB_who_wakeup_voice BITN2 +#ifdef doc342343 +BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); +BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); + +if(BITN_G(DR_who_wakeup, DRB_who_wakeup_timer0)) +{ + +} +#endif + + + + +#elif(TYPE_UASER_BOARD == TYPE_BOARD_TI26_MT01_M178)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- + #define TYPE_MCU TYPE_MCU_STC + #define TYPE_IDE TYPE_IDE_KEIL + + #include + #include + #include + + //#include "../cpu/STC_stc8a8k.h" + #include "../cpu/stc_stc8hxx.h" + + #define D_CPUfamily_type D_CPUfamily_8bits + +#elif(TYPE_UASER_BOARD == TYPE_BOARD_SMMM_MB_VH032_0E) + +#endif + +#endif//_BSP_CONFIG_H +/*********************************end file*********************************************/ + + + + diff --git a/source/bsp/bsp_config0.h b/source/bsp/bsp_config0.h.1 similarity index 100% rename from source/bsp/bsp_config0.h rename to source/bsp/bsp_config0.h.1 diff --git a/source/bsp/bsp_config_const.h b/source/bsp/bsp_config_const.h new file mode 100644 index 0000000..ec39258 --- /dev/null +++ b/source/bsp/bsp_config_const.h @@ -0,0 +1,156 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序 +/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +////////////////////////////////////////////////////////////////////////////// +/// @version 5.1 +/// @author CC +/// @date 20200301 +/// @note +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +///存储器中的特殊参数 +///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节 +///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前) +///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前) +///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H - +///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H - +///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H +///固件版本为7.3.12U +///以及后续版本有效 +///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H +///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H +///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH +///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH +///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH +///保留 7FECH BFECH EFECH FDECH +///保留 7FEBH BFEBH EFEBH FDEBH +///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH +///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H +////////////////////////////////////////////////////////////////////////// + +#ifndef _BSP_CONFIG_CONST_H +#define _BSP_CONFIG_CONST_H + +#include +#include "../clib/type.h" +#include "../clib/bit.h" + +//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE +#define TYPE_BOARD_hhnew 1 +#define TYPE_BOARD_st_sleep04_01 4 +#define TYPE_BOARD_st_sleep03 5 +#define TYPE_BOARD_SMMM_MB_VH032_0E 6 +#define TYPE_BOARD_LPC17xx_ 8 +#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 +#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 +#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 +#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178 +#define TYPE_BOARD_stc5as32_WIFIBV01 532 +#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32 +#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感 +#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板 +#define TYPE_BOARD_ADDA_MAIN_V02 0xa8 //ADDA +#define TYPE_BOARD_433_0A 0xa9 //433 +#define TYPE_BOARD_WEIGH_0B 0xaa //称重 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>MCU TYPE +#define TYPE_MCU_VENDOR_MSK 0xF0 +#define TYPE_MCU_VENDOR_STC 0x10 +#define TYPE_MCU_STC_8A 0x11 +#define TYPE_MCU_STC_8F 0x12 +#define TYPE_MCU_STC_8G 0x13 +#define TYPE_MCU_STC_8H 0x14 + +#define TYPE_MCU_VENDOR_TI 0x60 +#define TYPE_MCU_SHC6601 0x66 +#define TYPE_MCU_LPC17xx 0x67 +#define TYPE_MCU_STM32 0x68 + +#define D_CPUfamily_8bits 8 +#define D_CPUfamily_16bits 16 +#define D_CPUfamily_32bits 32 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE +#define TYPE_IDE_KEIL 1 +#define TYPE_IDE_MDK 2 +#define TYPE_IDE_IAR 3 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>SysTimer TYPE +#define TYPE_JIFFIES_5MS 5 +#define TYPE_JIFFIES_10MS 10 +#define TYPE_JIFFIES_25MS 25 +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.WDT TYPE +#define TYPE_WDT_DISABLE 1 +#define TYPE_WDT_ENABLE 2 +//#define WDT_FEED() WDT_CONTR |= 0x10 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.ByteOrder TYPE +#define TYPE_MCU_BIGENDIAN 1 //大端字节序 +#define TYPE_MCU_LITENDIAN 2 //小端字节序 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.代码加密 TYPE +#define TYPE_ENCRYPTION_ENABLE 1 //代码加密 +#define TYPE_ENCRYPTION_DISABLE 2 //代码不加密 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>BUADRATE & StopBit +#define SBIT_1 1 //1 stop bit +#define SBIT_2 2 //2 stop bit +#define BRT_115200 115200 +#define BRT_19200 19200 +#define BRT_9600 9600 +#define BRT_4800 4800 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>MainFre +#define MainFre_5M 5529600L +#define MainFre_11M 11059200L +#define MainFre_22M 22118400L +#define MainFre_24M 24000000L +#define MainFre_27M 27000000L +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>UART0 PIN +#define PIN_UART0_Rxd_30_Txd_31 1 +#define PIN_UART0_Rxd_36_Txd_37 2 +#define PIN_UART0_Rxd_16_Txd_17 3 +#define PIN_UART0_Rxd_43_Txd_44 4 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART0 PIN + +//>>>>>>>>>>>>>>>>>>>>>>485 Type +#define TYPE_485_NONE 0 +#define TYPE_485_MASTER 1 +#define TYPE_485_SLAVER 2 +//<<<<<<<<<<<<<<<<<<<<<<485 Type end + +//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE +#define TYPE_ASENSOR_ADXL362 362 +#define TYPE_ASENSOR_MSA300 300 +#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 +//<<<<<<<<<<<<<<<<<<<<<> 8; //设置IAP高地址 @@ -55,8 +53,7 @@ char L0_Iap_Read(vU16 addr) void L0_Iap_Program(vU16 addr, char dat) { - IAP_CONTR = 0x80; //使能IAP - IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CONTR = WT_12M; //使能IAP IAP_CMD = 2; //设置IAP写命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 @@ -66,12 +63,12 @@ void L0_Iap_Program(vU16 addr, char dat) _nop_(); L0_Iap_Idle(); //关闭IAP功能 } + ///每个扇区512字节 ///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 void L0_Iap_Erase(vU16 addr) { - IAP_CONTR = 0x80; //使能IAP - IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CONTR = WT_12M; //使能IAP IAP_CMD = 3; //设置IAP擦除命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 @@ -81,8 +78,7 @@ void L0_Iap_Erase(vU16 addr) L0_Iap_Idle(); //关闭IAP功能 } - -#if 0 //8F +#elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H) void L0_Iap_Idle() { IAP_CONTR = 0; //关闭IAP功能 @@ -96,7 +92,8 @@ char L0_Iap_Read(vU16 addr) { char dat; - IAP_CONTR = WT_12M; //使能IAP + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; IAP_CMD = 1; //设置IAP读命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 @@ -111,7 +108,8 @@ char L0_Iap_Read(vU16 addr) void L0_Iap_Program(vU16 addr, char dat) { - IAP_CONTR = WT_12M; //使能IAP + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz IAP_CMD = 2; //设置IAP写命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 @@ -126,7 +124,8 @@ void L0_Iap_Program(vU16 addr, char dat) ///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 void L0_Iap_Erase(vU16 addr) { - IAP_CONTR = WT_12M; //使能IAP + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz IAP_CMD = 3; //设置IAP擦除命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 @@ -136,6 +135,8 @@ void L0_Iap_Erase(vU16 addr) L0_Iap_Idle(); //关闭IAP功能 } #endif + + void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) { U8 i = 0; @@ -154,56 +155,69 @@ void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len) } } -#if 0 -void L1_Iap_main(void) -{ - int i; - U16 addr = 0x00; - U8 buf[10]; - - L0_Iap_Erase(addr); - L0_Iap_Program_array(addr,"abcdefg",7); - L0_Iap_Read_array(addr,buf,10); - for(i=0;i<10;i++) +//处于节省空间考虑,eeprom读取的数据直接存放到了用户提供的buf中, +//如果buf长度过小,可能引起内存错误 +U8 L1_eep_read_block(U8 sector, U8 block, U16 blocksize, U8 *buf, U16 *plen) +{ + U16 i,addr = D_EEP_SECTOR_SIZE * sector + blocksize * block; + //读取整块 + L0_Iap_Read_array(addr, (U8*)&eep_block, sizeof(eep_block)); + if(eep_block.filter[0] == D_EEP_BLOCK_FILTER0 && eep_block.filter[1] == D_EEP_BLOCK_FILTER1) { - Lc_delay_ms(2); - L0_uart0_uc(buf[i]); + U8 crc[2] = {0,0}; + crc16(crc, eep_block.filter, 2 + 2 + D_EEP_SECTOR_BLOCK_BUF_SIZE); + if(eep_block.crc[0] == crc[0] && eep_block.crc[1] == crc[1]) + { + U16 len = (U16)eep_block.len[0] << 8 | eep_block.len[1]; + for(i=0;i D_EEP_SECTOR_BLOCK_BUF_SIZE) { - Lc_delay_ms(2); - L0_uart0_uc(buf[i]); + //L0_uart0_sendstr("eep write error."); + return 1; } - -#if 0 - for(i=0; i<0x1000; i++) + + Lc_memset((U8*)&eep_block,0,sizeof(eep_block)); + eep_block.filter[0] = D_EEP_BLOCK_FILTER0; + eep_block.filter[1] = D_EEP_BLOCK_FILTER1; + eep_block.len[0] = len >> 8 & 0xFF; + eep_block.len[1] = len >> 0 & 0xFF; + for(i=0;i>8 & 0xFF); - L0_uart0_uchex(i>>0 & 0xFF); - } + L0_Iap_Erase(addr); } -#endif - Lc_delay_ms(100); - L0_uart0_uc('%'); + //写入整块 + L0_Iap_Program_array(addr, (U8*)&eep_block, sizeof(eep_block)); + return 0; +} - while(1); +U8 L1_eep_erase_sector(U8 sector) +{ + U16 addr = D_EEP_SECTOR_SIZE * sector; + L0_Iap_Erase(addr); + return 0; } -#endif + diff --git a/source/msp/msp_eeprom.h b/source/msp/msp_eeprom.h index 1e8ef7d..e8bbf92 100644 --- a/source/msp/msp_eeprom.h +++ b/source/msp/msp_eeprom.h @@ -21,19 +21,26 @@ #include "../clib/type.h" #include "../clib/clib.h" #include "../ctask/tick.h" - - -///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -//#include "../cpu/stc_stc8a8k.h" -#include "../cpu/stc_macro.h" -#include "../bsp/bsp_config.h" -#include "../cpu/stc_stc8hxx.h" - - #include "uart0.h" -extern void L3_eeprom_fun(U8 *pPara); +/** + * EEPROM 存储结构 + * filter0 + filter1 + len0 + len1 + {data} + crc0 + crc1 + */ +#define D_EEP_SECTOR_BLOCK_BUF_SIZE (D_EEP_SECTOR_BLOCK_SIZE - 6) +typedef struct eeprom_block_t +{ + U8 filter[2]; //filter + U8 len[2]; //有效数据的个数 + U8 buf[D_EEP_SECTOR_BLOCK_BUF_SIZE]; + U8 crc[2]; //从filter开始进行整体校验 +}EEPROM_BLOCK; + +extern struct eeprom_block_t eep_block; +extern U8 L1_eep_read_block(U8 sector, U8 block, U16 blocksize, U8 *buf, U16 *plen); +extern U8 L1_eep_write_block(U8 sector, U8 block, U16 blocksize, const U8 *buf, U16 len, U8 sectorEraseFlag); +extern U8 L1_eep_erase_sector(U8 sector); + ///每个扇区512字节 extern void L0_Iap_Erase(vU16 addr); @@ -42,6 +49,7 @@ extern char L0_Iap_Read(vU16 addr); extern void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len); extern void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len); extern void L1_Iap_main(void); +extern void L3_eeprom_fun(U8 *pPara); #endif// #ifndef _msp_eeprom_H_