linux调试MCX314AL过程

    以前无论用动态映射还是静态映射用串口输出和电压表测量,以为能正常读不能正常些,现在在MCX314AL加上二极管测量,使用iowrite等函数写值时二极管能有正常显示,但是一闪而过,分析原因是不是后续的程序干扰了MCX314AL的写寄存器(也许就是MCX314AL的时序不严格的坏处)。

   回想前面裸跑程序当中,给MCX314AL写值之后LCD的显示程序也会对其造成干扰,会不会问题是同一个问题.

   现在要做的事情:调试裸机程序,找出LCD显示程序对MCX314AL写值干扰的具体原因。

  调试:1、初始化不影响MCX314AL写值

              2、Paint_Bmp1和Paint_Bmp函数影响MCX314AL赋值,两种现象:

                    a、单步调试先写MCX314AL,再进入Paint_Bmp1函数,在该函数运行到一半是灯灭了(MCX314AL的写值改变了),Paint_Bmp1是一个给LCD显示缓冲区输入值,查看是不是缓冲区与MCX314AL的寄存器区相冲突,用串口把数组地址值输出,不冲突。

                    b、先运行Paint_Bmp1函数完毕,在写MCX314AL,接MCX314的LED灯一闪而过(写值不能保持)。

              3、按照2中a中的现象对函数Paint_Bmp1单步调试

<pre class="objc" name="code">/****************************************************************************
函数名称:Paint_Bmp1
功能:在以x0、y0为起点坐标,h为长度,l为高度,k为缩小倍数显示bmp[]图片
参数:x0:图片起点横坐标,y0:图片起点纵坐标,h:图片高度,l:图片宽度,k:缩小倍数,bmp[]:图片像素点的C数组(16位色)
注意事项:以图片左上角为起点
*********************************************************************************/
void Paint_Bmp1(int x0,int y0,int h,int l,int k,unsigned char bmp[])//例如,k=8;意思就是将图片缩小到1/k,k可以等于2、4、8等
{
	int x,y;
	U32 c;
	int p = 0;	
	h=h/k;
	l=l/k;
    for( y = 0 ; y < l ; y++ )
    {
    	for( x = 0 ; x < h ; x++ )
    	{
    		c = bmp[p+1] | (bmp[p]<<8) ;        //数组的两个元素拼凑成一个16位色像素点,<span style="color:#ff0000;">注:如果注销掉这一行,MCX314AL能正常写值
</span>			if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) ) //判断一行是否显示完毕
				LCD_BUFFER[y0+y][x0+x] = c ;		//赋值给显示缓冲区
    		p = p + 2*k;					//数组偏移加2
    	}
    	p=p+480*2*(k-1);				//由于缩小8倍,高和宽都每隔2*8个数组元素取两个值
    }
}
<pre class="objc" name="code">/****************************************************************************
函数名称:Paint_Bmp
功能:在以x0、y0为起点坐标,h为长度,l为高度显示bmp[]图片
参数:x0:图片起点横坐标,y0:图片起点纵坐标,h:图片高度,l:图片宽度,bmp[]:图片像素点的C数组(16位色)
注意事项:以图片左上角为起点
*********************************************************************************/

/**************************************************************
在LCD屏幕上指定坐标点画一个指定大小的图片
**************************************************************/
void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{
	int x,y;
	U32 c;
	int p = 0;
	
	
    for( y = y0 ; y < l ; y++ )
    {
    	for( x = x0 ; x < h ; x++ )
    	{
    		c = bmp[p+1] | (bmp[p]<<8) ;

			if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
				LCD_BUFFER[y0+y][x0+x] = c ;
			
    		p = p + 2 ;
    	}
    }
}


 

对函数Paint_Bmp1单步调试到c = bmp[p+1] | (bmp[p]<<8) ; //注:如果注销掉这一行,MCX314AL能正常写值

程序的反汇编代码如下

对以上6条反汇编代码调试和观察寄存器变化,程序正常运行,没有跑飞,指令中没有牵涉到改变MCX314AL寄存器0x18000000-0x18000010的值,但是程序单步调试的过程当中LED灯灭了(MCX314AL寄存器有值写进去),并且LED灯每次熄灭的时间点不固定。

出现以上现象分析如下:

1、会不会是被复位了,以下是复位电路

MCX314AL的复位电路和S3C2440A公用,由按键控制(硬件控制),故排除可能;

2、电源不稳,MCX314AL的电源电路和S3C2440A公用,都为3.3V,故排除可能;

3、MCX314AL外部16M晶振电路不稳定,采用的16M有源晶振,电路图如下:

程序上单步调试无问题,硬件考虑过后,除了MCX314AL芯片本身问题,晶振输出一般不会受外界影响,但是也不能排除有影响。

3、按照2中b中的现象对 语句rMCXWR4 = 0x1234;进行单步调试,反汇编如下

 

rMCXWR4 = 0x1234反汇编成3条语句

 

LDR    R0,[PC,#0114];R0的值等于0x1234

MOV   R1,#0x18000000

STRH  R0,[R1,#8];R0赋值给0X1800008地址空间

单步调试第三条语句过后,LED灯闪了一下又灭了(证明值是写进去了),对nGCS3的初始化在rMCXWR4 = 0x1234前面已经用串口验证过nGCS3初始化是对的,注销掉

前面的Paint_Bmp1()函数,LED能一直保持亮,故断定Paint_Bmp1()LCD显示函数(说白了就是c = bmp[p+1] | (bmp[p]<<8) ;语句)影响到MCX314AL读写,但是程序单步调试(包括看每个寄存器的值都是对的),会不会是硬件不稳定?

以上调试完成,无意中有了新情况,仔细看,发现前面用的图片基本是白色区域,也就是说图片C数组数据里面0xFF较多,将显示的图片换成白色区域较少的图片,调试MCX314AL写值正常,我的理解是0xff输出的数据全是高电平造成干扰大

将Paint_Bmp1()函数中

LCD_BUFFER[y0+y][x0+x] = c ;

这条语句改成

LCD_BUFFER[y0+y][x0+x] = 0x0000;

程序能跑正常,MCX314AL写正常;

若改成LCD_BUFFER[y0+y][x0+x] = 0x0000;

MCX314AL值受影响。

而串口起始LCD_BUFFER地址&LCD_BUFFER = 0x30880958

程序不存在问题。

总结以上分析,得出结论如下:

    基本排除程序问题(但是不排除使用改变程序的方法减小干扰,这样总归是不可行的);

    MCX314AL能正确读写值,但是有与读和写不一样,不需要保持数据,故读无影响,写受到数据输出的影响;

    可能是nGCS3受到影响;

解决方法:

    借用其他ARM9开发板试试;

    重新做个晶振电路;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL2303HX+MAX485ESA+CH376S+MCX314AL protel99se原理图库+PCB封装库,可以用于protel99se或AD的设计,PCB封装库列表如下: Component Count : 483 Component Name ----------------------------------------------- 2X20 3.81mm36pin 3.81mm36pin - duplicate 3.81mm40pin - duplicate 3.81mm40pin - duplicate - duplicate 3.81mm接线端子 3.81mm接线端子 - duplicate 3.81MM接线端子32Pin 3.81MM接线端子32Pin - duplicate 3端接口 4M-3PIN-SMT 4PAD 9PIN-SMT 10U_TAN 10uH-SMT 12C4052 12P端子 15D471K 15P header 24V电源端子 30PIN端子 40P-SMT 74HC02 100UF 100UH-SMT 0603 DB9 DB9/F DB9/M DB9RA/F DB9RA/M DB25D/F DB25D/M DB62C/F DB62C/M DB62D/F DB62D/M DC-JACK-S DC10B DF9B-41P-1V DHT11 KEY KEY_M KLD-0202 - 3mm L_SOP74 L-3 L-5.08 L1 L1 - duplicate L0603 LCD-TH LCD16 LCD21 LED_3MM LED-3 LED-5 LED-S LED2 LED0805-D LL4148 LM317 LM317-T LOGO_JINGDIAN LQFP-48 LQFP-144 LQFP-144 - duplicate LQFP144 LW18_N LW18_N - duplicate MCU-80 MIC-6022 MicroUSB_D1 MOS-1N MQFP100 MS5534B-B MS5534B-T MSOP-10 MSOP8 MSS-22D18-DIP mTQFP48 MULTIWATT15-H MULTIWATT15-V NAP-55A NETJACK NPN NRF24L01 NSO8_N NSO8_N - duplicate PCBComponent_1 PCBComponent_1 - duplicate PCI-44 PCI-SLOT PDIUSBD12 PHONE_ST PQFP176 PQFP240 QFN68 QFP44 QFP64 QFP100 R1 R2 R0603 R0603 - duplicate R0805 R0805 - duplicate R0805 - duplicate1 R0805 - duplicate2 R1206 RAD0.5 RB-.2/.5 RB-.3/.6 RB-3.4/8.2 RELAY-2CH1- F-C RELAY-5VDC RELAY-5VDC-MINI RELAY-12VDC RELAY-12VDC -S RELAY-TX2-5 RES2 RJ45-LED RN1 RP-8P4R RT RV RXA15 S3C44B0 SCA100T SCK2010C SD_PUSH SDCARD SDCARD_L SENSOR-6P SHT11 SHT75 SIP3-C SIP3-O2 SIP4-1.27 SIP6-1.27 SMB SMBJ SMDLED SMT-2*40PIN SO-4 SO-6 SO-8 SO-14 SO-16 SO-16B SO-18 SO-20 SO-24B SO-28 SO8 SODIP-8 SOIC-8 SOP-4 SOP-4 - duplicate SOP-8 SOP8-1 SOP16-1.27 SOP16M SOT-23-5 SOT-23-6 SOT-23R SOT-89 SOT-123 SOT-223 SOT-BEC SOT23-5 SOT89 SOT96-1_N SOT96-1_N - duplicate SOT223 SOT223 - duplicate SRP6 SS34 6*3.6 SSOP-28 SSOP-28 - duplicate SSOP16 SSOP20 SSOP28 SSOP28-B SSOP48 STM-LQFP100_N STM-LQFP100_N - duplicate SW-2 SW-2P SW-3 SW-3A sw-4 SW-4_SMT SW-4-B SW-5 SW-6X6-4S SW-DIP8 SW2-3 SW4-H SW4-S SW16B S

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值