新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LPC2132 調試記

        LPC2132 調試記

        作者: 時間:2016-11-10 來源:網絡 收藏
        最近公司開發一個新項目,出于成本的考慮,要求空間只能是32K+8K。選用LPC2131(ARM7微控制器芯片芯片),同時也選擇了UCOS-II實時操作系統。移植整個操作系統加上一些必備的驅動,總共花了12K?,F在作個小結,簡單的介紹下整個流程。(寫得非常膚淺,新手而已,只是因為以前調過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模式下。)

        本文引用地址:http://www.104case.com/article/201611/317258.htm

        (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

        FilesH-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,還有時鐘更改了,不要忘記在代碼中把時鐘的值更改過來。其他的基本上沒有什么問題,直接移植就可以了?,F在還差的就是做個最小文件系統啦(留出一塊空間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***************************



        關鍵詞: LPC2132調

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 仁寿县| 清流县| 台州市| 林口县| 金华市| 德格县| 伊金霍洛旗| 五指山市| 繁昌县| 田阳县| 长寿区| 赞皇县| 扎兰屯市| 商水县| 陆丰市| 巴东县| 罗江县| 松潘县| 奉节县| 开远市| 辰溪县| 孟州市| 济阳县| 丽水市| 卓尼县| 南华县| 余姚市| 武功县| 定陶县| 台中市| 汶上县| 陇南市| 诸城市| 阿尔山市| 苍梧县| 海晏县| 杭锦后旗| 怀宁县| 株洲市| 武鸣县| 姚安县|