| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- #include "tools.h"
- #include "includes.h"
- #define CRC16_INIT_VALUE 0x0000
- //CRC校验
- //CRC16-IBM
- uint16_t CRC16_get(uint8_t *_buff,uint32_t _len)
- {
- uint32_t i,j;
- uint16_t crc;
- uint16_t temp;
- crc=(uint16_t)CRC16_INIT_VALUE;
- for(i=0;i<_len;i++) {
- temp=_buff[i];
- temp &=0x00FF;
- crc^=temp;
- for(j=0;j<8;j++) {
- if((crc&0x0001)!=0x00) {
- crc>>=1;
- crc^=0xA001;
- } else {
- crc>>=1;
- }
- }
- }
- return crc;
- }
- //数组比较
- //返回,0:相同;1:不同
- uint8_t buff_compare(uint8_t *buf1, uint8_t *buf2, uint16_t len)
- {
- uint8_t ret = 0;
- uint16_t i;
- for(i = 0; i < len; i++)
- {
- if(buf1[i] != buf2[i])
- {
- ret = 1;
- break;
- }
- }
- return ret;
- }
- //异或和计算
- uint8_t get_xor(uint8_t *buf, uint16_t len)
- {
- uint16_t i;
- uint8_t data = 0;
- for(i = 0; i < len; i++)
- {
- data ^= buf[i];
- }
- return data;
- }
- //报税口明文协议校验
- uint8_t _crc_get_gw(uint8_t *data, uint8_t size)
- {
- uint8_t i, crc = 0;
-
- for(i = 0;i < size;i++){
- crc ^=data[i];
- }
-
- return crc;
- }
- //字符串转十六进制数
- uint32_t strtohex(char *data, uint8_t len)
- {
- uint32_t p_data = 0;
- uint8_t temp;
- uint8_t i = 0;;
-
- for(i = 0; i < len; i++)
- {
- temp = HexToChar(data[i]);
- if(temp == 0xff)
- break;
- p_data = (p_data<<4)|temp;
- }
- return p_data;
- }
- //flash内数据的crc16校验
- uint16_t CRC16_get_flash(uint32_t addr, uint32_t len)
- {
- uint32_t i,j;
- uint16_t crc;
- uint16_t temp;
- crc=(uint16_t)CRC16_INIT_VALUE;
- FLASH_Unlock();// Unlock the Flash to enable the flash control register access
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // Clear pending flags (if any)
- for(i=0;i<len;i++) {
- temp=*(__IO uint8_t *)(addr+i);
- temp &=0x00FF;
- crc^=temp;
- for(j=0;j<8;j++) {
- if((crc&0x0001)!=0x00) {
- crc>>=1;
- crc^=0xA001;
- } else {
- crc>>=1;
- }
- }
- }
- FLASH_Lock(); // Lock the Flash to disable the flash control register access
- return crc;
- }
- //显示屏升级校验
- void GetCodeVerify(uint32 _start,uint32 _len,uint32 * _verify)
- {/*{{{*/
- uint32 verifySum;
- uint32 verifyXor;
- // uint32 * pBuff;
- uint32 i;
- // pBuff=(uint32 *)_start;
- verifySum=0xAA555AA5;
- verifyXor=0x55AAA55A;
- FLASH_Unlock();// Unlock the Flash to enable the flash control register access
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // Clear pending flags (if any)
- for(i=0;i<_len/4;i++)
- {
-
- verifySum+=*(__IO uint32_t *)(_start+i*4);
- verifyXor^=*(__IO uint32_t *)(_start+i*4);
-
- // verifySum+=*pBuff;
- // verifyXor^=*pBuff;
- // pBuff++;
- }
- _verify[0]=verifyXor;
- _verify[1]=verifySum;
- FLASH_Lock(); // Lock the Flash to disable the flash control register access
- // printf("verifyxor=0x%08x,verifysum=0x%08x\n",verifyXor,verifySum);
- }/*}}}*/
- //显示屏升级校验
- void GetCodeVerify_t(uint32 _start,uint32 _len,uint32 * _verify)
- {/*{{{*/
- uint32 verifySum;
- uint32 verifyXor;
- uint32 * pBuff;
- uint32 i;
- pBuff=(uint32 *)_start;
- verifySum=0xAA555AA5;
- verifyXor=0x55AAA55A;
- for(i=0;i<_len/4;i++)
- {
- verifySum+=*pBuff;
- verifyXor^=*pBuff;
- pBuff++;
- }
- _verify[0]=verifyXor;
- _verify[1]=verifySum;
- }/*}}}*/
- /*转义*/
- uint8_t Buff_Code[256];
- int _ytsf_data_code(uint8_t *buff, uint8_t *len)
- {
- // uint8_t buff_code[256];
- uint8_t i, tlen = 0;
- memset(Buff_Code,0,sizeof(Buff_Code));
- /* 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
- BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
- 来计算。*/
- for(i = 0;i < *len; i ++){
- if(buff[i] == 0xba){
- Buff_Code[tlen++] = 0xba;
- Buff_Code[tlen++] = 0x00;
- } else if(i&&buff[i] == 0xbb){
- Buff_Code[tlen++] = 0xba;
- Buff_Code[tlen++] = 0x01;
- }
- else{
- Buff_Code[tlen++] = buff[i];
- }
- }
- memcpy(buff, Buff_Code, tlen);
- *len = tlen;
- return 0;
- }
- /*反转义*/
- int _ytsf_data_decode(uint8_t *buff, uint8_t *len)
- {
- // uint8_t buff_code[128];
- uint8_t i, tlen = 0;
- memset(Buff_Code,0,sizeof(Buff_Code));
- /* 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
- BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
- 来计算。*/
- for(i = 0;i < *len; i ++){
- if((buff[i] == 0xba)&&(buff[i+1] == 0x00)) {
- Buff_Code[tlen++] = 0xba;
- i += 1;
- } else if((buff[i] == 0xba)&&(buff[i+1] == 0x01)){
- Buff_Code[tlen++] = 0xbb;
- i += 1;
- }
- else{
- Buff_Code[tlen++] = buff[i];
- }
- }
- memcpy(buff, Buff_Code, tlen);
- *len = tlen;
- return 0;
- }
- //十六进制字符串转十进制数
- long HextoDec(char *s)
- {
- int i,t;
- long sum=0;
- for(i=0;s[i];i++)
- {
- if(s[i]<='9')
- t=s[i]-'0';
- else
- t=s[i]-'A'+10;
- sum=sum*16+t;
- }
- return sum;
- }
- unsigned char HexToChar(unsigned char bChar)
- {
- if((bChar>=0x30)&&(bChar<=0x39))
- {
- bChar -= 0x30;
- }
- else if((bChar>=0x41)&&(bChar<=0x46)) // Capital
- {
- bChar -= 0x37;
- }
- else if((bChar>=0x61)&&(bChar<=0x66)) //littlecase
- {
- bChar -= 0x57;
- }
- else
- {
- bChar = 0xff;
- }
- return bChar;
- }
- //ascii转十六进制
- int asciitohex(char *data, uint8_t *out_data, int len)
- {
- int i,slen=0;
- uint8_t temp1,temp2;
- for(i = 0; i < len; i+=2)
- {
- temp1 = HexToChar(data[i]);
- temp2 = HexToChar(data[i+1]);
- out_data[slen] = (temp1<<4) | temp2;
- slen++;
- }
- return slen;
- }
- //十进制转BCD码
- int decimal_bcd_code(int decimal)
- {
- int sum = 0; //sum返回的BCD码
- int i;
- for (i = 0; decimal > 0; i++)
- {
- sum |= ((decimal % 10 ) << ( 4*i));
- decimal /= 10;
- }
- return sum;
- }
- /**************************************************************************
- 以下定时器均由滴答定时器驱动,systickCount
- ***************************************************************************/
- /**
- * @brief 设置定时器
- * @par param[timeout_t] *tt
- * @par param[uint32_t] val,延时ms
- * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
- */
- void timeout_setValue(timeout_t *tt,uint32_t val,uint8_t flg){
- tt->flag = flg;
- tt->count = TickCounter;
- tt->timeout = val;
- };
- /**
- * @brief 启动定时器
- * @par param[timeout_t] *tt
- * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
- */
- /**
- * @brief 启动定时器
- * @param tt 定时器指针
- * @param flg 是否开启
- */
- void timeout_start(timeout_t *tt,uint8_t flg){
- tt->flag = flg;
- if(flg){
- tt->count = TickCounter;
- }
- };
- /**
- * @brief 停止定时器
- * @param tt 定时器指针
- */
- void timeout_stop(timeout_t *tt){
- tt->flag = 0;
- };
- /**
- * @brief 返回定时器是否超时
- * @param tt 定时器指针
- * @return uint8_t 1:超时,0:未超时
- */
- uint8_t timeout_isOut(timeout_t *tt){
- if(tt->flag){
- if((TickCounter - tt->count) > tt->timeout){
- tt->count = TickCounter;
- if(tt->flag == 1){
- tt->flag = 0;
- }
- return 1;
- }
- else{
- return 0;
- }
- }
- else{
- return 0;
- }
- };
- /**************************************************************************
- 以上定时器均由滴答定时器驱动,systickCount
- ***************************************************************************/
- /**************************************************************************
- 以下定时器均由timer定时器驱动,Tickcount_us
- ***************************************************************************/
- /**
- * @brief 设置定时器
- * @par param[timeout_t] *tt
- * @par param[uint32_t] val,延时10us
- * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
- */
- void timeout_setValue_us(timeout_t *tt,uint32_t val,uint8_t flg){
- tt->flag = flg;
- tt->count = Get_Time();
- tt->timeout = val;
- };
- /**
- * @brief 启动定时器
- * @par param[timeout_t] *tt
- * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
- */
- /**
- * @brief 启动定时器
- * @param tt 定时器指针
- * @param flg 是否开启
- */
- void timeout_start_us(timeout_t *tt,uint8_t flg){
- tt->flag = flg;
- if(flg){
- tt->count = Get_Time();
- }
- };
- /**
- * @brief 停止定时器
- * @param tt 定时器指针
- */
- void timeout_stop_us(timeout_t *tt){
- tt->flag = 0;
- };
- /**
- * @brief 返回定时器是否超时
- * @param tt 定时器指针
- * @return uint8_t 1:超时,0:未超时
- */
- uint8_t timeout_isOut_us(timeout_t *tt){
- if(tt->flag){
- if((Get_Time() - tt->count) > tt->timeout){
- tt->count = Get_Time();
- if(tt->flag == 1){
- tt->flag = 0;
- }
- return 1;
- }
- else{
- return 0;
- }
- }
- else{
- return 0;
- }
- };
- /**************************************************************************
- 以上定时器均由timer定时器驱动,Tickcount_us
- ***************************************************************************/
- //串口波特率判断
- //返回值:1 数据正确,2 数据错误
- uint8_t uart_baud_judge(uint32_t baud)
- {
- //波特率范围1200到460800
- if(baud >= 1200 && baud <= 460800)
- return 1;
- else
- return 0;
-
- }
- //判断数组是否全部为0
- //返回值:1 全为0,0 不全为0
- uint8_t buf_is_zero(uint8_t *buf, uint16_t size)
- {
- int i;
- for(i = 0; i < size; i++)
- {
- if(buf[i])
- break;
- }
- if(i == size)
- return 1;
- else
- return 0;
- }
- //printf打印函数
- void printf_debug(uint8_t cmd1, const char *fmt, ...)
- {
- va_list args; //定义一个va_list类型的变量,用来储存单个参数
- if(cmd1)
- {
- va_start(args, fmt); //使args指向可变参数的第一个参数
- vprintf(fmt, args); //必须用vprintf等带V的
- va_end(args); //结束可变参数的获取
- }
- }
- //十六进制打印
- void data_dump_debug(uint8_t cmd1, const char *name, uint8_t *data, uint16_t len)
- {
- if(cmd1)
- {
- data_dump(name, data, len);
- }
- }
|