cxhxy12345
cxhxy12345
This guy hasn't written anything yet

注册于 11 months ago

回答
337
文章
0
关注者
3

你好,LWip是一个轻量及的IP协议栈,里面设计的内容太多。首先你需要对IP,TCP,UDP,ICMP有个简单的了解后再看这个就比较容易理解。
推荐一个网站(http://www.nongnu.org/lwip/2_0_x/group__socket.html),非常详细地介绍了这个栈的内容,包括基本网络套接字的用法,如果你不想看协议内容,就对套接字的详细用法按照介绍步骤去用也可以。
如果有帮助,请赞同下。

这篇文章时将USB接口作为一个文件系统来处理,用文件打开,写,关闭,读通过USB对磁盘设备来操作。如果你要深究下去,先要理解文件系统,然后再去读USB规范。光这些内容就够你学习几个月的。如果你只是运用,看文章上红线划出的文件上修改对应的硬件接口就可以了。

看了下你的源代码,感觉问题出在下面这个函数

void uart_send(uint8 *ser){
    while(*ser!='\0'){
    USART_SendData(USART2,*(ser++));        
    while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET);{
        //rt_kprintf("·¢ËͱêÖ¾³É¹¦\r\n");}
    }
}

这里*ser!='0'有bug,你可以按照你的数组最后一个放n
其次你的while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET)可能是一个死循环
导致你的这个线程一致在运行,而无法返回flag5。这样你的狗就不能喂。所以程序在运行一段时间2.5S
后就硬件重启了。
建议你将这个代码改成

void uart_send(uint8 *ser){
    while(*ser!='\0'){
    ser++;
    }
    rt_kprintf("send OK \r\n");
}

试下,如果没有问题,再做串口开发

SD卡的写入是有时间的,你在整个系统线程的调用处理中有没有查下写入2K字节的SDK需要的最大时间是多少,如果这个时间超出了500ms,则你在上次还没有写完的情况下启动了写入。
如果时间间隔没有问题,建议你在重启SD卡写入时,查下是否上次写入已经结束,如果没有哦结束,则需要等待。可以给个自锁信号,在写入时信号量锁定,完成时信号量解锁。这样你就按500模式给出一个写入队列。从队列中提取地址(指向写入的数据缓冲)。当然这样的队列不能开大。只能缓冲2~3次的数据,这样可以保证500ms内有突发系统情况没有及时完成写入,也不会丢掉数据。

不清楚你的MCU芯片是那种,只能给你一个参考建议:
(1)检查硬件,在不断触发过程中,示波器的电平是脉冲还是电平。
(2)GPIO开中断的触发形式有多种,有上升沿触发,下降沿触发,电平触发(低或高)。
(3)如果是脉冲,则看下你的脉冲和中断次数是否一致,如果一致,恭喜你--一切正常
(4)如果是电平,则需要看下芯片的硬件手册,找到GPIO 中断配置寄存器,看下配置方式
(5)还要注意,GPIO中断由于是输入方式,因此建议管脚要上拉或下拉电阻,不能是高阻态。

请仔细看firmwarepackageswebclient-v2.1.2目录README.md这个文档,有详细的WebClient使用介绍。

SFDP是遵循JEDEC的新规范JESD216的新规范的一种对nor flash的串口操作机制。
对串行Flash的任何操作,在软件上必须按照相应的指令和规范的流程才可以正确地操作串行Flash。读取SFDP也必须按照规定的操作流程(如下)
开启片选选通芯片——>发送0x5A的读取SFDP的指令——>发送3byte的地址——>发送1byte的空周期——>在输出脚上读取SFDP数据——>关闭片选结束操作。 通过一进一出方式读取SFDP数据。

所以你的操作需要三个地址

选择 "C/C++" 选项卡,找到下面的 "Misc Controls",加入 "--cpp11" (没有引号)
请用这个方法测试下

肯定是没有找到这个文件,你可以看下你添加的目录下这些.h文件是否存在,其次看下你添加文件的方式--
1代码内添加注意""和<>的区别.2软件添加如果是keil 需要在工程目录下添加一个option下的cC++及ASM二个对话框中选择include路径.

uint8_t没有定义报错,可能是你工程文件中头文件包含路径不对,导致工程编译时找不到stdint.h这个文件

我没有看过这个工程文件,ws2812是一个spi接口的光源芯片。类似,在RTT的spi驱动w25qxx设备的中可以看到SPI_CTRL_MODE_MASTER这个参数,它是将SPI设置为主设备的意思。再arm芯片的SPI 的Global control register中可以看到这个参数.同理-RT_SPI_MASTER也是这个道理,你可以不用管这个参数的位置,只要理解它的意思就是将SPI设置为主设备.
如果这个参数报错没有定义,因该是在driver设备目录下的硬件接口需要和RT_SPI_MASTER关联.建议你先理解下RTT下自带的为w25qxx的驱动编写.

不知道你用的是Wiznet公司的那个模块,我以前用过5300,5500。你出现的这个问题建议你可以通过以下方式排除问题:
(1)排除焊接问题,如果焊接不好,则数据读写就错误,可以通过读取一个固定寄存器打印出来看你的MCU和wiznet芯片之间的数据连接是否正常。
(2)排除网络端故障,这个可以通过芯片在硬件联网成功后的指示灯初步判断网络是否正常。
(3)创建接口,用简单的ICMP协议中来做双向ping操作。
以上都没有问题,再考虑创建UDP,TCP包协议。因为你的故障原因描述不是很详细,只能提这点小建议,希望你帮助到你。

net_socket.c下的int closesocket(int s)是关闭一个网络接口,而dfs_posix.c下的int close(int fd)是对关闭一个文件接口挂载的fd(磁盘)。这个是完全不同的用法。

hardfault失败故障很多,具体你要自己定位。譬如堆栈溢出,内存溢出,超出边界等异常错误。

你这个没有打印程序执行反馈的错误信息,我推测你是不是开启线程后,在退出时没有把线程清除,这样你就是同一个线程初始化二次了。

回到
顶部

发布
问题

投诉
建议