tools.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. #include "tools.h"
  2. #include "includes.h"
  3. #define CRC16_INIT_VALUE 0x0000
  4. //CRC校验
  5. //CRC16-IBM
  6. uint16_t CRC16_get(uint8_t *_buff,uint32_t _len)
  7. {
  8. uint32_t i,j;
  9. uint16_t crc;
  10. uint16_t temp;
  11. crc=(uint16_t)CRC16_INIT_VALUE;
  12. for(i=0;i<_len;i++) {
  13. temp=_buff[i];
  14. temp &=0x00FF;
  15. crc^=temp;
  16. for(j=0;j<8;j++) {
  17. if((crc&0x0001)!=0x00) {
  18. crc>>=1;
  19. crc^=0xA001;
  20. } else {
  21. crc>>=1;
  22. }
  23. }
  24. }
  25. return crc;
  26. }
  27. //数组比较
  28. //返回,0:相同;1:不同
  29. uint8_t buff_compare(uint8_t *buf1, uint8_t *buf2, uint16_t len)
  30. {
  31. uint8_t ret = 0;
  32. uint16_t i;
  33. for(i = 0; i < len; i++)
  34. {
  35. if(buf1[i] != buf2[i])
  36. {
  37. ret = 1;
  38. break;
  39. }
  40. }
  41. return ret;
  42. }
  43. //异或和计算
  44. uint8_t get_xor(uint8_t *buf, uint16_t len)
  45. {
  46. uint16_t i;
  47. uint8_t data = 0;
  48. for(i = 0; i < len; i++)
  49. {
  50. data ^= buf[i];
  51. }
  52. return data;
  53. }
  54. //报税口明文协议校验
  55. uint8_t _crc_get_gw(uint8_t *data, uint8_t size)
  56. {
  57. uint8_t i, crc = 0;
  58. for(i = 0;i < size;i++){
  59. crc ^=data[i];
  60. }
  61. return crc;
  62. }
  63. //字符串转十六进制数
  64. uint32_t strtohex(char *data, uint8_t len)
  65. {
  66. uint32_t p_data = 0;
  67. uint8_t temp;
  68. uint8_t i = 0;;
  69. for(i = 0; i < len; i++)
  70. {
  71. temp = HexToChar(data[i]);
  72. if(temp == 0xff)
  73. break;
  74. p_data = (p_data<<4)|temp;
  75. }
  76. return p_data;
  77. }
  78. //flash内数据的crc16校验
  79. uint16_t CRC16_get_flash(uint32_t addr, uint32_t len)
  80. {
  81. uint32_t i,j;
  82. uint16_t crc;
  83. uint16_t temp;
  84. crc=(uint16_t)CRC16_INIT_VALUE;
  85. FLASH_Unlock();// Unlock the Flash to enable the flash control register access
  86. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // Clear pending flags (if any)
  87. for(i=0;i<len;i++) {
  88. temp=*(__IO uint8_t *)(addr+i);
  89. temp &=0x00FF;
  90. crc^=temp;
  91. for(j=0;j<8;j++) {
  92. if((crc&0x0001)!=0x00) {
  93. crc>>=1;
  94. crc^=0xA001;
  95. } else {
  96. crc>>=1;
  97. }
  98. }
  99. }
  100. FLASH_Lock(); // Lock the Flash to disable the flash control register access
  101. return crc;
  102. }
  103. //显示屏升级校验
  104. void GetCodeVerify(uint32 _start,uint32 _len,uint32 * _verify)
  105. {/*{{{*/
  106. uint32 verifySum;
  107. uint32 verifyXor;
  108. // uint32 * pBuff;
  109. uint32 i;
  110. // pBuff=(uint32 *)_start;
  111. verifySum=0xAA555AA5;
  112. verifyXor=0x55AAA55A;
  113. FLASH_Unlock();// Unlock the Flash to enable the flash control register access
  114. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // Clear pending flags (if any)
  115. for(i=0;i<_len/4;i++)
  116. {
  117. verifySum+=*(__IO uint32_t *)(_start+i*4);
  118. verifyXor^=*(__IO uint32_t *)(_start+i*4);
  119. // verifySum+=*pBuff;
  120. // verifyXor^=*pBuff;
  121. // pBuff++;
  122. }
  123. _verify[0]=verifyXor;
  124. _verify[1]=verifySum;
  125. FLASH_Lock(); // Lock the Flash to disable the flash control register access
  126. // printf("verifyxor=0x%08x,verifysum=0x%08x\n",verifyXor,verifySum);
  127. }/*}}}*/
  128. //显示屏升级校验
  129. void GetCodeVerify_t(uint32 _start,uint32 _len,uint32 * _verify)
  130. {/*{{{*/
  131. uint32 verifySum;
  132. uint32 verifyXor;
  133. uint32 * pBuff;
  134. uint32 i;
  135. pBuff=(uint32 *)_start;
  136. verifySum=0xAA555AA5;
  137. verifyXor=0x55AAA55A;
  138. for(i=0;i<_len/4;i++)
  139. {
  140. verifySum+=*pBuff;
  141. verifyXor^=*pBuff;
  142. pBuff++;
  143. }
  144. _verify[0]=verifyXor;
  145. _verify[1]=verifySum;
  146. }/*}}}*/
  147. /*转义*/
  148. uint8_t Buff_Code[256];
  149. int _ytsf_data_code(uint8_t *buff, uint8_t *len)
  150. {
  151. // uint8_t buff_code[256];
  152. uint8_t i, tlen = 0;
  153. memset(Buff_Code,0,sizeof(Buff_Code));
  154. /* 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
  155. BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
  156. 来计算。*/
  157. for(i = 0;i < *len; i ++){
  158. if(buff[i] == 0xba){
  159. Buff_Code[tlen++] = 0xba;
  160. Buff_Code[tlen++] = 0x00;
  161. } else if(i&&buff[i] == 0xbb){
  162. Buff_Code[tlen++] = 0xba;
  163. Buff_Code[tlen++] = 0x01;
  164. }
  165. else{
  166. Buff_Code[tlen++] = buff[i];
  167. }
  168. }
  169. memcpy(buff, Buff_Code, tlen);
  170. *len = tlen;
  171. return 0;
  172. }
  173. /*反转义*/
  174. int _ytsf_data_decode(uint8_t *buff, uint8_t *len)
  175. {
  176. // uint8_t buff_code[128];
  177. uint8_t i, tlen = 0;
  178. memset(Buff_Code,0,sizeof(Buff_Code));
  179. /* 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
  180. BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
  181. 来计算。*/
  182. for(i = 0;i < *len; i ++){
  183. if((buff[i] == 0xba)&&(buff[i+1] == 0x00)) {
  184. Buff_Code[tlen++] = 0xba;
  185. i += 1;
  186. } else if((buff[i] == 0xba)&&(buff[i+1] == 0x01)){
  187. Buff_Code[tlen++] = 0xbb;
  188. i += 1;
  189. }
  190. else{
  191. Buff_Code[tlen++] = buff[i];
  192. }
  193. }
  194. memcpy(buff, Buff_Code, tlen);
  195. *len = tlen;
  196. return 0;
  197. }
  198. //十六进制字符串转十进制数
  199. long HextoDec(char *s)
  200. {
  201. int i,t;
  202. long sum=0;
  203. for(i=0;s[i];i++)
  204. {
  205. if(s[i]<='9')
  206. t=s[i]-'0';
  207. else
  208. t=s[i]-'A'+10;
  209. sum=sum*16+t;
  210. }
  211. return sum;
  212. }
  213. unsigned char HexToChar(unsigned char bChar)
  214. {
  215. if((bChar>=0x30)&&(bChar<=0x39))
  216. {
  217. bChar -= 0x30;
  218. }
  219. else if((bChar>=0x41)&&(bChar<=0x46)) // Capital
  220. {
  221. bChar -= 0x37;
  222. }
  223. else if((bChar>=0x61)&&(bChar<=0x66)) //littlecase
  224. {
  225. bChar -= 0x57;
  226. }
  227. else
  228. {
  229. bChar = 0xff;
  230. }
  231. return bChar;
  232. }
  233. //ascii转十六进制
  234. int asciitohex(char *data, uint8_t *out_data, int len)
  235. {
  236. int i,slen=0;
  237. uint8_t temp1,temp2;
  238. for(i = 0; i < len; i+=2)
  239. {
  240. temp1 = HexToChar(data[i]);
  241. temp2 = HexToChar(data[i+1]);
  242. out_data[slen] = (temp1<<4) | temp2;
  243. slen++;
  244. }
  245. return slen;
  246. }
  247. //十进制转BCD码
  248. int decimal_bcd_code(int decimal)
  249. {
  250. int sum = 0; //sum返回的BCD码
  251. int i;
  252. for (i = 0; decimal > 0; i++)
  253. {
  254. sum |= ((decimal % 10 ) << ( 4*i));
  255. decimal /= 10;
  256. }
  257. return sum;
  258. }
  259. /**************************************************************************
  260. 以下定时器均由滴答定时器驱动,systickCount
  261. ***************************************************************************/
  262. /**
  263. * @brief 设置定时器
  264. * @par param[timeout_t] *tt
  265. * @par param[uint32_t] val,延时ms
  266. * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
  267. */
  268. void timeout_setValue(timeout_t *tt,uint32_t val,uint8_t flg){
  269. tt->flag = flg;
  270. tt->count = TickCounter;
  271. tt->timeout = val;
  272. };
  273. /**
  274. * @brief 启动定时器
  275. * @par param[timeout_t] *tt
  276. * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
  277. */
  278. /**
  279. * @brief 启动定时器
  280. * @param tt 定时器指针
  281. * @param flg 是否开启
  282. */
  283. void timeout_start(timeout_t *tt,uint8_t flg){
  284. tt->flag = flg;
  285. if(flg){
  286. tt->count = TickCounter;
  287. }
  288. };
  289. /**
  290. * @brief 停止定时器
  291. * @param tt 定时器指针
  292. */
  293. void timeout_stop(timeout_t *tt){
  294. tt->flag = 0;
  295. };
  296. /**
  297. * @brief 返回定时器是否超时
  298. * @param tt 定时器指针
  299. * @return uint8_t 1:超时,0:未超时
  300. */
  301. uint8_t timeout_isOut(timeout_t *tt){
  302. if(tt->flag){
  303. if((TickCounter - tt->count) > tt->timeout){
  304. tt->count = TickCounter;
  305. if(tt->flag == 1){
  306. tt->flag = 0;
  307. }
  308. return 1;
  309. }
  310. else{
  311. return 0;
  312. }
  313. }
  314. else{
  315. return 0;
  316. }
  317. };
  318. /**************************************************************************
  319. 以上定时器均由滴答定时器驱动,systickCount
  320. ***************************************************************************/
  321. /**************************************************************************
  322. 以下定时器均由timer定时器驱动,Tickcount_us
  323. ***************************************************************************/
  324. /**
  325. * @brief 设置定时器
  326. * @par param[timeout_t] *tt
  327. * @par param[uint32_t] val,延时10us
  328. * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
  329. */
  330. void timeout_setValue_us(timeout_t *tt,uint32_t val,uint8_t flg){
  331. tt->flag = flg;
  332. tt->count = Get_Time();
  333. tt->timeout = val;
  334. };
  335. /**
  336. * @brief 启动定时器
  337. * @par param[timeout_t] *tt
  338. * @par param[uint8_t] flg。0:不使能;1单次使能;0xFF连续使能
  339. */
  340. /**
  341. * @brief 启动定时器
  342. * @param tt 定时器指针
  343. * @param flg 是否开启
  344. */
  345. void timeout_start_us(timeout_t *tt,uint8_t flg){
  346. tt->flag = flg;
  347. if(flg){
  348. tt->count = Get_Time();
  349. }
  350. };
  351. /**
  352. * @brief 停止定时器
  353. * @param tt 定时器指针
  354. */
  355. void timeout_stop_us(timeout_t *tt){
  356. tt->flag = 0;
  357. };
  358. /**
  359. * @brief 返回定时器是否超时
  360. * @param tt 定时器指针
  361. * @return uint8_t 1:超时,0:未超时
  362. */
  363. uint8_t timeout_isOut_us(timeout_t *tt){
  364. if(tt->flag){
  365. if((Get_Time() - tt->count) > tt->timeout){
  366. tt->count = Get_Time();
  367. if(tt->flag == 1){
  368. tt->flag = 0;
  369. }
  370. return 1;
  371. }
  372. else{
  373. return 0;
  374. }
  375. }
  376. else{
  377. return 0;
  378. }
  379. };
  380. /**************************************************************************
  381. 以上定时器均由timer定时器驱动,Tickcount_us
  382. ***************************************************************************/
  383. //串口波特率判断
  384. //返回值:1 数据正确,2 数据错误
  385. uint8_t uart_baud_judge(uint32_t baud)
  386. {
  387. //波特率范围1200到460800
  388. if(baud >= 1200 && baud <= 460800)
  389. return 1;
  390. else
  391. return 0;
  392. }
  393. //判断数组是否全部为0
  394. //返回值:1 全为0,0 不全为0
  395. uint8_t buf_is_zero(uint8_t *buf, uint16_t size)
  396. {
  397. int i;
  398. for(i = 0; i < size; i++)
  399. {
  400. if(buf[i])
  401. break;
  402. }
  403. if(i == size)
  404. return 1;
  405. else
  406. return 0;
  407. }
  408. //printf打印函数
  409. void printf_debug(uint8_t cmd1, const char *fmt, ...)
  410. {
  411. va_list args; //定义一个va_list类型的变量,用来储存单个参数
  412. if(cmd1)
  413. {
  414. va_start(args, fmt); //使args指向可变参数的第一个参数
  415. vprintf(fmt, args); //必须用vprintf等带V的
  416. va_end(args); //结束可变参数的获取
  417. }
  418. }
  419. //十六进制打印
  420. void data_dump_debug(uint8_t cmd1, const char *name, uint8_t *data, uint16_t len)
  421. {
  422. if(cmd1)
  423. {
  424. data_dump(name, data, len);
  425. }
  426. }