您的位置 首页 国产IC

LPC2132 调试记

最近公司开发一个新项目,出于成本的考虑,要求空间只能是32K+8K。选用LPC2131(ARM7微控制器芯片芯片),同时也选择了UCOS-II实时操作系统。…

最近公司开发一个新项目,出于本钱的考虑,要求空间只能是32K+8K。选用LPC2131(ARM7微操控器芯片芯片),一起也挑选了UCOS-II实时操作体系。移植整个操作体系加上一些必备的驱动,一共花了12K。现在作个小结,简略的介绍下整个流程。(写得十分浅薄,新手罢了,仅仅由于曾经调过LPC2100开发板,所以司理将这个使命交给了我)(曾经的项目是数据收集体系。上位机用的三星的S3C2410,LINUX2.6.x内核,用QToptia用户界面+sqlite数据库,底层是SOCKET编程,下位机是菲利浦的LPC2100,首要用于收集数据和AD转化(OS:usLinux, SOCKET编程+底层ADC驱动))

1、检查快速入门,快速把握烧写FLASH和JTAG东西,ADS1.2。(相关东西在Software&Driver文件夹下)

(1)LPC2131 FLASH东西:philips公司的LPC2100 Flash Utility V2.2.0 .
(a)波特率设置为9600,时钟设为11050KHZ,time-ou[sec]:2(别的,buffer->flashbuf operation->Download flash可以从flash上下载程序到本机后,再与本机的程序比较是否共同,挑选Compare Flash时可以进行flash上程序的校验)
(b)”Upload to Flash”前先要P0.14对地拉低(将ISP(JP1)跳线),程序固化后,将ISP(JP1)跳线帽断开,从头复位体系即可运转程序。LPC2100系列ARM7微操控器芯片具有ISP功用,可以经过串口进行程序下载。(这点十分重要,在咱们公司的硬件出板后,我调试板子时,用JTAG调试,程序可以运转,可是用串口下载完程序,从头复位后没有一点反响。后来查过便是硬件规划上没有设置这个跳线。也没有依照如上的要求来进行程序的下载和运转。下载和运转时P0.14脚都为低电平。阐明一直是在ISP形式下。)

(2)EasyJTAG-H和H-JTAG可进行硬件仿真调试(不知道有谁知道怎么固化,敬请赐教)EasyJtag可以固化,可是我运用时,总是有过错呈现,衔接不到,网上查过过错原因,许多人有过这样的过错,可是没有找到解决方法。

(3)ADS1.2集成开发环境几个留意点:

(a)Debug Settings ->linker->ARM Linker设置RO(或许指定.scf文件)

(b)Debug Settings ->Target->Target Settings->Post-Linker (ARM fromELF)

(c)Debug Settings ->Liker->ARM fromELF指定output format(Intel 32 bit Hex)

和output file name(/xx/xx/xxx.hex)

(d)指定生成的文件夹为DebugInRam,假如是RelInFlash的话,会对芯片加密,需

要用ISP大局擦除后,才干康复JTAG调试及ISP读/写操作。

(e) ADX装备好调试方针。Option->configure Target->ADD->D:\Program

Files\H-JTAG V0.3.1目录下的H-JTAG .dll,点击“翻开”即可。

Option->configure Target ->Choose Target->H-JTAG

2、快速运转示例代码。在此基础上进行修正可以省去许多时刻。移植了UCOS-II操作体系,修正了I2C(模仿I2C),UART0, BEEP(用于测验),中止处理,用一个硬件时钟模仿多个软件时钟。参阅网上代码后修正(作者:21icbbs LPC900,2005-08)示例代码见最终例1。

3、开发板上调试完毕后,关键在于板子出来后的调试。此刻的问题,或许是硬件,或许是软件。需求软硬件合作调试。做好作业日志,由于此刻的问题假如不做好记载,会导致大货时问题没有得到更改。比方前面说到的这次硬件规划上没有规划ISP跳线的问题。别的,开发板上的某些硬件或许与实践板子的有所不同,要稍加留意。如:咱们公司出板时用的CPU是LPC2132,与LPC2131的不同是LPC2132是64K+16K,还有时钟更改了,不要忘记在代码中把时钟的值更改过来。其他的根本上没有什么问题,直接移植就可以了。现在还差的便是做个最小文件体系啦(留出一块空间512字节,可存储,可擦除,还要带CRC校验)啊,尽力吧。要学的东西太多啦。

4、顺便讲一下削减代码的一些方法。

(a)在startup.s中的跳转函数进口,不要写main函数,改为其它姓名,也便是把自己的进口函数的姓名改掉。由于假如是main进口的话,ads1.2会做一大堆大局变量的COPY和搬移。在用ADS单步调试时会发现在进入main之前会先做_main.这便是在做这些作业。可是假如这样做的话,要记住大局变量和静态变量RODATA段的初始值会丢掉,需求在用这些变量前再赋下值。

(b)尽量不必或少用库函数,如atoi,strcmp,strcp等等,而是由自己去完成,这样可以削减链接一些不必要的库文件。

以上二者做的适中的话,或许可以削减10K的代码量

(c)UCOS_II.h中供给了内核削减的可装备,轻松削减代码。

例1:target.c文件

//界说软件守时器数量(至少1个)

#define TIMER_N8

//界说软件守时器结构

//每个守时器只占用2个字节

struct

{

volatile unsigned TV:32;//32位守时值

unsigned long data;//作为参数被传入守时器处理函数

void (*function)(unsigned long);//callback

volatile unsigned TR:1;//起停标志,0-中止运转,1-开端运转

volatile unsigned TF:1;//溢出标志,0-未溢出,1-溢出

}Timer[TIMER_N];

/*

运用守时器T0模仿多个软件守时器

原创作者:21icbbs LPC900,2005-08

更改:May Wong 2008-6-13 (LPC2131)

特色:

只占用一个硬件守时器T0,就可以扩展出多达数十个以上的软件守时器

软件守时器根本守时单位是5ms,守时规模很宽:0.01~163.84s

软件守时器数量可以按需求设定,

运用守时器T0的主动重装特性,可以完成一切软件守时器的准确守时

一切软件守时器都作业在32位倒计时方法,用TR和TF位操控,运用极为便利

第0号守时器专门用于Delay()函数,其它守时器可供用户程序自在运用

*/

/*

函数:TimerOn()

功用:发动守时器

参数:

t:守时器初值,取值0~4294967295

t>0时,守时(0.01*t)s

t=0时,守时163.84s

unsigned long data:作为参数被传入守时器处理函数

 void (*function)(unsigned long): callback function

return:-1(error)else守时器序号

*/

int TimerOn(unsigned int t,unsigned long funpara,void(*function)(unsigned long))

{

unsigned int i;

INT32U da_year,da_mon,da_day,ti_hour,ti_min,ti_sec;/*test start time*/

for (i = 1; i < TIMER_N;i++)

{

if (Timer[i].TR == 0)

{

//Timer[i].TR = 0;

Timer[i].TF = 0;

Timer[i].TV = t;

Timer[i].TR = 1;

Timer[i].function = function;

Timer[i].data = funpara;

break;

}

}

if (i == TIMER_N)

return -1;

else

returni;

}

/*

函数:TimerOff()

功用:封闭守时器

参数:

n:守时器序号

*/

void TimerOff(unsigned char n)

{

Timer[n].TR = 0;

Timer[n].TF = 0;

}

/*

函数:Delay()

功用:延时0.01~163.84s

参数:

t:延时参数,取值0~16383

t>0时,延时(0.01*t)s

t=0时,延时163.84s

*/

void Delay(unsigned int t)

{

Timer[0].TR = 0;

Timer[0].TF = 0;

Timer[0].TV = t;

Timer[0].TR = 1;

// TimerOn(t,NULL,NULL);

for (;;)

{

//PCON |= 0x01;

T0TCR |= 0x01;/*reset*/

if (Timer[0].TF)

{

TimerOff(0);

break;

}

}

}

/*********************************************************************************************************

** Function name:Timer0_Exception

**

** Descriptions:Timer0 interrupt service function

**

** input parameters:None

** Returned value:None

**

** Used global variables:None

** Calling modules:None

**

**——————————————————————————————————

********************************************************************************************************/

/*

函数:Timer0_Exception()

功用:守时器中止服务函数,每(Fcclk / 4) * 1/ 200中止1次

*/

void Timer0_Exception(void)

{

//unsigned char i;

unsigned int i;

//TF2 = 0;

for ( i=0; i

{

//beep();//beep ok

if (Timer[i].TR)

{

if ( –Timer[i].TV == 0 )

{

UART0Putch(0);

Timer[i].TF = 1;

TimerOff(i);

(Timer[i].function)(Timer[i].data);

UART0Putch(0);

//beep();

//UART0Putch(0);

}

}

}

T0IR = 0x01;/* match tunnel 1 intrrupt flag铲除中止标*/

VICVectAddr = 0;//interrupt close告诉中止操控器中止完毕

OSTimeTick();

}

/*********************************************************************************************************

** Function name:Timer0Init

**

** Descriptions:Initialize the Time0

**

** input parameters:None

** Returned value:None

**

** Used global variables:None

** Calling modules:None

**——————————————————————————————————-

** Modified by:

** Modified date:

**——————————————————————————————————

********************************************************************************************************/

void Timer0Init(void)

{

unsigned int x;

unsigned char i;

for ( i=0; i

{

Timer[i].TR = 0;

Timer[i].TF = 0;

Timer[i].TV = 0;

}

T0IR = 0xffffffff;/*timer intrrupt register1 reset*/

T0PR= 0;/*时钟不分频*/

T0TC = 0;/*counter*/

T0TCR = 0x01;/*counter control reginster 1 reset */

T0MCR = 0x03;/*[0:1] 11tc reset/ intrrupt when match*/

T0MR0 = (Fpclk / OS_TICKS_PER_SEC);/*(Fcclk / 4) * 1/ 2005ms钟守时*/

}

/*********************************************************************************************************

** Function name:VICInit

**

** Descriptions:Initialize the Interrupt Vevtor Controller

**

** input parameters:None

** Returned value:None

**

** Used global variables:None

** Calling modules:None

**

**——————————————————————————————————

********************************************************************************************************/

void VICInit(void)

{

extern void IRQ_Handler(void);

extern void Timer0_Handler(void);

extern void I2c_Handler(void);

#if 0

extern void UART0_Handler(void);

#endif

VICIntEnClr = 0xffffffff;/*clear interrupt*/

VICDefVectAddr = (uint32)IRQ_Handler;

VICVectAddr0 = (uint32)Timer0_Handler;/*设置中止服务程序地址*/

VICVectCntl0 = (0x20 | 0x04);/*设置守时器0中止通道分配最高优先级*/

VICIntEnable = 1 << 4;/*使能守时器0中止

/*I2c*/

VICVectAddr12 = (uint32)I2c_Handler;

VICVectCntl12 = (0x20 | 9);

#if 0

/*Uart*/

VICVectAddr14 = (uint32)UART0_Handler;

VICVectCntl14 = (0x20 | 0x06);

VICIntEnable = 1 << 6;

#endif

}

/*********************************************************************************************************

** Function name:TargetInit

**

** Descriptions:Initialize the target board; it is called in a necessary place, change it as

**needed

**

** input parameters:None

** Returned value:None

**

** Used global variables:None

** Calling modules:None

**

********************************************************************************************************/

void TargetInit(void)

{

OS_ENTER_CRITICAL();

srand((uint32) TargetInit);

VICInit();

Timer0Init();

I2cInit(100000);

UART0Init(115200);

OS_EXIT_CRITICAL();

}

Main中测验代码如下:

#include “config.h”

#defineTASK_STK_SIZE64

#defineLEN50

//OS_STKTaskStk[TASK_STK_SIZE];

OS_STKTaskStartStk[TASK_STK_SIZE];

voidTaskStart(void *data);

#defineBEEP(1<<7)/* P0.7引脚操控BEEPjust test I2C */

void initbeep()

{

/*封闭BEEP */

IO0DIR |= BEEP;/*设置BEEP操控口为输出*/

PINSEL0 = (PINSEL0 & 0xffff3fff);

IO0SET = BEEP;

}

void beep()

{

/*for test*/

IO0CLR = BEEP;

OSTimeDly(OS_TICKS_PER_SEC / 2);/*蜂鸣器响一声*/

IO0SET = BEEP;

}

/*********************************************************************************************************

**函数称号: main

**功用描绘: c言语的主函数,由它发动多使命环境

**输 入:无

**输 出:无

**大局变量:无

**调用模块: PC_DispClrScr,OSInit,OSTaskCreate,OSStart

**——————————————————————————————————

********************************************************************************************************/

int main (void)

{

OSInit();

TargetInit();

initbeep();

OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE – 1], 5);

OSStart();

return 0;

}

void testfun3(unsigned long para)

{

UART0Putch(3);

}

void testTimer()

{

/* -1 not enough timer else return timer No.*/

if(TimerOn(800,10,testfun3) == -1)

beep();

else

UART0Putch(n);//ok

}

/*********************************************************************************************************

**函数称号: TaskStart

**功用描绘:μCOS-II的第一个使命,一般由它初始化方针板和树立其它使命

**输 入:无

**输 出:无

**大局变量:无

**调用模块:

**

********************************************************************************************************/

voidTaskStart (void *pdata)

{

pdata = pdata;/*防止编译正告*/

/*test timer0*/

testTimer();

while(1)

}

/*********************************************************************************************************End Of File***************************

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/275712.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部