历史上的今天
今天是:2024年09月24日(星期二)
2020年09月24日 | STM32F407上移植emwin
2020-09-24 来源:eefocus
环境:
主机:WIN8
开发环境:MDK5.13
emwin版本:STemWinLibrary522
mcu: stm32f407VGT6
开发板:安富莱STM32-X3
TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325
说明:
在STM32F407上移植emwin,驱动屏幕接口为FSMC
移植步骤:
1.MDK新建文件结构:
2.GUIConf.c文件修改
a)增加宏定义:
#define GUI_NUMBYTES (1024 * 80)
#define GUI_BLOCKSIZE 0x80
b)GUI_X_Config(void)函数中增加语句:
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
修改后:
/*********************************************************************
*
* GUI_X_Config
*
* Purpose:
* Called during the initialization process in order to set up the
* available memory for the GUI.
*/
void GUI_X_Config(void) {
//
// 32 bit aligned memory area
//
static U32 aMemory[GUI_NUMBYTES / 4];
//
// Assign memory to emWin
//
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
//
// Set default font
//
GUI_SetDefaultFont(GUI_FONT_6X8);
}
3.LCDConf_FlexColor_Template.c文件修改
a)增加宏定义:
#define LCD_REG_ADDRESS BANK1_LCD_REG
#define LCD_DATA_ADDRESS BANK1_LCD_RAM
这两个BANK宏定义在tft驱动文件中定义:
#define BANK1_BASE ((uint32_t)(0x60000000 | 0x00000000))
#define BANK1_LCD_RAM *(__IO uint16_t *)(BANK1_BASE + (1 << (18 + 1))) /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */
#define BANK1_LCD_REG *(__IO uint16_t *)(BANK1_BASE)
具体值和接线相关
b)具体函数修改
/*********************************************************************
*
* Local functions
*
**********************************************************************
*/
/********************************************************************
*
* LcdWriteReg
*
* Function description:
* Sets display register
*/
static void LcdWriteReg(U16 Data) {
// ... TBD by user
LCD_REG_ADDRESS = Data;
}
/********************************************************************
*
* LcdWriteData
*
* Function description:
* Writes a value to a display register
*/
static void LcdWriteData(U16 Data) {
// ... TBD by user
LCD_DATA_ADDRESS=Data;
}
/********************************************************************
*
* LcdWriteDataMultiple
*
* Function description:
* Writes multiple values to a display register.
*/
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
LCD_DATA_ADDRESS=*pData++;
}
}
/********************************************************************
*
* LcdReadDataMultiple
*
* Function description:
* Reads multiple values from a display register.
*/
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
*pData++=LCD_DATA_ADDRESS;
}
}
/*********************************************************************
*
* Public functions
*
**********************************************************************
*/
/*********************************************************************
*
* LCD_X_Config
*
* Function description:
* Called during the initialization process in order to set up the
* display driver configuration.
*
*/
void LCD_X_Config(void) {
GUI_DEVICE * pDevice;
CONFIG_FLEXCOLOR Config = {0};
GUI_PORT_API PortAPI = {0};
//
// Set display driver and color conversion
//
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
//
// Display driver configuration, required for Lin-driver
//
LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
//
// Orientation
//
//Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
Config.FirstCOM = 0;
Config.FirstSEG = 0;
//Config.Orientation = GUI_MIRROR_X | GUI_MIRROR_Y;
Config.NumDummyReads = 2;
GUIDRV_FlexColor_Config(pDevice, &Config);
//
// Set controller and operation mode
//
PortAPI.pfWrite16_A0 = LcdWriteReg;
PortAPI.pfWrite16_A1 = LcdWriteData;
PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
PortAPI.pfReadM16_A1 = LcdReadDataMultiple;
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
//GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
}
其中:GUIDRV_FlexColor_SetFunc函数说明:
因为主控芯片为ILI9325,所以参数选择GUIDRV_FLEXCOLOR_F66708
4.GUI_X.c文件修改
此文件控制的是GUI中的延时,可以用定时器配合实现,修改如下:
/*********************************************************************
*
* Global data
*/
volatile GUI_TIMER_TIME OS_TimeMS;
/*********************************************************************
*
* Timing:
* GUI_X_GetTime()
* GUI_X_Delay(int)
Some timing dependent routines require a GetTime
and delay function. Default time unit (tick), normally is
1 ms.
*/
extern __IO int32_t g_iRunTime;
GUI_TIMER_TIME GUI_X_GetTime(void) {
//return OS_TimeMS;
return g_iRunTime;
}
void GUI_X_Delay(int ms) {
// int tEnd = OS_TimeMS + ms;
// while ((tEnd - OS_TimeMS) > 0);
int tEnd = g_iRunTime + ms;
while ((tEnd - g_iRunTime) > 0);
}
5.主函数实现:
int main(void)
{
/*
ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
*/
bsp_Init(); /* 硬件初始化 */
PrintfLogo(); /* 打印例程信息到串口1 */
vLCDInit();
// vClearScreen(Green);
// vSetTextColor(Red);
// vPutString(20,0, "NanJing RF Tracking!!!!!");
// ShowImage();
//DemoFatFS(); /* SD卡文件系统演示程序 */
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
GUI_Init();
GUI_DispString("I am jdh!");
while (1)
{
GUI_Delay(1000);
}
}
注意:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
函数是必须的,否则GUI将不工作,这是ST公司防止其他芯片用此GUI的措施。
效果:

参考资料:
1.STemWin5.22移植笔记
2.《野火emwin实战指南V1.0.0》
3.安富莱源程序:x3开发板_裸机STemWin5.20
史海拾趣
|
印刷电路板设计的基本原则要求 1.印刷电路板的设计 从确定板的尺寸大小开始,印刷电路板的尺寸因受机箱外壳大小限制,以能恰好安放入外壳内为宜,其次,应考虑印刷电路板与外接元器件(主要是电位器、插口或另外印刷电路板)的连接方式。印 ...… 查看全部问答> |
|
听ATMEL的工程师说,台湾有厂家生产一些兼容的片子,想知道都是那些厂家 公司用的tn80c196kc20 PLCC68 已经停产多年,一直在寻找替代品 前几个月求助的帖子https://bbs.eeworld.com.cn/thread-102300-1-1.html 听ATMEL的工程师说,台湾有厂家生产一些兼容的片子,想知道都是台湾都是有哪些厂家. ...… 查看全部问答> |
|
EVC 使用了CDateTimeCtrl后编译正常,下载到目标机上无法运行 我在 EVC 使用了CDateTimeCtrl后编译正常,下载到目标机上无法运行,去掉该控件,便可以运行,请高手指点指点 … 查看全部问答> |
|
转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 <xianjimli@gmail.com>用XML来描述界面,C/C++写内部逻辑,用脚本语言来胶合界面和内部逻辑。FTK 正是基于这种思想来设计的,所以它自然会提供X ...… 查看全部问答> |
|
我用Keil开发9B90,用利尔达提供的ICDI仿真器,发现一个很奇怪的现象。开始头一个月没问题,后来就突然不能下载了。问利尔达,说不出个所以然,后来又去问TI的技服,说是Keil的时序与ICDI可能不大配合(但为什么开始是好的呢? ...… 查看全部问答> |
|
Stm32 + AD9851 做的DDS , 功能: 1 带宽: 1Hz ~25MHz的正炫波 2 将输出信号调整为两路可,输出此起彼伏的信号,通过两个电位器调节输出幅度。 3 将输出信号利用AD9851内置的比较器产生同频率的方波信号,然后作为stm32的IO中断,做频率反馈。 ...… 查看全部问答> |
|
解压TI提供的nfs_DM816x_UD_DVR.tar.lzma,然后再进行压缩,压缩成.tar.lzma格式,再对它进行解压,这时候有问题了,错误提示tar:rfs_816x/var/cache/ldconfig :cannot mkdir,not file or direction.这种问题你们有遇到过吗?怎么解决?   ...… 查看全部问答> |




