关于stm32f407 外设程序编写过程 总结

-----------------------------------------------------谨以此文,献给自己毕业之后第一个项目   作者:Yangs

一.背景介绍

        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关联起来,<<RT-Thread-RTOS应用之二——使用finsh组件>> 这篇文章写的很清楚,finsh的实现不是很难,我在做的时候遇到了bug,怎么也接受不到输入的信息,进入不了串口中断里去,后来跟硬件工程师配合,通过示波器,发现开发板上485芯片有问题,接收信号无,后来换了个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 将程序通过思维导图的方式写在上面,方便程序的添加更改,查找更便利

  有遇到相似问题的,欢迎大家提问,刚学习这方面知识,有不足之处,希望大家指正,万谢

 本人微信:m872873

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值