一、目的和工具
1、选用芯片为STM32F4,网络芯片选用LAN8720A(可借助原子开发板进行学习)。
2、使用env软件配置RT_Thread环境。
3、网线一根,ulink下载器,usb接线口。
4、板子作为客户端,实现单片机和开发板的TCP网络通信。
二、env配置
env里面需要配置的东西:
>控制台:finsh、rt_kprintf、UART;
>network:stm32f4xx_eth.c、LWIP、ip
>打开接口:控制台的串口
1、finsh: 进入RT-Thread Components → Command shell → finsh shell,打开它。
2、rt_kprintf: 进入 RT-Thread Kernel → Kernel Device Object → Using console for rt_kprintf,打开它。
3、UART:在进入菜单界面就可选择 Enable UART1 (PB6/7)。
4、stm32f4xx_eth.c、LWIP: 进入RT-Thread Components → Network → light weight TCP/IP stack → Enable lwIP stack,打开它。
5、ip:进入RT-Thread Components → Network → Network interface device → Enable network interface device,打开它。
6、控制台的串口:进入 RT-Thread Components → Device Drivers → Using serial device drivers,打开它。
三、keil5编译调式
退出menuconfig,输入“scons --target=mdk5”编译。
在keil5中直接编译,发现报很多错误,错误及修改如下:
1、在rtconfig.h中,缺少组件和主函数初始化的宏,env配置的时候自动省略了。
添加即可
/* C++ features */
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
2、禁用DHCP服务,我们这里是使用局域网连接。在rtconfig.h中删掉#define RT_LWIP_DHCP。
3、我们使用UART1,所以得初始化Tx、Rx引脚时注意查看芯片图。修改为PA9、10。
4、出现如下问题,勾选“魔法棒”里C/C++,勾选C99 mode。
5、出现“Not enough information to list load addresses in the image map”
原因:只声明了函数,却未定义函数实体。所以在这个前提下调用函数时会报这个错误。
解决方法:定义函数实体,或者取消函数调用。
本人因自己写了几个函数,在board.c和components.c里面进行逐步注释即可。
6、出现“FCARM - Output Name not specified, please check 'Options for Target - Utilities'”
原因:编译文件不正确。
解决办法:可选中不编译文件,右击不编议的文件,选择“options for file 'xxx.x'”,取消"include in target build"和“always build”。
7、编译之后,当发现右击不能跳转时,在“魔法棒”里output,勾选browse information,当然,如若编译时不想跳转,可不勾选。
8、最后修改晶振频率,原子是8M,不用修改,本人外围晶振是25M。
修改HSE_VALUE为8000000。
四、网络测试(未记录完)
程序能下载到板子,首先出现一个大问题:复位网口灯不闪烁,串口控制台ping串口出不输出IP。
原因:网口初始化失败。
解决:在xxx_eth.c的最后网络初始化中添加lwip_sys_init()函数。此函数在sys_arch.c中有定义,不知道此版本为什么编译时不自动调用。
最后在局域网内板子利用串口助手,电脑借助网络调试助手能相互发送消息。
因本人容易遗忘,简单记录过程,以免忘记,写得不好或不清楚,粗略参考。