在线时间104 小时
UID3338547
注册时间2017-1-28
NXP金币14
TA的每日心情 | 无聊 2021-12-29 19:06 |
---|
签到天数: 47 天 连续签到: 1 天 [LV.5]常住居民I
金牌会员
 
- 积分
- 1392
- 最后登录
- 2025-3-4
|
本帖最后由 day_day 于 2020-2-18 20:43 编辑
(一)emwin
emwin 基本是目前主流的嵌入式界面解决方案,例程也是默认给这个方案。
其余还有比如gfx、rtt自带图形、最近迅速崛起的guilite
但最方便的还是传统的emwin,依据官方例程,可以迅速地在自己的工程内模块化添加emwin,而非强耦合扰乱工程秩序。
驱动LCD的帖子见:驱动LCD但本次移植不使用图形界面生成的驱动代码,因为图形界面的配置有点局限,无法满足emwin的需要,生成的文件是只读的,修改会破坏图形界面配置文件的再配置功能
(二)移植
1-添加接口文件
接口文件是笔者个人的说话,指代emwin与特定mcu驱动之间交互的文件。
这里可以直接采用官方已经移植好的文件,找一个emwin的例程,把emwin_support的头文件和源文件一起加入工程。
2-添加触控驱动
添加fsl_ft5406的头文件和源文件
3-main函数初始化时添加驱动函数
- BOARD_InitLCDPins();
- BOARD_InitACCELPins();
- BOARD_InitSDRAMPins();
- BOARD_InitSDRAM();
- APP_LCDC_Init();
复制代码
上面的三个函数是引脚初始化
第一个是驱动LCD的引脚
第二个是驱动触控芯片的引脚,虽然函数本来是针对加速度传感器的,但加速度传感器与触控芯片挂在同一条i2c总线上。
第三个是驱动SDRAM的引脚,这个是必须,片上sram虽然大,但面对emwin这种吃内存的大户也吃不消,更何况24bit的bpp已经溢出了300%
注意,这个时候我们已经不使用图形界面配置的那个LCD驱动了,需要把图形界面配置的驱动去掉,因为图形界面似乎没办法把缓存指向片外的SDRAM。
APP_LCDC_Init 函数和图形界面配置出来的初始化函数区别仅在于:
- lcdConfig.upperPanelAddr = VRAM_ADDR;
复制代码
VRAM_ADDR 是地址 ((0xa0000000) + 0x50000)
转换一下就会发现已经溢出了220K的片内SRAM,这也是为什么需要初始化SDRAM的原因,只有SDRAM这种128M的大内存才能处理。同样,如果闪存超出,即程序过大,也可以使用片上的SPI FLASH,同样有128M之大。
4-添加emwin相关初始化函数
- SysTick_Config(SystemCoreClock / 1000U);
- BOARD_InitPWM();
- Init_CTIMER();
- GUI_Init();
- WM_MULTIBUF_Enable(1);
- GUI_UC_SetEncodeUTF8();
- CreateFramewin();
- WM_Exec();
复制代码
SysTick_Config 是必要的,emwin需要systick定时器。BOARD_InitPWM则不一定需要,这个是调光用的。
因此需要加上两个函数:
- #define CTIMER CTIMER3 /* Timer 3 */
- #define CTIMER_MAT_OUT kCTIMER_Match_1 /* Match output 1 */
- #define CTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_AsyncApbClk)
- #define CTIMER_PRESCALE (CTIMER_CLK_FREQ / 1000)
- void BOARD_InitPWM(void)
- {
- sctimer_config_t config;
- sctimer_pwm_signal_param_t pwmParam;
- uint32_t event;
- CLOCK_AttachClk(kMAIN_CLK_to_SCT_CLK);
- CLOCK_SetClkDiv(kCLOCK_DivSctClk, 2, true);
- SCTIMER_GetDefaultConfig(&config);
- SCTIMER_Init(SCT0, &config);
- pwmParam.output = kSCTIMER_Out_5;
- pwmParam.level = kSCTIMER_HighTrue;
- pwmParam.dutyCyclePercent = 5;
- SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, 1000U, CLOCK_GetSctClkFreq(), &event);
- }
- void Init_CTIMER(void)
- {
- ctimer_config_t config;
- /* Enable the asynchronous bridge */
- SYSCON->ASYNCAPBCTRL = 1;
- /* Use 12 MHz clock for some of the Ctimers */
- CLOCK_AttachClk(kFRO12M_to_ASYNC_APB);
- CTIMER_GetDefaultConfig(&config);
- config.prescale = CTIMER_PRESCALE;
- CTIMER_Init(CTIMER, &config);
- CTIMER_StartTimer(CTIMER);
- }
复制代码
5-添加emwin代码
使用 GUIBuilder.exe 创建emwin布局文件,添加头文件,引出 CreateFramewin(); 函数
直接加入工程即可编译下载,相关调用再第三步中的 CreateFramewin(); 已经做好了
如果还需要二次开发,可以再向生成的emwin文件里面添加代码。
实验代码:
LPC54628J512_Project.zip
(2.04 MB, 下载次数: 40)
|
|