USART1_CR2 |= 0x0c;
USART1_CR2 &= ~0x20; //禁止接收中断 USART1_CR1 &= ~0x20;
PC_DDR |= 0x08; //PC3输出口 TXD管脚必须设置为输出推挽,否则不能发送数据 PC_CR1 |= 0x08; //PC3推挽输出 PC_CR2 |= 0x08; //PC3输出速度最大为10MHZ PC_ODR &= ~0x08; //PC3输出低 }
u8 uart_receive(void) //轮询接收串口数据 {
u8 sr;
u8 Receivedata;
sr = USART1_SR;
while(!(sr & 0x20)) //接收数据准备好读 sr = USART1_SR;
if(sr & 0x09) //有溢出和奇偶校验错误 {
Receivedata = USART1_DR;
return 0; }
if(Uart_data.Single_Counter < Rev_counter)
Uart_data.Receive_data[Uart_data.Single_Counter++] = USART1_DR;
if(CMD_flag == TRUE) //接收到升级总字节数后,开始接收升级数据 {
Uart_data.Total_Bytes_Counter++;
if(Uart_data.Total_Bytes == Uart_data.Total_Bytes_Counter) RECE_flag=TRUE; }
Uart_Deal(); return 1; }
/*********************************************** * 函数名 :uart_send
* 描述 :串口发送一个字节 * 创建时间 :2017-05-17
************************************************/ void uart_send(u8 sdata) {
while(!(USART1_SR & 0x80)); //没有数据移动
USART1_DR = sdata;
while(!(USART1_SR & 0x40)); //等待发送完成 }
void Uart_Deal(void) {
u8 LenL;
u16 LenH,LEN; u8 CrcL;
u16 CRC,CrcH,CRC_temp; u8 CMD;
u16 Total_Byte_H; u8 Total_Byte_L;
if(CMD_flag == FALSE) //先接收总字节数 {
if(Uart_data.Receive_data[0] == 0x7E) {
if(Uart_data.Single_Counter == 4) //接收到LEN {
LenH = Uart_data.Receive_data[2]; LenL = Uart_data.Receive_data[3];
LEN = (LenH<<8 | LenL); }
else if(Uart_data.Single_Counter == (LEN+7)) //接收完一帧数据 {
if(Uart_data.Receive_data[LEN+6] == 0xE7) //包尾 {
CrcH = Uart_data.Receive_data[LEN+4]; CrcL = Uart_data.Receive_data[LEN+5];
CRC = (CrcH<<8 | CrcL);
CRC_temp = GlobFun_CRC_Check(Uart_data.Receive_data,(LEN+4)); //校验包头
CMD = Uart_data.Receive_data[1];
if(CRC == CRC_temp) {
if(CMD == 0x01) //升级命令 {
Total_Byte_H = Uart_data.Receive_data[4]; Total_Byte_L = Uart_data.Receive_data[5];
Uart_data.Total_Bytes = (Total_Byte_H<<8 | Total_Byte_L); //接收总字节数
Uart_data.Total_Bytes_Counter = 0; //总字节数计数器
CMD_flag = TRUE; //开始接收升级数据标志
uart_send(0x55);
}
}
Uart_data.Single_Counter = 0; //不管校验是否通过都清零计数器 } } } else
Uart_data.Single_Counter = 0; //接收不到包头就清零计数器 }
else //接收升级数据 {
if(RECE_flag==TRUE) //接收到全部升级数据 {
WriteBufferFlash(APP_start_address,Uart_data.Receive_data,600); //向APP区写数据
WriteBufferFlash(APP_Valid_address,Valid_flag,4); //写APP存在标志
Jump_To_RESET(); //复位 } } }
(4)CRC校验函数
u8 auchCRCHi[] = { /* CRC 高位字节表 */ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 };
u8 auchCRCLo[] = { /* CRC 低位字节表*/ 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 };
u16 GlobFun_CRC_Check(u8 *L_CRC_Buffer,u8 L_CRC_Len) {
u16 CRC_Result=0; u16 L_CRC_Index = 0; u8 L_CRC_H = 0xff; u8 L_CRC_L = 0xff; u8 I_CRC_Msb=0; u8 I_CRC_Lsb=0;
//L_CRC_Buffer++; //不包括对包头0x7E的校验
while(L_CRC_Len--) {
L_CRC_Index = L_CRC_H ^ *L_CRC_Buffer++; L_CRC_H = L_CRC_L ^ auchCRCHi[L_CRC_Index]; L_CRC_L = auchCRCLo[L_CRC_Index]; }
I_CRC_Msb = L_CRC_L; I_CRC_Lsb = L_CRC_H;
CRC_Result=(I_CRC_Lsb<<8)|I_CRC_Msb;
return CRC_Result; }
(5)lnkstm8l052r8_boot.icf
///////////////////////////////////////////////////////////////// // Example ILINK command file for
// STM8 IAR C/C++ Compiler and Assembler. //
// Copyright 2014 IAR Systems AB. //
/////////////////////////////////////////////////////////////////
define memory with size = 16M;
define region TinyData = [from 0x00 to 0xFF];
define region NearData = [from 0x0000 to 0x0FFF];
define region Eeprom = [from 0x1000 to 0x10FF];
define region BootROM = [from 0x6000 to 0x67FF];
define region NearFuncCode = [from 0x8000 to 0xD7FF];
define region FarFuncCode = [from 0x8000 to 0xD7FF];
define region HugeFuncCode = [from 0x8000 to 0xD7FF]; /*
define region NearFuncCode = [from 0x8000 to 0xFFFF];
define region FarFuncCode = [from 0x8000 to 0xFFFF]
| [from 0x10000 to 0x17FFF];
define region HugeFuncCode = [from 0x8000 to 0x17FFF]; */
/////////////////////////////////////////////////////////////////
define block CSTACK with size = _CSTACK_SIZE {};
define block HEAP with size = _HEAP_SIZE {};
define block INTVEC with size = 0x80 { ro section .intvec };
// Initialization
initialize by copy { rw section .far.bss,
rw section .far.data,
rw section .far_func.textrw, rw section .huge.bss, rw section .huge.data,
rw section .huge_func.textrw, rw section .iar.dynexit, rw section .near.bss, rw section .near.data,
rw section .near_func.textrw, rw section .tiny.bss, rw section .tiny.data, ro section .tiny.rodata };
initialize by copy with packing = none {section __DLIB_PERTHREAD };
do not initialize { rw section .eeprom.noinit, rw section .far.noinit, rw section .huge.noinit, rw section .near.noinit, rw section .tiny.noinit, rw section .vregs };
// Placement
place at start of TinyData { rw section .vregs }; place in TinyData { rw section .tiny.bss,
rw section .tiny.data, rw section .tiny.noinit, rw section .tiny.rodata };
place at end of NearData { block CSTACK }; place in NearData { block HEAP,
rw section __DLIB_PERTHREAD, rw section .far.bss, rw section .far.data, rw section .far.noinit,
rw section .far_func.textrw, rw section .huge.bss, rw section .huge.data, rw section .huge.noinit,
rw section .huge_func.textrw, rw section .iar.dynexit, rw section .near.bss, rw section .near.data, rw section .near.noinit,
rw section .near_func.textrw };
place at start of NearFuncCode { block INTVEC };
place in NearFuncCode { ro section __DLIB_PERTHREAD_init, ro section .far.data_init,
ro section .far_func.textrw_init, ro section .huge.data_init,
ro section .huge_func.textrw_init, ro section .iar.init_table, ro section .init_array,
ro section .near.data_init, ro section .near.rodata, ro section .near_func.text, ro section .near_func.textrw_init,
ro section .tiny.data_init, ro section .tiny.rodata_init };