demo板测试:1、首先测试电源部分是否正常 DC-DC电源精度2、MCU供电正常后,烧写程序是否可成功3、MCU IO输出输入是否正常(焊接mcu芯片经常出现IO引脚没焊成功)4、时钟是否正常,定时器定时是否准确(这点十分重要)5、GPIO驱动的时候要考虑GPIO的驱动电流能不能达到要求,不能的话则换做开关三极管驱动。6、驱动继电器的三极管坏了 换了一个才好了,蜂鸣器不响7、串口:usart1发送没问题,接收数据的时候程序进入HardFault_Handler,仿真时是有接收到数据的;usart2和串口3 rxd txd都正常;问题好像是系统时钟不是72Mhz,U1接收程序里开启定时器导致的。8、多个仿真器多块板子一起测试,测试不同的程序,加快测试进度。
把上面这个if语句注释了 才不会进入HardFault_Handler;
软件问题:
1 、之前上传卡号不满十位才成功 天杀的switch () case: 例子里break;忘了加!!!!!!!!!!!!!!!!
2、IC卡刷卡进串口中断,有时候收到数据全是0,有时候只收到卡号的首字节 卡还没刷 误入刷IC串口中断 每次刷完卡 会误入串口刷卡中断多次(估计串口时钟问题或者大概率接触不良 IC卡刷卡模块用串口调试助手测试时不会出现这种误发数据的问题)
刷卡卡离开之后多次误进入串口接收中断: 原因: 天杀的接触不良!!!3、
(1)心跳包: mac地址待修改;
(2)卡号同步:
(3)上传卡号: 误触发原因及处理方法;
(4)高速信号不要尽量不要杜邦线吧。。
(5)多次重复进入串口接收里用的定时器中断
(6)TCP 频繁主动断开重连 reconnect 连接之前先检查连接状态(是否真实有效)? 如果已连接是否不断开也不重连
基本有效,也存在失真情况;
(7)刷卡用的串口3和A9占用的串口2 是有联系的,刷卡事件产生后,进入usart3中断,然后会向服务器发送刷卡数据,这个时候需要AT指令,所以会发生串口2中断
(8)目前存在原因 刷卡后调用AT+CIPSEND指令,A9占用的串口2有发生串口中断(进入一次),但受到数据是空的,且USART2_RX_STA=0
(9)服务器给设备发信息后,串口2收到数据,之后串口3刷卡都出了问题,刷卡只收到卡号的第一个字节;刷卡串口RXD响应还很慢;已解决(10)目前问题: 服务器发送回数据后,之后的串口2rxd用不了了,A9指令返回的数据RXD收不到,USART2_RX_STA一直为0 a9gprs_reconnect() 刷卡后:发送卡号数据执行下列语句: sprintf(cmd,"AT+CIPSEND=%d",length); a9_send_cmd(cmd," ",200);//返回的不是OK 是" >" 4个十六进制 0D 0A 3E 20 USART2_SEND(sendbuf,length);
串口2没有收到任何数据,在USART2_SEND(sendbuf,length)之后才收到一个字节的数据,数据为0X0D
(11)错误时序: 刷卡-》刷卡串口收到数据-》上发刷卡记录-》刷卡串口清除中断标志位-》A9串口2产生中断,收到一个字节数据,0x0D
串口2中断优先级:
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3刷卡定时器3中断优先:
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3上述错误时序解决办法:设置串口的抢占优先级高于定时器3的抢占优先级;为避免串口接收数据出错,尽量让串口中断优先级高于定时器优先级。
刷卡正常时序: 刷卡串口3中断-》串口3中断执行完毕-》串口3内定时器3中断-》TIMER3 中断执行,发送卡号 -》串口2中断-》串口2中断执行完毕-》TIMER4中断 并执行-》定时器3中断执行完毕;
上述时序要正常执行,要确保串口2抢占优先级>=TIMER4抢占优先级>串口3>TIMER3 同时注意心跳包的抢占优先级不要高于响应刷卡的串口的抢占优先级,要确保刷卡开门快速正常响应。
COMMAND NO RESPONSE! 错误判断网络连接状态 实际上并没有连接 收到CONNECT AT+CIPSEND=100 100个字节没有上发成功,过了好几秒收到 COMMAND NO RESPONSE! 服务器端显示无连接。
5、USART2_RX_STA异常置高位,导致USART2接收数据失败: a9_send_cmd(cmd," ",200);//发送指令 USART2_RX_STA=0;//清楚标志 //可能情况:指令发送完毕,USART2中断->USART2_RX_STA标志置零->USART2中断内开的TIMER4中断->USART2_RX_STA 被置位
解决方法:
a9_send_cmd(cmd," ",200);//发送指令 delay_ms(20);//延时时间大于TIMER4设置的时间 USART2_RX_STA=0;//清楚标志如果cmd是AT+CIPSEND 注意send 完数据后A9会返回/r/nOK/r/n
该函数里的AT指令发送函数全部没有收到应答,这函数之后才收到一次串口中断,但USART2_RX_STA=0;之后又串口2RXD又恢复正常,正常接收数据。
坑爹的A9 CIPSEND 和ESP32s是很不一样的,
"AT+CIPSEND=10" 指令发送成功后返回的内容不是"OK",是" >" 4个十六进制数:0D 0A 3E 20软件问题总结:
1、中断嵌套时序问题,抢占优先级;
2、USART2_RX_STA第15位异常置高位,导致USART2_RXD失效
3、AT+CIPSEND 问题
7、
出现过不准的情况
串口明明在发数据,这里显示Clock Disabled
目前8Mhz的程序用我的板子启动失败,用买的板子启动成功,HSE启动失败,则SYSCLK被强制设置为8Mhz,delay_ms()匹配为8M的情况。目前有种可能:STM32芯片有问题,之前出现过芯片部分功能异常的情况。
目前问题:USART2_RX_STA在心跳包发送完毕之后没有置零。U2_RX内容是\r\n> U2_TX 内容为AT+CIPSEND=91 原因分析:心跳包程序: //发送心跳包内容 res=(u8*)http_heartbeat(DOOR_Control_OPEN); NO_CONCERN_ACK=0; sprintf(cmd,"AT+CIPSEND=%d",strlen((const char*)res)); a9_send_cmd(cmd,">",200); USART2_RX_STA=0;//应在此处添加 USART2_RX_STA=0; 清除标志 出错的程序在没有这个清零标志 NO_CONCERN_ACK=1; USART2_SEND(res,strlen((const char*)res)); myfree(res); myfree(cmd); TIM_SetCounter(TIM2,0); TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志重点:每一个独立逻辑操作里的最后一条AT指令执行完毕之后,都要添加USART2_RX_STA=0; 清除标志,确保后面USART2_RXD接收函数可以有效执行。(比如一下部分:心跳包、发送卡号、重连)
本地无该卡号:GET http://app.tdvpn.com/cards?mac=003e05000456&card=0568385307/ HTTP/1.1Host:localhost
本地有卡号:
GET http://app.tdvpn.com/acrecord?mac=003e05000453&type=1&num=0568385307/ HTTP/1.1Host:localhost
测试服务器返回数据:
{"key":"1584","action":"1"}
注意 是双引号 不是单引号,cjson要求是双引号。 p=0;//指向空地址 TSM12MC 触摸板 17脚out1 触摸CS1后电平从1.58变为0 无外围接上拉电阻 触摸强度弱点 也有从1.58->1.03 20脚INT接上拉10K电阻时,触摸CS1电平从3.28->2.94 或2.64 2.94多点TTL电平变化 out1和INT都是open drain output
软件逻辑:stm32 usart2串口rx收到http发给A9的数据,然后去处理解析数据,cJSON_Parse(),然后要重连,这个串口2中断处理函数认为还没处理完毕,因为cJSON_Parse()在中断处理函数中,这个时候想要再进中断怎么办,解除挂起的串口中断? 那再进中断,会有哪些问题,是否会影响原有的中断处理函数里的操作。(CM3参考手册有讲,中断) GET http://app.tdvpn.com:8080/httpdoor/heartbeat?mac=898607B8101 7/ HTTP/1.1 Host:localhost
转载于:https://www.cnblogs.com/fyp7077/p/8064596.html
相关资源:基于Altium Designer的数码管显示电路的PCB板设计