OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4756|回复: 0

请教原子关于UCOS+uCGUI后程序死机的问题?多谢了~

[复制链接]

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-8-9
在线时间
7 小时
发表于 2013-5-13 11:43:44 | 显示全部楼层 |阅读模式
手上有一块板子,zet6主控,fsmc接TFT,然后呢在裸机下,TFT驱动没有问题,在Ucos下直接操作tft驱动也没有问题。但是我在UCOS+uCGUI下,就不行了,程序就死机了,根据目前的测试结果,发现在GUI_Init()中调用的LCD_Init(),再往下是调用LCD_L0_Init(),往下是LCD_INIT_CONTROLLER()这个宏定义,而这个宏定义是
#define LCD_INIT_CONTROLLER()  LCD_USER_Init() .按照上面的逻辑进行调用初始化的时候就会死机,连状态指示灯都不闪烁了。
我尝试着在LCD_Init()中不调用r |= LCD_L0_Init();而是改为直接调用LCD_USER_Init() 就可以了。
还有一个问题是,当利用上面的方法程序可以运行的时候,这个时候如果在void LCD_USER_Init(void)中定义一个变量,不管是u8、u16、u32,比如u16 Temp = 0x00;这样也会造成死机。
真是百思不得其解啊~~
首先想到的是堆栈溢出,于是改大堆栈,依旧死机。还有就是字节对齐的问题,于是在声明任务堆栈的时候前面添加了__align(8) static  OS_STK  LED_TASK_STK[LED_STK_SIZE];
可是问题依旧存在啊~~~
已经调试了很久,希望原子大哥能够帮忙解惑一下啊~~~

//RS接的A0
//LCD地址结构体
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
   
#define LCD_BASE    ((u32)(0x6C000000 | 0x00000000))
#define LCD_LCD     ((LCD_TypeDef *) LCD_BASE)



//LCD初始化函数,根据原子模版改写
void LCD_USER_Init(void)
{
// u16 Temp = 0x00;

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef  readWriteTiming; 
FSMC_NORSRAMTimingInitTypeDef  writeTiming;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                    RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                    RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                           GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | 
                           GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | 
                           GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
                           GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//设置PF0(即FSMC中的A0为RS)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//设置PG12(NE4 (LCD/CS)作为LCD的CS信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure); 
//背光控制引脚A1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
//LCD_FSMCConfig
writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK  
    writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A
    writeTiming.FSMC_DataSetupTime = 0x03; ////数据保存时间为4个HCLK
    writeTiming.FSMC_BusTurnAroundDuration = 0x00;
    writeTiming.FSMC_CLKDivision = 0x00;
    writeTiming.FSMC_DataLatency = 0x00;
    writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A 
 
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; 
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //  存储器写使能
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; 
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1  
 
delay_ms(50); // delay 50 ms 
  LCD_WriteReg(0x0000,0x0001);
delay_ms(50); // delay 50 ms 
  //lcddev.id = LCD_ReadReg(0x0000);
lcddev.id= LCD_ReadReg(0x0000);

//LCD_WR_REG(0x0000); //写入要读的寄存器序号
//delay_us(5);
//Temp = (u16)(*(__IO uint32_t *)(0x6C000000 | 0x00000002));

// printf("aaa :%x\n",lcddev.id);
// printf("Counter:55\n");
 
LCD_WriteReg(0x000,0x0000);
LCD_WriteReg(0x000,0x0000);
LCD_WriteReg(0x000,0x0000);
LCD_WriteReg(0x000,0x0000);
delay_ms(15);

LCD_WriteReg(0x008,0x0808);
LCD_WriteReg(0x010,0x0010);
LCD_WriteReg(0x400,0x6200);

LCD_WriteReg(0x300,0x0c06);//GAMMA
LCD_WriteReg(0x301,0x9d0f);
LCD_WriteReg(0x302,0x0b05);
LCD_WriteReg(0x303,0x1217);
LCD_WriteReg(0x304,0x3333);
LCD_WriteReg(0x305,0x1712);
LCD_WriteReg(0x306,0x950b);
LCD_WriteReg(0x307,0x0f0d);
LCD_WriteReg(0x308,0x060c); 
LCD_WriteReg(0x309,0x0000);

LCD_WriteReg(0x011,0x0202);
LCD_WriteReg(0x012,0x0101);
LCD_WriteReg(0x013,0x0001);

LCD_WriteReg(0x007,0x0001);
LCD_WriteReg(0x100,0x0730);//BT,AP 0x0330
LCD_WriteReg(0x101,0x0237);//DC0,DC1,VC
LCD_WriteReg(0x103,0x2b00);//VDV //0x0f00
LCD_WriteReg(0x280,0x4000);//VCM
LCD_WriteReg(0x102,0x81b0);//VRH,VCMR,PSON,PON
delay_ms(15);


LCD_WriteReg(0x001,0x0100);
LCD_WriteReg(0x002,0x0100);
LCD_WriteReg(0x003,0x1030);
LCD_WriteReg(0x009,0x0001);
LCD_WriteReg(0x0C,0x0000); //MCU interface 

LCD_WriteReg(0x090,0x8000);
LCD_WriteReg(0x00f,0x0000);

LCD_WriteReg(0x210,0x0000);
LCD_WriteReg(0x211,0x00ef);
LCD_WriteReg(0x212,0x0000);
LCD_WriteReg(0x213,0x018f);

LCD_WriteReg(0x500,0x0000);
LCD_WriteReg(0x501,0x0000);
LCD_WriteReg(0x502,0x005f);
LCD_WriteReg(0x401,0x0001);
LCD_WriteReg(0x404,0x0000);
delay_ms(15);
LCD_WriteReg(0x007,0x0100);
delay_ms(15);

LCD_WriteReg(0x200,0x0000);
LCD_WriteReg(0x201,0x0000);
  delay_ms(15);

LCD_Display_Dir(1); //默认为竖屏
LCD_LED=1; //点亮背光
LCD_Clear(BLUE);
抛弃浮躁,努力学习~~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表