历史上的今天
返回首页

历史上的今天

今天是: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 将程序通过思维导图的方式写在上面,方便程序的添加更改,查找更便利


推荐阅读

史海拾趣

Bkc Semiconductors Inc公司的发展小趣事

随着技术的成熟和产品的不断完善,Bkc开始积极拓展市场。公司不仅加强了与国内外知名电子厂商的合作,还积极参与国际半导体展会和技术交流,不断提升品牌知名度。同时,Bkc还通过战略投资和并购等方式,进一步扩大了自身的业务规模和市场份额。

Fischer Elektronik公司的发展小趣事

Fischer Elektronik深知每个客户的需求都是独特的,因此公司非常注重提供客户定制化的解决方案。公司拥有一支专业的研发团队和先进的生产设备,能够根据客户的具体需求,设计并生产出符合其要求的产品。这种高度定制化的服务模式,赢得了众多客户的信赖和好评,也为公司赢得了更多的市场份额。

Britool Expert公司的发展小趣事

随着电子技术的不断进步,Fischer Elektronik始终走在行业前沿,不断推出创新产品。公司研发的散热系统、散热半导体和散热器等产品,不仅性能卓越,而且设计精良,满足了各种复杂应用场景的需求。此外,Fischer Elektronik还不断拓展产品线,增加了连接器、外壳等系列产品,进一步巩固了其在电子元件市场的地位。这些创新和技术突破,为公司的持续发展提供了强大动力。

Daniel Woodhead公司的发展小趣事

随着公司业务的不断发展壮大,Daniel Woodhead公司开始关注社会责任和可持续发展。公司积极参与公益事业,捐赠资金和技术支持教育、环保等领域。同时,公司还注重环保和节能技术的研发与应用,努力减少生产过程中的环境污染和资源浪费。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

Helicomm公司的发展小趣事

为了进一步提升技术水平和市场竞争力,Daniel Woodhead公司开始寻求与国际知名企业的合作。公司与多家国际知名半导体制造商和电子产品生产商建立了战略合作关系,共同研发新技术、新产品。这些合作不仅为公司带来了先进的技术和理念,还拓宽了公司的国际视野和市场渠道。

GeneSiC Semiconductor公司的发展小趣事

随着公司业务的不断拓展,Daniel Woodhead公司意识到人才是企业发展的核心。因此,公司加大了对研发团队的投入,引进了一批业界顶尖的技术人才。这些人才的加入不仅为公司带来了更多的创新思路,还提高了整体的技术水平。在团队的共同努力下,公司不断推出具有竞争力的新产品,进一步巩固了市场地位。

问答坊 | AI 解惑

PIC单片机开发的若干问题

摘 要: PIC单片机在国内日益流行,本文介绍Microchip PIC系列单片机开发过程中软、硬件设计的一些经验、技巧。 关键词: Microchip单片机     功耗     编程 作者: 湖南长沙湖南师范大学计算机部(410006) &n ...…

查看全部问答>

pci的bar问题

请问高手们,怎样通过pci的配置寄存器中的bar读取的值,来获取映射到io或者memory的地址?bar是一个32位的寄存器。。。…

查看全部问答>

一个中断是不是接收一位数据?

     一个中断是不是接收一位数据?      接收一个16位的数据,是不是要产生16个中断? …

查看全部问答>

用什么方法能够实时采集8路PWM信号的占空比

用什么方法能够实时采集8路PWM信号的占空比 现有8路PWM信号,信号不同步,且占空比都很小周期一样都为50HZ,最小脉宽为0.5ms,最大为2.5ms,想通过一种方法实时得到这8路信号的脉冲宽度 …

查看全部问答>

mxchip制作的中文手册不厚道

                                 mxchip制作的中文手册排版上太浪费空间,本来一页能写下的东西洋洋洒洒写了两页多,还不让编辑,要是把一本stm32固 ...…

查看全部问答>

请教香水城

VTarget = 3.352V Info: TotalIRLen = 9, IRPrint = 0x0011 ***JLink Error: Wrong ROM location (15:2). Expected 0xE00FF003, Found 0x14 ...…

查看全部问答>

M430 UART0 接收数据

最近在研究430 看到有人写的一段代码,为了接收GPS的数据,使用串口中断接收,部分代码如下: if(global_temp_data_num==0)   //获取\"GG\"标志         {           if ...…

查看全部问答>

【TI首届低功耗设计大赛】基于MSP430的多功能仪表(1)----系统总体结构

    MSP430FR5969的功能是非常强大的,一直在琢磨拿来做什么呢?刚好手头缺个示波器,那干脆来做个示波器吧。先来看看示波器的功能: 1.有个3.5寸的屏幕显示波形 2.能够测量两路 3.采用触摸按键和按钮按键结合的方式。 4.采样率理论 ...…

查看全部问答>

MSP430F5438固件和驱动能传一份么

5438的仿真器升级不成功,有5438的固件么,还有驱动  驱动版本太低好像,FET430UIF V2.1或是V3的有吗?感谢…

查看全部问答>

jic文件下载后无反应

quartus II 11.1 生成的.sof文件,.hex文件被编译在.sof中 stratix IV: EP4SGX230KF40C2 生成jic文件后下载 因为flash以前有程序,所以先Erase,后Program/configure,下载成功(不能选择Verify 或 Blank-check,会下载时fail) 用quartus II 1 ...…

查看全部问答>