在线时间9 小时
UID3358377
ST金币0
蝴蝶豆0
注册时间2017-3-7
中级会员
- 最后登录
- 2020-3-21
|
发表于 2017-4-24 14:20:18
|
显示全部楼层
a0a.1 32b0c
接触STM32也就最近做的一个项目吧,时间也就是三月份。以前其实都没怎么调试过单片机,有过一次简单的在51单片机上实现一个功能。我们现在项目用的是STM32F107VCT6,其实刚开始要做这个项目时候,参考了别人的东西,就选择了STM32F107VCT6,本来我害怕ram不够,所以当时我想选择更高级点的STM32F4系列,至少可以扩展RAM,但是老板不干啊,成本问题哈哈哈。我也是在别人提供的例程代码中开始各种加入功能。其实也就是把单独的模块整合到一起。使用开发板的时候,问题遇到的比较少,后来我们自己设计的硬件回来了,很多模块的GPIO以及模块芯片都换了,这里要说说自己遇到的几个问题。我们换了一个PHY芯片,之前开发板用的是DP83848YB,现在换成了Realtek8201CP,其实换个PHY只需要将GPIO重新就行初始化,另外最重要的就是PHY地址要找到。Realtek8201CP这个芯片PHY地址是在上电的时候以LED 0-4这五个引脚来定义地址的,所以当时找了一个循环的方式读取找到地址,结果第二天PHY地址变了,当时就蒙了,为什么会变,其实我也不知道,所以我就觉得你要变就变,我每次上电都去确认PHY地址就行了。第二个就是读写Flash的问题,我发现我定义的结构在大量数据写入和读取的时候发现偏移地址不对,我当时找了好久,最后发现由于字节对齐原因,我定义的结构sizeof算出来的和我自己预估的多了几个字节,真是找死我了问题。最后我在结构前面加入#pragma pack(1)来强制对齐,这样这个问题也解决了,但是貌似这样有个缺点就是效率不高。第三个问题就是TCP通讯遇到的问题,程序卡在void tcp_fasttmr(void)函数中,我看网上也有资料,所以我就按照网上改了一下void tcp_fasttmr(void)的函数
void tcp_fasttmr(void)
{
struct tcp_pcb *pcb;
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
/* If there is data which was previously "refused" by upper layer */
if (pcb->refused_data != NULL) {
/* Notify again application with data previously received. */
err_t err;
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_fasttmr: notify kept packet\n"));
TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err);
if (err == ERR_OK) {
pcb->refused_data = NULL;
}
}
/* send delayed ACKs */
if (pcb->flags & TF_ACK_DELAY) {
LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
tcp_ack_now(pcb);
pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
}
}
}
目前我还在看是否有问题
对于新手的我来说,上边这些问题可能对于调试过的人没什么,但是对我们新手来说真的恼火,不过我相信遇到问题解决了就是经验,至少以后调试时遇到问题时无处下手。以上问题如果对你有用,一起进步,本来我准备买一本STM32 实战开发指南,没想到有活动,希望我能幸运吧。
|
|