我目前在某家上市公司负责维修组的工作,在我们所有维修的产品中,嵌入式系统的维修难度是最大的。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;