TouchGFX的stm32移植教程
[复制链接]
本帖最后由 feiting94 于 2015-12-4 18:32 编辑
还在玩emwin的小伙伴们,你们可以看看touchGFX啦,可以看看这个效果
什么是touchGFX?
它是一款UI设计软件,专为低功耗、低主频的cortex-m系列单片机打造
目前支持的芯片有
QQ截图20151203162130.png (48.62 KB, 下载次数: 0)
2015-12-3 16:21 上传
之前我在stm32论坛发了入门的知识,感觉太冷清了,还是来eeworld发帖子了
touchGFX移植主要分四个部分,基本思想是按照这张图来的
QQ截图20151203185437.png (85.85 KB, 下载次数: 5)
2015-12-3 18:54 上传
移植的思想就是初始化正确,对上层应用来说底层是透明且有效的,我们的移植就成功了
(1)内部lcd控制器,外部sram,外部flash正确初始化
就是裸机的时候这些模块都是正常工作的,其中外部flash不是必须的,但因为sdram的部分要作为显存,因此sdram必须要有,这个因为不同的开发板都不同,我就不说了
(2)通过继承 touchGFX::HAL 得到适合自己MCU系列的子类,
目的是对上层屏蔽底层MCU硬件的差别
主要实现5个函数
FUNCTIONPURPOSE
configureInterrupts()配置DMA中断和LCD的VSYNC中断,两个中断的优先级必须相同,因为两个中断服务程序都经过touchGFX内部状态信息,不能出现抢占竞争状态
注:如果使用freeRTOS,必须保证中断优先级功能上低于(也就是数目上大于) configMAX_SYSCALL_INTERRUPT_PRIORITY这个宏,这样就
enableLCDControllerInterrupt()使能LCD控制器的VSYNC中断
disableInterrupts()失能LCD控制器中断和 DMA中断
enableInterrupts()使能LCD控制器中断和 DMA中断,这个函数和上面的函数配合使用保护临界区域,
getTFTFrameBuffer()得到TFT控制器的显存的首地址,
setTFTFrameBuffer()设置TFT控制器的显存首地址
以stm32f746为例可以看到 例程是如何初始化的
代码来自 STM32F7HAL.cpp 文件
uint16_t* STM32F7HAL::getTFTFrameBuffer() const
{
return (uint16_t*)LTDC_Layer1->CFBAR;
}
void STM32F7HAL::setTFTFrameBuffer(uint16_t* adr)
{
LTDC_Layer1->CFBAR = (uint32_t)adr;
/* Reload immediate */
LTDC->SRCR = (uint32_t)LTDC_SRCR_IMR;
}
void STM32F7HAL::configureInterrupts()
{
NVIC_SetPriority(DMA2D_IRQn, 9);
NVIC_SetPriority(LTDC_IRQn, 9);
}
static uint16_t lcd_int_active_line;
static uint16_t lcd_int_porch_line;
/* Enable LCD line interrupt, when entering video (active) area */
void STM32F7HAL::enableLCDControllerInterrupt()
{
lcd_int_active_line = (LTDC->BPCR & 0x7FF) – 1;
lcd_int_porch_line = (LTDC->AWCR & 0x7FF) – 1;
LTDC->LIPCR = lcd_int_active_line;
LTDC->IER = 1;
}
void STM32F7HAL::disableInterrupts()
{
NVIC_Di