by schumi2000

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sys.cpp Source File

sys.cpp

00001 #include "sys.h"
00002 
00003 
00004 unsigned short ccitt_table[256] = {
00005 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
00006 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
00007 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
00008 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
00009 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
00010 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
00011 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
00012 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
00013 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
00014 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
00015 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
00016 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
00017 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
00018 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
00019 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
00020 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
00021 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
00022 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
00023 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
00024 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
00025 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
00026 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
00027 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
00028 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
00029 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
00030 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
00031 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
00032 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
00033 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
00034 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
00035 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
00036 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
00037 };
00038 
00039 unsigned short crc_ccitt(unsigned char *q, int len)
00040 {
00041     unsigned short crc = 0;
00042 
00043     while (len-- > 0)
00044     crc = ccitt_table[(crc >> 8 ^ *q++) & 0xff] ^ (crc << 8);
00045     return ~crc;
00046 }
00047 
00048 
00049 /**
00050 *@brief     把十进制数转化为字符型
00051 *@param     c:要转化十进制数据
00052 *@return    返回一个字符型数据
00053 */
00054 char c2d(uint8_t c)
00055 {
00056     if (c >= '0' && c <= '9')
00057         return c - '0';
00058     if (c >= 'a' && c <= 'f')
00059         return 10 + c -'a';
00060     if (c >= 'A' && c <= 'F')
00061         return 10 + c -'A';
00062 
00063     return (char)c;
00064 }
00065 
00066 /**
00067 *@brief     字符转转化为8位整型函数
00068 *@param     str:要转化字符串, base:
00069 *@return    num:返回转化后的整型数
00070 */
00071 uint16_t atoi16(char* str,uint16_t base )
00072 {
00073   unsigned int num = 0;
00074   while (*str !=0)
00075           num = num * base + c2d(*str++);
00076   return num;
00077 }
00078 
00079 
00080 /**
00081 *@brief     把字符串转化为十进制或十六进制数函数
00082 *@param     str:要转化字符串, len:整型数长度
00083 *@return    成功 - 1, 失败 - 0
00084 */
00085 int validatoi(char* str, int base,int* ret)
00086 {
00087   int c;
00088   char* tstr = str;
00089   if(str == 0 || *str == '\0') return 0;
00090   while(*tstr != '\0')
00091   {
00092     c = c2d(*tstr);
00093     if( c >= 0 && c < base) tstr++;
00094     else    return 0;
00095   }
00096   
00097   *ret = atoi16(str,base);
00098   return 1;
00099 }
00100 
00101 void HexToStr(char *pbDest, char *pbSrc, int nLen)
00102 {
00103     char    ddl,ddh;
00104     int i;
00105 
00106     for (i=0; i<nLen; i++)
00107     {
00108         ddh = 48 + pbSrc[i] / 16;
00109         ddl = 48 + pbSrc[i] % 16;
00110         if (ddh > 57) ddh = ddh + 7;
00111         if (ddl > 57) ddl = ddl + 7;
00112         pbDest[i*2] = ddh;
00113         pbDest[i*2+1] = ddl;
00114     }
00115     
00116     pbDest[nLen*2] = '\0';
00117 }
00118 
00119 void HexOutput(const char* buf, int len)
00120 {
00121     int i=0;
00122     printf("The Hex output of data :\n0x");
00123     for(i=0; i<len; ++i)
00124     {
00125         unsigned char c = buf[i]; // must use unsigned char to print >128 value
00126         if( c< 16)
00127         {
00128             printf("0%x ", c);
00129         }
00130         else
00131         {
00132             printf("%x ", c);
00133         }
00134     }
00135     printf("\n");
00136 }
00137 
00138 
00139 void reverse_u64(uint64_t *temp)
00140 {
00141     char temp_str[8];
00142     memset(temp_str,0x00,8);
00143     //printf("old data\n");
00144     //HexOutput((char *)temp,8);
00145     
00146     memcpy(temp_str+7,(char*)temp,1);
00147     memcpy(temp_str+6,(char*)temp+1,1);
00148     memcpy(temp_str+5,(char*)temp+2,1);
00149     memcpy(temp_str+4,(char*)temp+3,1);
00150   memcpy(temp_str+3,(char*)temp+4,1);
00151   memcpy(temp_str+2,(char*)temp+5,1);
00152     memcpy(temp_str+1,(char*)temp+6,1);
00153     memcpy(temp_str,(char*)temp+7,1);
00154     
00155     memcpy((char *)temp,temp_str,8);
00156     
00157     //printf("new data\n");
00158     //HexOutput((char *)temp,8);
00159 }
00160 
00161 
00162 void reverse_u32(uint32_t *temp)
00163 {
00164     char temp_str[4];
00165     memset(temp_str,0x00,4);
00166     //USARTX_SendData(USART1,(char *)temp,4);
00167     
00168   memcpy(temp_str+3,(char*)temp,1);
00169   memcpy(temp_str+2,(char*)temp+1,1);
00170     memcpy(temp_str+1,(char*)temp+2,1);
00171     memcpy(temp_str,(char*)temp+3,1);
00172     
00173     memcpy((char *)temp,temp_str,4);
00174     
00175     //USARTX_SendData(USART1,(char *)temp,4);
00176 }
00177 
00178 void reverse_u16(uint16_t *temp)
00179 {
00180     char temp_str[2];
00181     memset(temp_str,0x00,2);
00182     //USARTX_SendData(USART1,(char *)temp,2);
00183     
00184     memcpy(temp_str+1,(char*)temp,1);
00185     memcpy(temp_str,(char*)temp+1,1);
00186     
00187     memcpy((char *)temp,temp_str,2);
00188     
00189     //USARTX_SendData(USART1,(char *)temp,2);
00190 }
00191 
00192 
00193 //设置栈顶地址
00194 //addr:栈顶地址
00195 __asm void MSR_MSP(u32 addr) 
00196 {
00197     MSR MSP, r0             //set Main Stack value
00198     BX r14
00199 }