历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2020年02月05日 | arm 裸奔经验

2020-02-05 来源:eefocus

由于自己买的开发板的norflash坏了,板子剩下了nandflash了,还想玩开发板,就开始我的裸奔了,开始去了解nandflash启动原理,arm2410是从nandflash前4k空间复制到arm内部4kRAM空间当中运行.知道原理以后我写裸奔程序都不超过4k程序,就可以做跑马灯,rs232驱动,rtc程序是足够了.一开始 我用的软件是ads1.2,只能抄写别人 程序,程序当中有一个init2410.s里面有一大堆的汇编语言,看的我眼花撩乱,我也只能硬着头皮看下去,基本上能看懂了个大概. .s文件主要功能就是程序的开始和对中断向量进行描述,同时想main()函数跳转,跳到c语言当中运行.后来我做跑马灯时候,我把.s文件压缩成3句话,把没有用的语句都删了.一般的初试化函数都在2410lib.c文件当中,里面有串口初试化,端口初始化,等其他初始化.裸奔中我觉的最有成就感的是外部中断的实现和3.5寸lcd显示我的相册.先说一下我外部中断的实现.


b HandlerUndef ;handler for Undefined mode 
b HandlerSWI ;handler for SWI interrupt 
b HandlerPabort ;handler for PAbort 
b HandlerDabort ;handler for DAbort 
b .  ;reserved 
b HandlerIRQ ;handler for IRQ interrupt 
b HandlerFIQ ;handler for FIQ interrupt

上面是中断向量表.

IsrIRQ  
sub sp,sp,#4       ;reserved for PC 
stmfd sp!,{r8-r9}   
ldr r9,=INTOFFSET 
ldr r9,[r9] 
ldr r8,=HandleEINT0 
add r8,r8,r9,lsl #2 
ldr r8,[r8] 
str r8,[sp,#8] 
ldmfd sp!,{r8-r9,pc}

普通中断表的指针.

InitStacks 
;Don't use DRAM,such as stmfd,ldmfd...... 
;SVCstack is initialized before 
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1' 
mrs r0,cpsr 
bic r0,r0,#MODEMASK 
orr r1,r0,#UNDEFMODE|NOINT 
msr cpsr_cxsf,r1  ;UndefMode 
ldr sp,=UndefStack 
orr r1,r0,#ABORTMODE|NOINT 
msr cpsr_cxsf,r1  ;AbortMode 
ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT 
msr cpsr_cxsf,r1  ;IRQMode 
ldr sp,=IRQStack 
orr r1,r0,#FIQMODE|NOINT 
msr cpsr_cxsf,r1  ;FIQMode 
ldr sp,=FIQStack

bic r0,r0,#MODEMASK|NOINT 
orr r1,r0,#SVCMODE 
msr cpsr_cxsf,r1  ;SVCMode 
ldr sp,=SVCStack 
;USER mode has not be initialized. 
mov pc,lr 
;The LR register won't be valid if the current mode is not SVC mode. 
中断的栈问题

   AREA RamData, DATA, READWRITE

        ^   _ISR_STARTADDRESS 
HandleReset     #   4 
HandleUndef     #   4 
HandleSWI       #   4 
HandlePabort    #   4 
HandleDabort    #   4 
HandleReserved  #   4 
HandleIRQ       #   4 
HandleFIQ       #   4

;Don't use the label 'IntVectorTable', 
;The value of IntVectorTable is different with the address you think it may be. 
;IntVectorTable 
HandleEINT0     #   4 
HandleEINT1     #   4 
HandleEINT2     #   4 
HandleEINT3     #   4 
HandleEINT4_7   #   4 
HandleEINT8_23  #   4 
HandleRSV6      #   4 
HandleBATFLT    #   4 
HandleTICK      #   4 
HandleWDT       #   4 
HandleTIMER0    #   4 
HandleTIMER1    #   4 
HandleTIMER2    #   4 
HandleTIMER3    #   4 
HandleTIMER4    #   4 
HandleUART2     #   4 
HandleLCD       #   4 
HandleDMA0      #   4 
HandleDMA1      #   4 
HandleDMA2      #   4 
HandleDMA3      #   4 
HandleMMC       #   4 
HandleSPI0      #   4 
HandleUART1     #   4 
HandleRSV24     #   4 
HandleUSBD      #   4 
HandleUSBH      #   4 
HandleIIC       #   4 
HandleUART0     #   4 
HandleSPI1      #   4 
HandleRTC       #   4 
HandleADC       #   4

        END 
中断具体表.

static void __irq KeyISR(void) 

U8 key ;

rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((0<<22)|(0<<6)) ;  //GPG11,3 set input 
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((0<<4)|(0<<0)) ;  //GPF2,0 set input 
if(rINTPND==BIT_EINT8_23) 

  ClearPending(BIT_EINT8_23); 
  if(rEINTPEND&(1<<11)) 
  { 
   //puts("Interrupt eint11 occur..."); 
   rEINTPEND |= 1<< 11; 
  } 
  if(rEINTPEND&(1<<19)) 
  { 
   //puts("Interrupt eint19 occur...");   
   rEINTPEND |= 1<< 19; 
  } 

else if(rINTPND==BIT_EINT0) 

  //puts("Interrupt eint0 occur..."); 
  ClearPending(BIT_EINT0); 

else if(rINTPND==BIT_EINT2) 

  //puts("Interrupt eint2 occur..."); 
  ClearPending(BIT_EINT2); 
}

//查询按键键值 
key = Key_Scan() ; 
if( key != 0xff ) 
  printf( "Interrupt occur... K%d is pressed!n", key ) ;

//Beep( 2000, 3000 ) ;

//重新初始化IO口 
rGPGCON = rGPGCON & (~((3<<12)|(3<<4))) | ((1<<12)|(1<<4)) ;  //GPG6,2 set output 
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2)));  //GPG6,2 output 0 
rGPECON = rGPECON & (~((3<<26)|(3<<22))) | ((1<<26)|(1<<22));  //GPE13,11 set output 
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11)));  //GPE13,11 output 0 
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ;  //GPG11,3 set EINT 
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ;  //GPF2,0 set EINT 

中断子函数,有四个中断源;实际上是三个中断源,在第三个中断分出了两个中断.中断可能初学者看的迷迷糊糊.好了中断就讲在这里.

现在讲关于lcd显示动态的相册,由于照片的数据结构一定大于4k空间,所以在nandflash纯裸奔是不可能的.这个问题困饶我了很久,后来根据wince和linux启动的原理,我用bootloader(vivi)来启动我lcd裸奔程序,然后固化到nandflash当中即ce区或则是 kernel区.

    Lcd_Port_Init(); 
    puts("linshenghuan"); 
    Lcd_Init(); 
    Lcd_EnvidOnOff(1);  //turn on vedio

DelayMs(); 
Lcd_ClearScr(0x00);  //fill all screen with some color 
DelayMs(); 
Lcd_ClearScr(0xF1F1);  
DelayMs(); 
Lcd_ClearScr(0x1F1F);  
DelayMs(); 
  Lcd_ClearScr(0x00); 
  Paint_Bmp( 0,0,240,320, xyx_240_320 ) ;  //paint a bmp


推荐阅读

史海拾趣

Ericsson Power Modules公司的发展小趣事

Ericsson Power Modules公司起源于上世纪七十年代,作为爱立信公司的一个重要部门而诞生。当时,随着通信技术的飞速发展,对高效、稳定的电源解决方案的需求日益增长。爱立信凭借其深厚的技术积累和市场洞察力,决定进军电源模块领域,以满足这一市场需求。Ericsson Power Modules应运而生,专注于设计和制造电路板安装电源解决方案。

Connect-Tech Products Corp公司的发展小趣事

Connect-Tech Products Corp公司始终将产品质量视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都严格把控。此外,公司还注重持续改进,不断优化生产流程和技术创新,确保产品质量的稳定性和可靠性。这些措施使得Connect-Tech Products Corp公司的产品在市场上赢得了良好的口碑和信誉。

昆泰芯微电子(CONNTEK)公司的发展小趣事

随着物联网技术的快速发展,昆泰芯微电子紧跟时代步伐,深度布局物联网应用领域。公司专注于面向物联网应用的传感器芯片研发、生产和销售,致力于成为传感器信号链及物联网芯片的行业领导者。在消费电子、智能制造、智能交通、智能家居以及新能源汽车等多个领域,昆泰芯微电子的产品得到了广泛应用,为这些领域的发展提供了强有力的技术支持。

Crane Connectors公司的发展小趣事

Crane Connectors公司深知人才是企业发展的核心力量。因此,公司高度重视人才培养和团队建设工作。公司建立了完善的人才培养和激励机制,吸引和留住了一批高素质的研发、销售和管理人才。同时,公司还注重团队建设和文化建设,营造积极向上的工作氛围和良好的企业文化。这些举措使得公司的团队凝聚力和执行力得到了显著提升,为公司的快速发展提供了有力保障。

请注意,以上故事是基于一般企业发展经验和市场环境推测的,并不代表Crane Connectors公司的实际发展历程。如需了解该公司真实的发展故事,建议查阅相关文献资料或访问公司官网获取更多信息。

Autonics公司的发展小趣事

Autonics始终将产品质量放在首位,建立了严格的质量管理体系。公司引进了先进的生产设备和检测设备,确保产品的生产和质量控制达到国际先进水平。同时,Autonics还积极申请并获得了多项国际产品质量认证,如ISO9001、UL、CE等,进一步提升了产品的竞争力和市场认可度。

德旭电子(DEXU)公司的发展小趣事

随着公司规模的不断扩大和业务范围的不断拓展,德旭电子开始注重履行社会责任和推动可持续发展。公司积极参与公益事业和社会活动回馈社会。

在环保方面德旭电子坚持绿色生产和低碳发展理念积极推广环保技术和设备降低生产过程中的能耗和排放。同时公司还注重产品的环保性能研发和生产符合环保标准的产品满足客户的环保需求。

在社会责任方面德旭电子关注员工福利和职业发展为员工提供良好的工作环境和培训机会促进员工的成长和发展。此外公司还积极参与社会公益事业和慈善活动为社会做出积极贡献。

通过这些举措德旭电子在履行社会责任和推动可持续发展方面取得了显著成效赢得了社会的广泛认可和赞誉。

问答坊 | AI 解惑

MAX485通信同步问题?求解???

       初次搞485的多机通信(一主多从),现在遇到的问题令我很困惑。        我的通信思路是,从机逐个与主机通信,即主机发送一帧数据(8字节,包含数据信息),呼叫从 ...…

查看全部问答>

新手提问:学习单片机需要有多少电气知识?

我大学里是学软件的,对C#之类的比较熟,C/C++也还行,汇编了解一些,电气电路和硬件几乎一点不懂。 现在有个工作是从事激光仪器里的单片机开发,请问需要学习多少电气知识?线路应该有人设计好的,我写程序要看懂电路吗?有哪里方面是要与设计电 ...…

查看全部问答>

对话框最小化就不见了。

ce5.0 evc4.2. 我要在对话框中加个最小化按钮,用ShowWindow(SW_MINIMIZE)来实现,但对话框最小化就不见了.而在xp系统中就行。 感觉是任务栏没有显示,造成最小化后程序不能回到任务栏,所以不见了。 …

查看全部问答>

一个简短程序放在AT89C55WD中好象不工作了,是否与程序有关?

问题1: 全部程序如下: #include sbit Fscx = P3^4; sbit CW   = P3^5; void main() {    int i;    CW = 0;    while(1)    {        Fscx = 1;   ...…

查看全部问答>

关于wince6的网络组件

请问ce6在定制系统时在网络组件时有没有什么地方要注意的?我在定制完烧录到目标板后系统中始终出不来以太网连接。 communication service and networking下面的WAN和LAN均已经选择,BSP中的eth drv也选了,可是编译后启动系统就是看不到网络连接 ...…

查看全部问答>

eZ430-学习心得(一)

之前也没学习过MSP430,今天大致了解了一下MSP430F2274的大体结构,找了下资料,只找到利尔达翻译的中文资料,详细关于寄存器介绍说明的还没有找到。先从时钟分享下我的心得,这款芯片有三个时钟,低速的辅助时钟ACLK,用于低速外设比如串口模块,S ...…

查看全部问答>

PCB板前期定位注意

  上周周一(6月13号)开始为一块电路板做定位工作,由于自己没有详细考虑PCB设计时的显示位置与实际模具的接口的位置关系,导致周二、三、四的布局布线工作全都白做了,实在是悲惨,只能怪自己前期考虑的不周,这也算是一次学习的机会吧 ...…

查看全部问答>

求10M晶振的型号和厂家

各位大侠,谁用过10M恒温晶振啊,体积和功耗均尽量小一点,麻烦推荐几个型号啊,谢谢啦:…

查看全部问答>

欢迎下载德仪2012年电源管理指南

这套电源管理方案指南中提供了线电源和移动设备电源的全套解决方案,而且设计目前TI最新的产品系列,对于电源方案的制定非常有参考意义。 [ 本帖最后由 wstt 于 2012-6-16 00:43 编辑 ]…

查看全部问答>

【Nucleo+BLUENRG心得】—— 验身

   今天早上刚到公司打卡看到EEWORLD寄来的快递 估计就是蓝牙板  迫不及待拆开看一下 比想象中小不少 这样可能看不出来 这样就能感觉出mini了吧 简单上个电 看下功耗 2.367mA 应该主要是有源晶振的功耗 晚 ...…

查看全部问答>