一.背景介绍
17/07毕业,通过完成试用期的几个小项目,感觉自己能独立的完成部分项目,便接手了配合硬件工程师,将公司模块升级的任务(M3-->M4)
目标:
1.bootloader更改
2.将rt_thread 系统移植到 stm32f407板子上
3.将485,can , gsm ,以太网 驱动接口补上
4.重新设计程序收发流程,完成实时收发数据
(数据字典,wwdg , 校验设计,对上,对下的协议修改等等 ,这些已在之前完成,只要调用响应接口,调试下即可)
二.目标实现
目标1.bootloader更改
通过学习之前模块的代码,对整个bootloader流程有了大致的了解,学习flash的机构跟读写方法等
1.更改对应的flash 信息,根据选择的芯片,通过编程手册或跟硬件工程师交流
更改:
#define PAGE_SIZE (0x800) /* 2 Kbytes */
#define FLASH_SIZE (0x100000) /* 1 MByte */
#define USER_FLASH_END_ADDRESS 0x08100000 //1MB
#define APPLICATION_ADDRESS (uint32_t)0x08004000 //16KB app 启动地址
2.更新代码,将沉余代码删除,在keil5中一步步运行,删除多余代码,大体代码不做更改
因为有打印信息需求,所以设置了485,在此之前先要理清概念:串行,并行,单工,半双工,全双工,同步/异步通信
在此处不做介绍,大家百度下即可。
usart: 1.对应时钟配置
2.有复用,就添加复用映射
3.管脚配置—管脚初始化
4.串口配置----串口初始化
5.配置中断
6.库函数包含中断跟发送
代码中有用到f_open 等,那必须得实现文件系统功能,通过SPI来实现,那就必须了解SPI的设置,功能等
SPI:串行外设总线,使MCU与各种外围设备以串行方式进行通信以交换信息。
(1)MOSI
(2)MISO
(3)SCLK
(4)CS
SPI:管脚配置
1.配置使能管脚
2.配置剩余三个管脚
3.添加复用映射
4. SPI口初始化
5.使能SPI外设,启动传输
6. 库函数包含中断跟发送-------规则如nand flash 注意片选的使能
其他改动不大,在 IAP_BOOT()函数中实现程序的跳转,进入app
通过自测,将一个点灯的bin 文件放到对应的地址,boot函数会跳转到该地址,实现灯闪烁即OK
目标2:将rt_thread 系统移植到 stm32f407板子上
知识储备:结合rt_thread编程手册,对rt_thread系统运行过程有个大致了解
这个比较简单,在RT_Thread 官网上下载对应板子的bsp即可,编译keil,将未实现的函数库copy过来即可
存在问题,你要注意bootloader的跳转地址,以及keil 里面配置的地址,还有app 程序里面的设置地址要对应起来 (如果地址不对应,可能会跑飞,之前遇到这个问题)
此处,先不用btloader跳转
通过编译之后,运行程序,检测到程序在idle里跑就行了,说明系统挂起来了
此处,先目标3.将485,can , gsm ,以太网 驱动接口补上
需要学习相关串口的知识
(1)485
485的设置不难,之前介绍过,在系统里面找到或添加对应的串口设置,实现对应的中断即可
在rt_thread中要将finsh 跟 485关联起来,<
(2)can
学习can 的相关收发知识,以及相关程序的运行。
can的配置不难
Can配置:
1.对应时钟配置
2.有复用,就添加复用映射
3.管脚配置—管脚初始化
4.CAN单元配置
5.过滤器配置
6.优先级配置
7.库函数包含中断跟发送
主要问题:两个板子的对应的晶振不一致,这个需要在过滤器中配置,但是我将can过滤器设置之后还是出现收发错误
就开始找原因了,最后在函数 static rt_err_t bxcan_set_privmode(CAN_TypeDef *pcan, rt_uint32_t mode)中发现
pcan->BTR = (mode | \
((BAUD_DATA(SJW, baud_index)) << 24) | \
((BAUD_DATA(BS1, baud_index)) << 16) | \
((BAUD_DATA(BS2, baud_index)) << 20) | \
(BAUD_DATA(RRESCL, baud_index)) - 1);
知道对应的BAUD_DATA实现,更改了对应的过滤器设置,调试通过
// {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 6)},//36M
{1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_1tq, CAN_BS1_7tq, CAN_BS2_6tq, 6)},//42M
(3)SPI+DMA
学习SPI跟DMA
需要挂载文件系统,就需要用到SPI了,我看原来的代码通过SPI+DMA来实现,我将原先的库函数更换成M4的,将其配置改成M4的配置,发现实现不了。
原因: 两块芯片的flash不一样,此处只要将对应的初始化函数更改下,配上对应的flash,文件系统即可加载成功
(4)以太网
注意管脚配置即可
stm32f407 以太网驱动移植 在:
RT-Thread编程指南 ----- lwIP - 轻型TCP/IP协议栈 这一章写的很详细了,有需要的小伙伴可以去看下
RT-Thread中将lwIP应用起来主要包括三个核心步骤:
1. 创建收发包线程,调用接口eth_system_device_init()。
2. 提供网卡驱动,调用网卡初始化函数,注册网卡设备。(驱动不同相应的接口函数可能不同)
3. 初始化lwIP,创建lwIP线程,调用接口 lwip_sys_init()(实际调用的lwip_system_init())。
之后,在主线程上写了个tcpserver(编程手册里有代码) ,用QT写了client 实现了数据的收发,并完成测试
至此完成485,can,gsm,以太网的接口实现,之后就等新板子来了把管脚一调就可以测试了
小技巧:通过Xmind 将程序通过思维导图的方式写在上面,方便程序的添加更改,查找更便利
上一篇:STM32笔记--SDIO(SD卡读取)
下一篇:SD卡及STM32的SDIO接口相关原理
推荐阅读最新更新时间:2024-03-16 16:21
设计资源 培训 开发板 精华推荐
- 科学家研发基于AI的身份验证工具 可保护车辆免受网络攻击威胁
- Microchip推出广泛的IGBT 7 功率器件组合,专为可持续发展、电动出行和数据中心应用而设计
- 面向未来驾驶体验 博世推出新型微电子技术
- 英飞凌与马瑞利合作 利用AURIX™ TC4x MCU系列推动区域控制单元创新
- 5C超充,该怎么卷?
- 《2025年度中国汽车十大技术趋势》正式揭晓!你最看好哪个?
- Microchip推出新型VelocityDRIVE™软件平台和车规级多千兆位以太网交换芯片,支持软件定义汽车
- 英特尔中国正式发布2023-2024企业社会责任报告
- can转485数据是如何对应的
- MCU今年的重点:NPU和64位