MDK 出现#68-D: integer conversion resulted in a change of sign(转)

在KeilARM的LPCARM,存在(1<<31)编译警告问题main.c(174): warning: #61-D: integer operation result is out of rangemain.c(174): warning: #68-D: integer conversion resulted in a change of sign由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,这样就有可能改写了符号位(最高位)依此类推,(2<<30),(3<<29)…等都会出现编译警告问题.解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),…

keil5 编译程序出现错误Error: L6411E: No compatible library exists with a definition of startup symbol __main(转)

Error: L6411E: No compatible library exists with a definition of startup symbol __main.
之前装过ADS,ADS与MDK冲突,依据网友提供的资料,最终的解决办法如下

在我的电脑点击属性>高级系统设置>高级>环境变量>在系统变量中>新建
(如果我的电脑只是快捷方式则属性中不会出现环境变量,需要在屏幕空白处右击,选择个性化,主题,找到桌面图标设置(系统不同,位置不一定一样,在个性化中可以找到),将计算机选项勾选即可)
变量名: ARMCC5LIB      
变量值:F:\Keil_v5\ARM\ARMCC\lib
(变量值是keil的安装目录,本人安装目录在F:\Keil_v5,剩下的目录是安装时系统自己建立,直接相同即可)
———————
作者:lnwechag
来源:CSDN
原文:https://blog.csdn.net/lnwechag/article/details/50760001
版权声明:本文为博主原创文章,转载请附上博文链接!

CH372实现HID键盘功能

有些IC发卡器在刷卡时,卡号可以填写在文档光标处。这种产品很多年前就有了,最近刚好有客户有这方面需求,用CH372做了一款HID键盘类型的发卡器。

一款HID设备包括设备描述符,配置描述符,接口描述符,端点描述符,HID描述符,HID描述符包括报告描述符,另外还有字符串描述符,语言描述符。对HID键盘设备,用BusHound抓包时没看到PC请求语言描述符和字符串描述符。

设备描述符:

image

image

配置描述符:

image

image

image

image

报告描述符: 继续阅读

LPC1768 内部RTC程序

typedef struct{

uint8_t RTC_Sec;

uint8_t RTC_Min;

uint8_t RTC_Hour;

uint8_t RTC_Mday;

uint8_t RTC_Wday;

uint16_t RTC_Yday;

uint8_t RTC_Mon;

uint16_t RTC_Year;

}RTCTime;

RTCTime LocalTime;

void RTCStart(void)

{

LPC_RTC->CCR |= 0x01;

}

void RTCInit( void )

{

LPC_SC->PCONP |= CLKPWR_PCONP_PCRTC; //开启RTC电源

if(!(LPC_RTC->CCR & 0x01)) //如果时钟没使能,使能时钟,使能位在芯片复位时状态不会变化,不用每次上电都使能

{

LPC_RTC->ILR = 0;

LPC_RTC->AMR = 0xff;

LPC_RTC->CIIR = 0;

LPC_RTC->CCR = 0;

LocalTime.RTC_Year = 2019;

LocalTime.RTC_Mon = 1;

LocalTime.RTC_Mday = 1;

LocalTime.RTC_Wday = 2;

LocalTime.RTC_Hour = 0;

LocalTime.RTC_Min = 0;

LocalTime.RTC_Sec = 0;

RTCSetTime(&LocalTime);

RTCStart();

}

}

void RTC_Get_Time(RTCTime* Time)

{

Time->RTC_Year= LPC_RTC->YEAR ;

Time->RTC_Mon = LPC_RTC->MONTH;

Time->RTC_Yday = LPC_RTC->DOY;

Time->RTC_Wday = LPC_RTC->DOW;

Time->RTC_Mday = LPC_RTC->DOM;

Time->RTC_Hour = LPC_RTC->HOUR;

Time->RTC_Min = LPC_RTC->MIN;

Time->RTC_Sec = LPC_RTC->SEC;

}

void RTCSetTime(RTCTime* Time)

{

LPC_RTC->SEC = Time->RTC_Sec;

LPC_RTC->MIN = Time->RTC_Min;

LPC_RTC->HOUR = Time->RTC_Hour;

LPC_RTC->DOM = Time->RTC_Mday;

LPC_RTC->DOW = Time->RTC_Wday;

LPC_RTC->DOY = Time->RTC_Yday;

LPC_RTC->MONTH = Time->RTC_Mon;

LPC_RTC->YEAR = Time->RTC_Year;

}

LPC1768读写W25Q128程序

uint8_t W25QXX_Buf[4096];

GPIO设置

/*SPI pin set*/

PinCfg.Funcnum = PINSEL_FUNC_3;

PinCfg.Portnum = 0;

PinCfg.Pinmode = PINSEL_PINMODE_TRISTATE;

PinCfg.Pinnum = SPI_SCK;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MOSI;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MISO;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Funcnum = PINSEL_FUNC_0;

PinCfg.Portnum = 0;

PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL;

PinCfg.Pinnum = SPI_CS;

PINSEL_ConfigPin(&PinCfg);

GPIO_SetDir(0, (1<<SPI_CS), 1);

GPIO_SetValue(0, (1<<SPI_CS));

void Spi_Initial(void)

{

SPI_CFG_Type spi0;

spi0.CPHA = SPI_CPHA_FIRST;

spi0.CPOL = SPI_CPOL_LO;

spi0.ClockRate = 3125000; //spi_clk = 25000000,25000000/8=3125000,能使用的最高频率

spi0.DataOrder = SPI_DATA_MSB_FIRST;

spi0.Databit = SPI_DATABIT_8;

spi0.Mode = SPI_MASTER_MODE;

SPI_Init(LPC_SPI,&spi0);

}

uint8_t SPIF_POLLING(void)

{

uint8_t n = 0xff;

while (n–)

{

if (LPC_SPI->SPSR & 0x80)

return TRUE;

}

return FALSE;

}

继续阅读

TCP相关知识

1、 三次握手过程最后一个数据包丢失

当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server,如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒,6秒,12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。

如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server端写数据,Server端将以RST包响应,Client端方能感知到Server端的错误,从而断开连接。

2、 TCP状态变迁

客户端:CLOSED-SYN_SENT_ESTABLISED-FIN_WAIT_1-FIN_WAIT_2-TIME_WAIT-CLOSED

服务器端:CLOSED-LISTEN-SYN_RCVD-ESTABLISED-CLOSE_WAIT-LAST_ACK-CLOSED

3、 TCP协议RST标志

发送RST包关闭连接时,不必等待缓冲区的包都发出去,直接丢弃缓冲区的包,发送RST包。

接收端收到RST包后,也不必发送ACK包来确认。

四次握手不是关闭TCP连接的唯一方法,有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST包将被发送,由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记),但在正常的TCP连接中RST包可以带ACK确认标记,RST包是可以不要收到对方确认的。

处于LISTEN状态的控制块只能响应SYN握手包,对非SYN握手包返回一个RST报文。

以太网帧结构

帧结构图:

clip_image002

前同步码和帧开始定界符:一个帧以7个字节的前导码和1个字节的帧开始符作为帧的开始。在线路上帧的这部分的位模式是10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011。

MAC 目的地址:第三个字段是6字节(MAC地址占48位,如:FF,FF,FF,FF,FF),发送方的网卡(MAC)地址,用处是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同则会进一步处理,不同则直接丢弃。

源MAC地址:发送端的MAC地址同样占6个字节。

类型:该字段在网络协议栈分解中及其重要,考虑当PDU(协议数据单元)来到某一层时,它需要将PDU交付给上层,而上层协议众多,所以在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0x0800时,表示将有效载荷交付给IP协议,为0x0806交付给ARP,0X8035交付给RARP。

数据:数据也叫有效载荷,除过当前层协议需要使用的字段外,即需要交付给上层的数据,以太网帧数据长度规定最小为46字节,最大为1500字节,如果有不到46字节时,会用填充字节填充到最小长度。最大值也叫最大传输单元(MTU)。

帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错。抓包时无法看到4字节校验值。

以太网规定以太网帧数据域部分最小为64字节(6字节目的MAC地址+6字节源MAC地址+2字节协议类型+最小46字节数据+4字节CRC校验),CRC校验抓包时无法看到。数据字段长度小于46字节时,MAC子层会在数据字段的后面填充以满足数据帧长度不小于64字节。由于填充数据由MAC子层负责,不同的抓包软件抓到的数据帧大小可能不同,比如一个TCP的ACK确认帧,有的抓包软件显示是54字节,有的显示是60字节。显示60字节的后面有填充数据段。

TCP连接过程解析

TCP客户端和服务器之间建立连接的过程称为3次握手过程。握手过程由客户端程序首先发起,整个过程要经历下面3个步骤:

1、客户端发送一个SYN标志置1的TCP报文段,报文段首部指明自己的端口号及期望连接的服务器端口好。在报文段中,客户端需要通告自己的初始序号ISN,除此之外,这个报文中还可以携带一些选项字段,例如最大报文段大小、窗口扩大因子,选项将客户端的一些连接属性通告给服务器。本报文段中ACK标志为0,因此它的确认号字段和通告窗口大小字段都会被视为无效。

00 E0 66 78 3A 84 E2 BB BC 41 4F 5A 08 00 45 00 00 3C 55 24 40 00 40 06 5B B6 C0 A8 03 77 C0 A8 05 1A E2 9E 1F 99 BE B1 91 02 00 00 00 00 A0 02 39 08 6F 08 00 00 02 04 05 B4 04 02 08 0A FF FF C4 26 00 00 00 00 01 03 03 02

00 E0 66 78 3A 84-以太网目的地址

E2 BB BC 41 4F 5A -以太网源地址

0800-帧类型,IP数据包

后面的为IP数据包

45-4表示使用IPV4版本,5*4=20字节,表示IP首部长度是20字节

00-TOS,描述当前IP数据报急需的服务类型,如最小延时,最大吞吐量,最高可靠性,最小费用等。路由器在转发数据报时,可以根据这个字段的值来为数据报选择最合理的路由路径。

003C-总长度,表示整个IP数据报(IP首部和数据区)的总字节数。总共60字节。

5524-16位标识字段,用于标识IP层发送出去的每一份IP数据报,每发送一份报文,该值加1,数据包被分片时,该字段会被复制到每一个分片中,在接收端,会使用这个字段值来组装所有分片为一个完整的数据报。

4000-3位标志字段和13位分片偏移量。高3位为010,第1位保留为今后使用,第2位是不分片位,此处为1,表示不分片。当该位为0时,IP层将在需要的时候对数据报进行分片处理。第3位表示更多分片位,此处为0,表示该分片是数据报的最后一个分片或者是唯一的分片,如果为1,说明该分片不是数据报的最后一个分片,后面还有分片的数据包。

13位偏移字段表示当前分片所携带的数据在整个数据报中的相对位置(以8字节为单位)。目的站必须收到从0偏移量到最高偏移量的所有分片,才能将分片重装成一个完整的数据报。每个分片在网络中断单独传输,它们到达终点的顺序可能会不相同,但在目的端,将按照分片的偏移量来顺序组织各个分片。

40-生存时间TTL。描述该IP数据报最多能被转发的次数,每经过一次转发,该值会减1,当该值为0时,路由器会丢弃掉分组,同时一个ICMP差错报文会被返回至源主机。

06-协议字段,1-表示ICMP协议,2-表示IGMP协议,6-表示TCP协议,17-表示UDP协议。

5BB6-首部校验和

C0A80377-源IP地址

C0A8051A -目的IP地址

继续阅读

CPU卡电子钱包圈存与消费(三)

三、 消费

1、选择3F01目录

Send Data : 00 A4 00 00 02 3F 01

RSP[88]: 6F 54 84 09 A0 00 00 00 03 86 98 07 01 A5 47 9F 08 01 02 9F 0C 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 00

2、取8字节随机数

Send Data :0084000008

RSP[10]: 9B 36 1B 26 CB 9F A8 C8 90 00

3、对随机数进行3DES加密

加密数据:9B 36 1B 26 CB 9F A8 C8

加密密钥:39393939393939393939393939393939(3F01目录外部认证密钥)

处理结果:97 F5 57 D8 ED E9 7F 95

4、外部认证

Send Data :008200000897F557D8EDE97F95

RSP[2]:9000

5、读余额

Send Data :805C000204

RSP[6]: 00 00 12 34 90 00

6、消费初始化

805001020B0000000002000000000001

RSP[17]: 00 00 12 34 00 00 00 00 00 00 01 2A B5 07 51 90 00

电子存折或电子钱包旧余额:00001234

电子存折或电子钱包脱机交易序号:0000

透支限额:000000

密钥版本号:00

算法标识:01

随机数:2A B5 07 51

计算过程密钥

过程密钥由DATA中第一字节即密钥标识符指定的消费密钥对(4字节随机数+2字节电子存折或电子钱包脱机交易序号+终端交易序号的最右两字节)3DES数据加密生成

终端交易序号在消费命令中指定,可以设置位00000000

密钥: 3E013E013E013E013E013E013E013E01
数据:2A B5 07 51 00 00 00 00
加密结果:3A A4 9C 8C D5 B4 45 75

计算消费命令中的MAC1

MAC1由过程密钥对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节终端交易日期+3字节终端交易时间)DES数据加密生成

交易金额:00000002

交易类型标识:

05-电子存折消费

06-电子钱包消费

终端机编号:000000000001

交易日期20180807

交易时间163500

clip_image002

得到MAC1 : 677E4922

7、消费

805401000F0000000020180807163500677E4922

RSP[10]: 78 5C 74 07 6B 7F 5B EC 90 00

交易验证码TAC: 78 5C 74 07

MAC2: 6B 7F 5B EC

校验MAC2

MAC2由过程密钥对4字节交易金额DES数据加密生成

clip_image004

加密结果见上图,校验成功。

校验TAC

TAC码由TAC密钥左右8字节异或运算的结果对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节终端交易序号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

内部密钥为:34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34

TacKey.Left(8) = 3434343434343434

TacKey.Right(8) = 3434343434343434

XOR 结果 = 0000000000000000

交易金额:00000002

交易类型:06

终端机编号:000000000001

终端交易序号:00000000

交易日期:20180807

交易时间:163500

clip_image006

加密结果见上图,校验成功。

8、读余额

805C000204

RSP[6]: 00 00 12 34 90 00

RSP[6]: 00 00 12 32 90 00

扣费成功

扣费不需要验证PIN码。

CPU卡电子钱包圈存与消费(二)

二、 圈存命令

1、选择3F01目录

Send Data : 00 A4 00 00 02 3F 01

RSP[88]: 6F 54 84 09 A0 00 00 00 03 86 98 07 01 A5 47 9F 08 01 02 9F 0C 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 00

2、取8字节随机数

Send Data :0084000008

RSP[10]: 9B 36 1B 26 CB 9F A8 C8 90 00

3、对随机数进行3DES加密

加密数据:9B 36 1B 26 CB 9F A8 C8

加密密钥:39393939393939393939393939393939(3F01目录外部认证密钥)

处理结果:97 F5 57 D8 ED E9 7F 95

4、外部认证

Send Data :008200000897F557D8EDE97F95

RSP[2]:9000

5、校验pin码

Send Data : 00 20 00 00 03 12 34 56
Recv Data : 90 00

6、读余额

Send Data : 80 5C 00 02 04

RSP[6]: 00 00 00 00 90 00

7、初始化圈存

Send Data : 80 50 00 02 0B 0000001234000000000001

RSP[18]: 00 00 00 00 00 00 00 01 F9 CA BA 91 6C 39 4D 64 90 00

电子存折或电子钱包旧余额 00000000

电子存折或电子钱包联机交易序号0000 (注意交易序号每次会变化)

密钥版本号:00

算法标识:01

伪随机数:F9 CA BA 91

MAC1: 6C 39 4D 64

算法标识

00-3DES

01-DES

02-255保留

计算过程密钥

过程密钥由DATA中第一字节即密钥标识符指定的圈存密钥对(4字节随机数+2字节电子存折或电子钱包联机交易序号+8000)3DES数据加密生成

密钥: 3F013F013F013F013F013F013F013F01
数据:F9 CA BA 91 00 00 80 00
加密结果:03 01 5B EA 34 7E A2 31

计算MAC1

MAC1由过程密钥对(4字节电子存折或电子钱包旧余额+4字节交易金额+1字节交易类型+6字节终端机编号)DES数据加密生成

交易类型:

旧余额:00000000

交易金额:00001234

交易类型:

01-电子存折圈存

02-电子钱包圈存

终端机编号:000000000001

KEY: 03 01 5B EA 34 7E A2 31

INITDATA: 0000000000000000

DATA: 000000000000123402000000000001

clip_image002

MAC的高4位和卡片返回的MAC1相等,证明命令执行正确

计算圈存命令中的MAC2

MAC2由过程密钥对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

交易金额:00001234

交易类型:02

终端机编号:000000000001

交易日期:20180805

交易时间:164522

密钥:03 01 5B EA 34 7E A2 31

初始向量: 0000000000000000

数据 : 000012340200000000000120180805164522

取前4个字节:

MAC2 = 7F4F6613

clip_image004

7、圈存

Send Data : 80 52 00 00 0B 201808051645227F4F6613

RSP[6]: F7 C1 CC 20 90 00

返回的交易验证TAC码:

F7 C1 CC 20

验证TAC码

TAC码由TAC密钥左右8字节异或运算的结果对(4字节电子存折或电子钱包新余额+2字节电子存折或电子钱包联机交易序号+4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

新余额:00001234

交易序号:0000

交易金额:00001234

交易类型标识:02

终端机编号:000000000001

交易日期:20180805

交易时间:164522

内部密钥为:34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34

TacKey.Left(8) = 3434343434343434

TacKey.Right(8) = 3434343434343434

XOR 结果 = 0000000000000000

密钥: 0000000000000000

初始向量: 0000000000000000

数据: 000012340000000012340200000000000120180805164522

clip_image006

计算结果MAC高4字节与卡片返回的TAC相同,圈存成功

8、读余额

Send Data : 80 5C 00 02 04

RSP[6]: 00 00 12 34 90 00

第 1 页,共 7 页12345...最旧 »