打印

快崩溃了!!UCOS下的LCD程序求救!!!LPC2214

[复制链接]
3511|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
honeyfw|  楼主 | 2010-5-19 14:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 honeyfw 于 2010-5-20 10:35 编辑

我用的是LPC2214,程序是UCOS在ARM移植下的使用LCD程序,
情况如下:
我在ADS里面有两个工程,分别是不带UCOS的LCD程序和带UCOS的LCD程序(带UCOS的是直接移植后的程序),在板子上编译完全正常,下到FLASH后,裸奔的程序可以正常运行,LCD画面正常,带UCOS的程序中的LED正常,LCD画面正常,
但是,如果直接运行带UCOS的程序或者复位后直接运行,LCD画面就没有,LED正常亮,郁闷,
反正就是必须裸奔的程序先运行一遍,不复位,不断电,则带UCOS的程序可以正常运行效果,否则不正常,
求助大虾!!!!为什么啊???郁闷....已经纠结三天了.....工程如下:
                    
#include "config.h"

#define   BEEP      (1<<7)              /* P0.7为蜂鸣器控制 */
#define   TaskStkLength       64
#define   LED2       (1<<29)
#define   LED1       (1<<28)

OS_STK     TaskLCDStk[TaskStkLength];

// 声明外部函数
         
extern void  HzDisp(void);                                             




// LED1--LED4控制宏定义
#define   LED_ADJ                28
#define   LED_IOCON                (0xFF<<LED_ADJ)
#define   LED_OFF()             IO2SET=LED_IOCON
#define   LED_DISP(dat)         LED_OFF(); IO2CLR=((dat)<<LED_ADJ)

// 定义LED显示数据
uint8 const  LED_DISP_TAB[42] =
{   0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00,     // 全闪
    0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00,

    0x00, 0x01, 0x03, 0x07, 0x0F, 0x07,     // 向右增加
    0x03, 0x01, 0x00,
   
    0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A,     // 向左移动
    0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A,
   
    0x00, 0x08, 0x0C, 0x0E, 0x0F, 0x0E,     // 向右增加
    0x0C, 0x08, 0x00
};

static uint8  led_no = 0;                   // LED显示数据计数器(LED_DISP_TAB[led_no])
void  TaskLCD(void *pdata);


/****************************************************************************
* 名称:Time0Init()
* 功能:初始化定时器0,定时时间为0.3S,并打开中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
        void Timer0Init(void)
{

   
    T0IR = 0xffffffff;
    T0TC = 0;
    T0TCR = 0x01;
   
    T0MCR = 0x03;
    T0MR0 = (Fpclk / OS_TICKS_PER_SEC);
   

   
   
}


int main (void)
{
  OSInit();
  
  OSTaskCreate(TaskLCD,(void*)0,&TaskLCDStk[TaskStkLength-1],2);
  
  OSStart();
  
  return 0;
}


//主程序。控制LCD显示图片、汉字,控制LED显示流水灯。
void TaskLCD(void *pdata)
{   

    pdata=pdata;
   
    TargetInit();
   
   
    PINSEL0 = 0x00000000;
    PINSEL1 = 0x00000000;
   
   
      Timer0Init();
      VICInit();
      IO0SET |= BEEP;
      
     
   
   
   
         
    GUI_Initialize();  
    while(1)
    {   
         
      
      
        
      
                 
        // 显示"   广州周立功
        //          单片机
        //        发展有限公司 "      
        HzDisp();
        //DelayNS(10000000);                // 延时  
        OSTimeDly(10);
        GUI_ClearSCR();
    }
   
    //return(0);
}
void Timer0_Exception(void)
{
   OS_ENTER_CRITICAL();
  IO0DIR |= BEEP;
  IO0CLR |= BEEP;
  OSTimeDly(30);
  IO0SET |= BEEP;
  
   
   
   
    T0IR = 0x01;
    VICVectAddr0 = 0;            //interrupt close 通知中断控制器中断结束
    OSTimeTick();
   
    OS_EXIT_CRITICAL();
   
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

void  GUI_Initialize(void)
{  
    TftInit();
    TFT_FillSCR(BLACK);
}
void  TftInit(void)  
{   
    int  i;
    STCOM_INI  init_dat;

    TftReset();
  
    for(i = 0; i < 100; i++) {        // 设定最多100条初始化命令
        init_dat = TFT208E_INI;
        if(init_dat.com == DATA_END) break;
      
        TftSendCom(init_dat.com);
        TftSendDat(init_dat.dat);            
        DelaymS(init_dat.dly);      
    }
   
    TftSendCom(WR_RD_DATA);                  //WRITE DATA TO GRAM
}
void  TFT_FillSCR(uint16 dat)
{  
    uint16  i, j;
   
    TftSetWrite(0,0);
   
    for(i = 0; i < GUI_LCM_YMAX; i++) {                // 历遍所有行
        for(j = 0; j < GUI_LCM_XMAX; j++)        {        // 历遍所有行
            TftSendDat(dat);                                 // 填充数据
            }
    }

}

相关帖子

沙发
我是土匪| | 2010-5-20 09:04 | 只看该作者
情况很多:你的LCD任务执行了吗?

是否能贴出main函数,看看你的任务设置?

使用特权

评论回复
板凳
honeyfw|  楼主 | 2010-5-20 10:39 | 只看该作者
LCD任务执行了,可是单独运行不能出画面,必须先运行那个裸奔的程序才可以,今天已经不能完全刷出来了又。..晕,又出问题了... 2# 我是土匪

使用特权

评论回复
地板
我是土匪| | 2010-5-20 13:55 | 只看该作者
本帖最后由 我是土匪 于 2010-5-20 13:57 编辑

你的意思LCD屏幕没有显示,必须先跑一遍裸奔的代码,在背光点亮的前提下再跑UCOSII的代码?

如果这样,猜测TFT的连接方式采用了总线方式,请重新配置你的总线,比如速度。

使用特权

评论回复
5
pipixiong999| | 2010-6-29 10:38 | 只看该作者
有可能是功耗的问题,在用LCD时建议把LED关掉试试

使用特权

评论回复
6
honeyfw|  楼主 | 2010-6-29 11:39 | 只看该作者
已搞定~~

使用特权

评论回复
7
我是土匪| | 2010-6-30 10:52 | 只看该作者
能说说原因吗?分享一下。

使用特权

评论回复
8
honeyfw|  楼主 | 2010-8-16 17:25 | 只看该作者
我把总线方式重新配置了下,BCFG寄存器设置了下,就搞定了~~~

使用特权

评论回复
9
pcbmxh| | 2010-8-16 17:33 | 只看该作者
要求LZ分享。。嘻

使用特权

评论回复
10
honeyfw|  楼主 | 2010-8-16 17:52 | 只看该作者
我在startup.s文件里的ResetInit汇编函数中把总线配了一遍,如下所示:
ResetInit
;Initial extenal bus controller.
;初始化外部总线控制器,根据目标板决定配置

        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, =0x0f814910
    ELSE
        LDR     R1, =0x0f814914
    ENDIF
       STR     R1, [R0]
        
; 定义总线速度控制字
BCFG_DEF        EQU                0x10000400

IDCY                EQU                (0x01<<0)
WST1                EQU                (0x03<<5)
WST2                EQU                (0x03<<11)
BCFG3_SET        EQU                (BCFG_DEF | IDCY | WST1 | WST2)


IDCYFS                EQU                (0x01<<0)
WST1FS                EQU                (0x03<<5)
WST2FS                EQU                (0x03<<11)
BCFG_FS     EQU                (BCFG_DEF | IDCYFS | WST1FS | WST2FS)
        

        LDR     R0, =BCFG0
        LDR     R1, =BCFG_FS
        STR     R1, [R0]

        LDR     R0, =BCFG1
        LDR     R1, =BCFG_FS
        STR     R1, [R0]

        LDR     R0, =BCFG2
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

        LDR     R0, =BCFG3
        LDR     R1, =BCFG3_SET
        STR     R1, [R0]
        
        BL      InitStack               ;初始化堆栈 Initialize the stack
        BL      TargetResetInit         ;目标板基本初始化 Initialize the target board
                                        ;跳转到c语言入口 Jump to the entry point of C program
        B       __main
那会整的头都晕了,共享下给大家看看~~希望对同样问题的朋友有帮助~~

使用特权

评论回复
11
我是土匪| | 2010-8-18 09:45 | 只看该作者
你的意思LCD屏幕没有显示,必须先跑一遍裸奔的代码,在背光点亮的前提下再跑UCOSII的代码?

如果这样,猜测TFT的连接方式采用了总线方式,请重新配置你的总线,比如速度。 ...
我是土匪 发表于 2010-5-20 13:55



“请重新配置你的总线,比如速度”

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

1

粉丝