历史上的今天
今天是:2025年07月22日(星期二)
2019年07月22日 | 关于stm32f407 外设程序编写过程 总结
2019-07-22 来源:eefocus
一.背景介绍
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 将程序通过思维导图的方式写在上面,方便程序的添加更改,查找更便利
史海拾趣
|
摘 要: PIC单片机在国内日益流行,本文介绍Microchip PIC系列单片机开发过程中软、硬件设计的一些经验、技巧。 关键词: Microchip单片机 功耗 编程 作者: 湖南长沙湖南师范大学计算机部(410006) &n ...… 查看全部问答> |
|
用什么方法能够实时采集8路PWM信号的占空比 现有8路PWM信号,信号不同步,且占空比都很小周期一样都为50HZ,最小脉宽为0.5ms,最大为2.5ms,想通过一种方法实时得到这8路信号的脉冲宽度 … 查看全部问答> |
|
最近在研究430 看到有人写的一段代码,为了接收GPS的数据,使用串口中断接收,部分代码如下: if(global_temp_data_num==0) //获取\"GG\"标志 { if ...… 查看全部问答> |
|
【TI首届低功耗设计大赛】基于MSP430的多功能仪表(1)----系统总体结构 MSP430FR5969的功能是非常强大的,一直在琢磨拿来做什么呢?刚好手头缺个示波器,那干脆来做个示波器吧。先来看看示波器的功能: 1.有个3.5寸的屏幕显示波形 2.能够测量两路 3.采用触摸按键和按钮按键结合的方式。 4.采样率理论 ...… 查看全部问答> |
|
quartus II 11.1 生成的.sof文件,.hex文件被编译在.sof中 stratix IV: EP4SGX230KF40C2 生成jic文件后下载 因为flash以前有程序,所以先Erase,后Program/configure,下载成功(不能选择Verify 或 Blank-check,会下载时fail) 用quartus II 1 ...… 查看全部问答> |




