上年刚从硬件跳槽为嵌软,没有任何一丝丝的防备,一入职。领导就交代了一特难任务—在stm32上移植linux,瞬间我就懵逼了~没办法硬着头发上,先搜集资料,一看还真是个艰难的任务,我之前跑的是ok6410的板子上运行的linux,现在是在stm32上移植,以前stm32倒是玩过,研究生期间就是捣鼓它的,但现在还没从抓烙铁的硬件当中缓过神来,就转到嵌入式软件的开发,更头疼的是stm32没有MMU!没有MMU!找了一下,好吧,有个uClinux!于是开始各种学习相关的知识,了解到linux的启动一般是u-boot——》liunx内核——》根文件系统,那么首先要做个基于stm32的u-boot,先初始化时钟、外设、中断什么的,看了韦东山老师的视频感觉很好,理解了不少,从一无所知到有点明白。


其实说白了u-boot就是一裸板程序,就是跟跑跑马灯、串口通信一个性质的,而裸板程序从正点原子的stm32开发板学习了不少,加上自己研究生阶段有点积累,首先我是参照http://www.cnblogs.com/fozu/p/3618076.html写这位博文的大神写的程序,这篇文章写得很好,后面还分析到内核了,反复看受益匪浅,这个程序不是u-boot程序但是实现的作用一样,初始化时钟,外设。。。最后传递内核参数,跳转内核。。。,一开始用keil编译这个程序,结果一堆错误,人家用的板子和你用的板子不一样,硬件的led灯、串口都可能连接不一样啊,比如人家用的是串口1,你用的是串口2,还有缺少一些头文件等等都会引发错误,所以根据自己的实际来修改,费了一阵功夫终于把错误全干掉,顺利编译成功。


这时用的板子是stm32f103,ST对这个板子早在08年就发布了支持它的u-boot、Uclinux内核(领导额外买的,说是要我对照着对应修改支持stm32f407的uClinux内核),但是只有Uclinux内核有源码,u-boot就给了个hex文件尴尬,其实cortx m3与cortx m4之前架构已经大不一样了,这样修改的话对于我来说无疑是很难的,我一听头都大了,又是单干,烦,没办法照做呗!那就先弄stm32f103的,把之前那个编译没有错误的引导程序拷入,在stm32的0x08003000的位置拷入官方提供的uClinux内核,一启动,接上串口,打开串口助手,一看啥都没有。。。一想到底什么错误啊,仔细的想想,先是要看看最后跳转内核那步到底有没有成功,那就先验证这一步,参照原子的IAR跳转历程,编了个跑马灯跳转程序,就是引导程序没变,拷在地址0x08000000,而跑马灯程序拷在0x08003000上,如果led灯亮灭就说明跳转无误,于是一启动,灯不亮。抓狂抓狂怎么情况啊,后仔细排查发现是跳转函数,引导程序参照的是u-boot源码来编写的,里面的函数用函数指针赋个地址(0x08003000),最后跳转过去。折腾了两天最后对着原子的程序修改,灯居然可以亮灭了,我现在想想也不知道是什么问题,不过至少现在可以实现跳转了。


再把内核拷到0x08003000,一启动,串口助手还是没有任何输出,这下就真的烦了,郁闷死了,stm32f103还搞不定还想搞stm32f407。。。之后开始各种找原因,各种修改,领导各种催,自stm32f103和stm32f407两个板子之间这搞搞,那搞搞,休息时间就看看韦老师的视频,找资料看看有什么灵感,但是还是没什么进展。


后来在网上搜到一个哥们居然在stm32f407上移植u-boot成功了,而且还有启动图晒出来,这下我就想,人家可以我为什么就不能?于是继续找,终于在网上找到了这个u-boot的源码,根据自己的stm32f407的板子修改串口,时钟等,安装好对应的交叉编译链,注意应该是arm-non-eabi不带linux的,因为是裸板程序不关linux啥事,然后一跑,终于在串口助手看到久违的u-boot启动图,狂喜!想想那段日子确实是在压力之下成长的,学的东西很快,技术感觉也有很大的提升了。


领导过来一看见有u-boot(有点东西交差了。。。)就说要把外部的sram驱动加上,以便于跑linux内核,这个sram只有512K,这么小能跑得到linux内核吗?这是后话,先把sram驱动加到u-boot上再说。


先参照原子的sram程序修改运行试试看看,结果可以运行但是写入再读出,有几个地址的数据总有错误,于是一直苦思冥想,想到了一个可能,驱动外部SRAM用到的是stm32的FSMC配置,它有btcr寄存器设置,分为bcr和btr设置,原子的开发板用的是1M16位的,而我的是512k8位,在btr寄存器设置那里应该是设成8位而不是16位,于是把相关设置位置0,这下数据正常了,接下来就是在u-boot上添加sram的驱动,这个u-boot编写得还蛮好,不过它配置的是外部8M的SDRAM,那么我就在sdram_init()的函数上添加配置sram的代码,把原来配置sdram的代码通通删去。折腾了两天,编写修改成功,一开机,串口助手正常输出启动信息,用u-boot的md、mw指令验证sram的驱动是否可行,之间也遇到一些问题,如在前100个地址写ff,md查看有几个地址数据不对,不是显示ff,用之前的sram裸板程序也是如此,一想软件程序肯定是没问题,那就是硬件问题,幸亏还搞过一段时间硬件,不然被公司硬件工程师给坑了,用万用表仔细检测,果然发现sram有几个数据线虚焊了,怪不得数据有误,拿烙铁一拖,OK!数据正常了,嗯!想成为合格的嵌入式软件工程师还是要软件硬件相结合,不能脱离了硬件啊!!!!


好!至此基于stm32f407的u-boot移植成功,外加外部2M的SRAM驱动(后来把512K升级为2M,因为后来内核内存不够跑到一半kernel panic挂了,此乃后话),最后上一张u-boot启动图。人生第一篇在CSDN的博文,希望以后自己不断学习技术不断提升,努力!

移植u-boot到stm32f407相关推荐

  1. 移植uClinux内核到stm32f407

    上一篇博文讲到了先移植基于stm32f407的u-boot,本文讲到的是最难的移植stm32f407的内核,这个内核源代码我也是在网上找到了,看介绍是国外大神所修改而成的,真的万分感谢这位大神可怜,所 ...

  2. STM32F407+CubeMX+Keil上移植RTX5实时系统

    文章目录 一.前言 二.CubeMX 2.1.RCC 与 Clock Configuration 2.2.SYS 2.3.GPIO 2.4.Project Manager 三.Keil 3.1.Tar ...

  3. RTOS 在 stm32f407 探索者上的移植(一)

    RTOS是什么 先看他们的定义.非实时操作系统指 操作系统无法保证 最高优先级任务开始执行 的最后时限. 软实时操作系统指 操作系统只能保证在xx时间内开始执行最高优先级的用户代码,但无法保证用户软件 ...

  4. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  5. mtk android 5.1 logo,Android ROM DIY之MTK平台手机通用移植

    在之前的文章中,我们讨论过ROM刷机原理,修改ROM包以及如何让ROM包获取root权限.那么接下来,我们谈谈MTK平台手机ROM移植的话题.如果你是ROM小白,那么建议可以先看看之前的文章. ROM ...

  6. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

  7. 我所理解的高通UEFI之display的流程和移植

    UEFI的流程 UEFI跟uboot一样都是在在kernel加载启动之前,正确的引导指定启动服务,并向内核传递信息,代替原先的uboot.它包含了上电.驱动实现,以及os环境的建立和应用程序(类似于f ...

  8. STM32F407+FreeRTOS+LWIP1.4.1: Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,441

    最近在学习物联网相关的知识,打算用ST的开发板STM32F407ZGT6作为控制中心,上面搭载FreeROTS实时系统,STM32F407开发板作为 TCP client,网络调试助手作为TCP se ...

  9. 嵌入式研发人员的核心竞争力浅谈 .

    夜深人静,万籁俱寂,正是思考的时间.这几天,我一直在想:什么才是一个嵌入式研发人员的核心竞争力? 核心竞争力是个很有诱惑力的词,它意味着你拥有别人不能简单复制的能力.经验.在职场中,竞争只存在于你和你 ...

  10. 基于AT91SAM9G20构建嵌入式Linux系统

    本文中使用的目标平台AT91SAM9G20是Atmel公司使用ARM926EJ-S处理器内核开发的一块SoC嵌入式微处理器,主频达到400MHz,具有Atmel 先进的外设DMA 和分布式存储器架构, ...

最新文章

  1. spring知识概要
  2. ICCV 2017 《Towards End-to-End Text Spotting with Convolutional Recurrent Neural Network》论文笔记
  3. Java中字符串连接符(+)和append的区别
  4. C# WebBrowser控件使用整理
  5. 使用PHP 的 curl 爬取 青果教务系统 课表
  6. Java Stream流
  7. 苹果mac如何连接打印机
  8. python numpy 函数_Python 入门教程:关于 numpy 窗函数 Blackman
  9. 专业解读:从央行征信系统看你的哪些行为会影响你的信用
  10. R语言通过WinBUGS对MGARCH和MSV模型进行贝叶斯估计和比较
  11. luogu P4238 【模板】多项式乘法逆
  12. 本地JAVA开发页面使用AzureAD(AAD)验证登录
  13. Matlab数值分析编程:牛顿下山法解方程
  14. 创成汇:科技与艺术概念结合在手机上,效果居然这么强?_创成汇
  15. Vue Echarts英文版地图——强大的高德地图
  16. 获奖感言和C语言的学习心得
  17. linux vps 桌面,linode linux vps的centos系统上安装X Window System GNOME图形桌面使用vnc连接 - 乖兔博客...
  18. 会放弃的人生才会更洒脱
  19. 《陰陽師·付喪神卷·迷神》原作:夢枕貘
  20. CCNP学习之路之VOIP基本知识

热门文章

  1. daniel powter
  2. 一生一代一双人:我与51CTO学院的情缘----写于51CTO学院2周年庆
  3. D. Serval and Rooted Tree(思维+树形dp+二分辅助)
  4. ubuntu 20 安装 velodyne_simulator
  5. performing vcs refresh卡住不动解决方法
  6. keras导入weights方式
  7. 从贝叶斯定理到概率分布:详解概率论基本定义
  8. 牛客网练习赛36 Ribbit的数列 分块
  9. STM32F1基于正点原子HAL库IIC驱动SH1106芯片的OLED屏
  10. 培养孩子讲故事的心得