极海APM32F107V6 + DP83848CVV驱动网口(二)
一、实现目的
上一篇在例程简单的测试了一下驱动网口,现在我要将文件移植到我的工程里,并实现跟4G模块一样与腾讯云iot平台交互的功能。
二、移植网口驱动
工程我用的是之前的:
极海APM32F107V6 移植FreeRTOS+CMSIS-RTOS V2-CSDN博客
1、文件
将sdk例程的dp83848.c复制boards文件夹里,.h文件就不再截图了

sys_arch是LWIP TCP/IP协议栈中的一个核心组件,它主要起到了协议栈与底层操作系统之间的适配层作用,我复制到driver里边,还有arch、ethernetif等等这些驱动文件也同理

再建一个任务的.c,这个到时候重新编写

2、路径
路径添加一下

3、添加和修改
按例程添加文件,ETH是src的apm32f10x_eth.c添加
lwip库是Middlewares\lwip-1.4.1\src\api全部,c
Middlewares\lwip-1.4.1\src\core全部.c
Middlewares\lwip-1.4.1\src\core\ipv4全部.c
Middlewares\lwip-1.4.1\src\netif的etharp.c
后边如果有用到其他的再加

main.h加上需要的这几个

然后因为我是用的CMSIS库,这里编译会报错,是因为原ethernetif.c文件中用到freertos的信号量eth_rx_sem
修改如下:



声明本来放在main.h 我换到driver.h了

再创建一个tcp任务

先完全复制例程的

我编译后报socket error,这里查了一下,应该是我工程freertos的堆栈不够
例程是10k,我改成12k了
![]()
再编译运行看看,可以看到成功连接

三、连接iot部分程序
1、mqtt库
freertos里边有coremqtt库,我用的这个。
路径:\Middlewares\FreeRTOS\FreeRTOSv202012.00\FreeRTOS-Plus\Source\Application-Protocols\coreMQTT\source

然后keil里添加

路径里添加
..\..\Middlewares\FreeRTOS\FreeRTOSv202012.00\FreeRTOS-Plus\Source\Application-Protocols\coreMQTT\source\include
也就是这里的include

然后在Tcp_Client.c里边引用coremqtt

这里编译会报一个断言错误,我AI了一下,加了一个C文件,定义了断言就可以

2、主任务创建
我分配了5k,其他创建的过程就不赘述了,之前移植的时候有写过。

3、网络连接部分
我这里是用域名登录的,域名登录要在lwipopts.h里使能DNS的配置

然后我主任务到这里,就是tcp网络连接部分,

其中域名就是用的腾讯云iot提供的域名了,ip只是作为备用,域名一直都可以,我没试过能不能连上

4、mqtt部分
①mqtt连接
到这里就是主任务里边连接的过程,其中三元素我也是偷懒直接用的平台给出来的

发送和接收的实现:

②发送部分

每30秒发送一次led的数据


③接收部分
这里是每个主题的处理

这里是解析发布的消息



这里因为接收的时候一直出问题,有让ai帮忙改一下来定位问题,但实际还是没完全改好,后边会有讲到。
四、验证
1、上报的:

2、接收的

总体来说也是实现了
五、问题总结
芯片内存只有64k,然后我又加了FreeRTOS,CMSIS、以太网驱动、lwip库等等,移植过来的时候已经感觉很勉强了。
比较大的就是这里以太网的发送和接收的缓冲区数量由5改成3,其他的我也忘了有改过哪里了

这是改完之后的内存使用情况

但刚刚也说到,实际上这个程序还是有一个没解决的问题:
就是如果下发2个控制,是可以解析的,虽然报文只打印了led1,但是printf没有做那么多缓存,实际上led2也执行了。
但是下发3个的时候,解析JSON会解析失败,这个我来回查了很久,最后还是觉得是内存不够的问题,也来来回回增加减少过空间,还是没解决,就先搁置了。这里做个标记吧。

后续因为还要加显示屏的字库,所以我考虑这块F1的开发板就不带系统了,后边我会先全部改成裸机的我还有一块F4的开发板,玩那块再带系统吧。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)