手上有一块板子,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);
} |