关于嵌入式系统维修解决方案

本文针对嵌入式系统中遇到的核心板上电不运行和程序烧写问题,提出了一种测试思路。通过编写一段测试程序,下载到CPU的内部RAM中,对数据总线、地址总线和NORFLASH进行检测,并通过串口输出测试结果,帮助定位故障源。涉及硬件包括at91rm9200 CPU、SDRAM、NORFLASH以及NET组件。
摘要由CSDN通过智能技术生成
我目前在某家上市公司负责维修组的工作,在我们所有维修的产品中,嵌入式系统的维修难度是最大的。2018年左右订单量骤增,板件的不良品也极具增加了,出现了几百块难修的核心板(at91rm9200),无从下手,不知道该怎么修。硬件上面已经找不到解决方案,于是我想从软件方面着手,利用软件进行辅助维修。
我是一个基督徒,感谢上帝的恩典和怜悯,经过了一年多的学习和探索最终找到了解决方案,嵌入式编程之路很艰辛,若不是上帝的带领和帮助我根本做不到,因为我在的环境不是编程的环境,周围没有人可以问,只能自己摸索。
2018年我开始从0学习编程,那个的时候我已经34岁了, 大概的学习过程是这样的,先学习郝斌的C语言基础和数据结构;然后学习郭天祥的89C52单片机;然后学习stm32f103编程,当时参考的是杜洋的课程,当时开发板用的公司的某一款产品;最后才进入正题:at91rm92100嵌入式系统的学习,由于这个芯片比较老,找不到相关的教程,于是选择和它最相近的韦东山的S3C2440开发板。
下面进入正题,我现在想把整个方案公布出来,希望能够帮助那些有需要的人,圣经上说:“你们百把的得来,也要白白的舍去”

硬件介绍:
CPU: at91rm9200
SDRAM: IS42S16160C-7TLI 32M
NORFLASH): S29AL016J70TFI020 SST39VF6401-70-4C-B1K
NET: CS8900A-IQ3Z
扩展网卡: CS8900A-IQ3Z
软件平台: Ubuntu 18.04.3 LTS
loader
需要解决的问题:核心板上电不运行; 程序烧写不进入norflash中
接触过嵌入式系统人都知道,CPU、SDRAM、NORFLASH是整体运行的,加上相互之间的数据总线、地址总线、控制总线,无论是哪个原件或线路出问题,都会导致整块电路板工作不正常。但是要想产出是哪个原件或是哪根线出问题,更是难上加难了,因为它的集成度比较高,通常是4层以上的电路板,原件管脚间距都比较小,通常用放大镜才能看清楚。
整个程序的设计思路:把at91rm9200当成单片机来看,写一段测试程序下载到9200内部的16k ram中,通过该程序对9200周围的数据总线和地址总线、norflash进行检测,通过串口打印输出测试结果。
在loader中添加test.c文件,代码内容如下:
#include “main.h”

//----------------------------------------------------------------------------
//
\fn wait
//* \brief This function
//*----------------------------------------------------------------------------

void wait(volatile unsigned int dly)
{
for(; dly > 0; dly–);
}

//----------------------------------------------------------------------------
//
\fn Led
//* \brief This function
//*----------------------------------------------------------------------------
void led(void)
{
AT91C_BASE_PIOA->PIO_OER = 1<<15;

AT91C_BASE_PIOA->PIO_CODR = 1<<15;
wait(500000);
AT91C_BASE_PIOA->PIO_SODR = 1<<15;
wait(500000);	

}

//----------------------------------------------------------------------------
//
\fn copy_steppingstone_to_sdram
//* \brief This function performs very low level HW initialisation
//*----------------------------------------------------------------------------
void wriet_zero_to_sdram()
{
unsigned int i = 0;
unsigned int *pdwDest = (unsigned int *)SDRAM_START;

while (pdwDest<(unsigned int *)0x21f40000)
{
    *pdwDest = 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值