查看: 14766|回复: 15

[原创] 【K64F开发笔记】让飞卡也用上最新的emwin

[复制链接]

该用户从未签到

7

主题

107

帖子

0

中级会员

Rank: 3Rank: 3

积分
444
最后登录
2019-3-7
发表于 2015-11-19 11:28:22 | 显示全部楼层 |阅读模式
本帖最后由 晓枫VS枯叶 于 2015-11-19 11:31 编辑

      刚画了块K64的板子,然而上电调试后发现各种各样硬件问题亟待解决,不过幸好LCD部分能正常工作。之前对飞卡的硬件不熟悉,板子设计时SPI FLASH和外扩的SRAM都出现问题,跑emwin只能使用内置的192K的SRAM,不过有这么大的RAM跑emwin的demo并不卡,只是512K的FLASH并不能跑完所有的demo。      首先移植emwin要写好你所用的LCD的驱动,我的LCD驱动芯片是NT35510,然后这个芯片对应的初始化过程就去看一些例程或者数据手册了。然后我的LCD和K64的连接采用了K64的16bit的Flexbus(类似ST的FMSC),具体硬件连线如下图(还好这个接口没又画错)
QQ截图20151119094355.jpg
只用到了30针的接口,后面D16-D23这8位可以不用,所以是RGB565模式,初始化Flexbus函数如下:
  1. void init_fb_pins(uint32_t instance)
  2. {
  3. /* Affects PORTA_PCR26 register */
  4. PORT_HAL_SetMuxMode(PORTA,26UL,kPortMuxAlt6);
  5. /* Affects PORTD_PCR6 register */
  6. PORT_HAL_SetMuxMode(PORTD,6UL,kPortMuxAlt5);
  7. /* Affects PORTD_PCR5 register */
  8. PORT_HAL_SetMuxMode(PORTD,5UL,kPortMuxAlt5);
  9. /* Affects PORTD_PCR4 register */
  10. PORT_HAL_SetMuxMode(PORTD,4UL,kPortMuxAlt5);
  11. /* Affects PORTD_PCR3 register */
  12. PORT_HAL_SetMuxMode(PORTD,3UL,kPortMuxAlt5);
  13. /* Affects PORTD_PCR2 register */
  14. PORT_HAL_SetMuxMode(PORTD,2UL,kPortMuxAlt5);
  15. /* Affects PORTC_PCR10 register */
  16. PORT_HAL_SetMuxMode(PORTC,10UL,kPortMuxAlt5);
  17. /* Affects PORTC_PCR9 register */
  18. PORT_HAL_SetMuxMode(PORTC,9UL,kPortMuxAlt5);
  19. /* Affects PORTC_PCR8 register */
  20. PORT_HAL_SetMuxMode(PORTC,8UL,kPortMuxAlt5);
  21. /* Affects PORTC_PCR7 register */
  22. PORT_HAL_SetMuxMode(PORTC,7UL,kPortMuxAlt5);
  23. /* Affects PORTC_PCR6 register */
  24. PORT_HAL_SetMuxMode(PORTC,6UL,kPortMuxAlt5);
  25. /* Affects PORTC_PCR5 register */
  26. PORT_HAL_SetMuxMode(PORTC,5UL,kPortMuxAlt5);
  27. /* Affects PORTC_PCR4 register */
  28. PORT_HAL_SetMuxMode(PORTC,4UL,kPortMuxAlt5);
  29. /* Affects PORTC_PCR2 register */
  30. PORT_HAL_SetMuxMode(PORTC,2UL,kPortMuxAlt5);
  31. /* Affects PORTC_PCR1 register */
  32. PORT_HAL_SetMuxMode(PORTC,1UL,kPortMuxAlt5);
  33. /* Affects PORTC_PCR0 register */
  34. PORT_HAL_SetMuxMode(PORTC,0UL,kPortMuxAlt5);
  35. /* Affects PORTB_PCR18 register */
  36. PORT_HAL_SetMuxMode(PORTB,18UL,kPortMuxAlt5);
  37. /* Affects PORTD_PCR1 register */
  38. PORT_HAL_SetMuxMode(PORTD,1UL,kPortMuxAlt5);
  39. /* Affects PORTB_PCR19 register */
  40. PORT_HAL_SetMuxMode(PORTB,19UL,kPortMuxAlt5);
  41. /* Affects PORTC_PCR11 register */
  42. PORT_HAL_SetMuxMode(PORTC,11UL,kPortMuxAlt5);

  43. //PORT_HAL_SetMuxMode(PORTC,12UL,kPortMuxAsGpio);
  44. //PORT_HAL_SetMuxMode(PORTC,13UL,kPortMuxAsGpio);
  45. PORT_HAL_SetMuxMode(PORTC,27UL,kPortMuxAsGpio);
  46. PORT_HAL_SetMuxMode(PORTD,0UL,kPortMuxAsGpio);
  47. gpio_output_pin_user_config_t outputPin[] = {
  48. {
  49. .pinName = GPIO_MAKE_PIN(GPIOE_IDX, 27U),
  50. .config.outputLogic = 1,
  51. .config.slewRate = kPortFastSlewRate,
  52. .config.driveStrength = kPortHighDriveStrength,
  53. .config.isOpenDrainEnabled=0,
  54. },


  55. };
  56. GPIO_DRV_OutputPinInit( outputPin);
  57. }
复制代码
以上是IO的初始化,我直接拿KDS里的PE生成的,还是比较好用的,接下来是LCD时序的初始化,Flexbus驱动LCD时,可以将LCD看做一个静态的RAM使用,具体配置如下:
  1.   flexbus_user_config_t flexBus1_InitConfig0 = {
  2. .chip = 0U,
  3. .waitStates = 1U,
  4. .baseAddress = LCD_BASE,
  5. .baseAddressMask =0x800U,
  6. .writeProtect = false,
  7. .burstWrite = false,
  8. .burstRead = false,
  9. .byteEnableMode = false,
  10. .autoAcknowledge = true,
  11. .extendTransferAddress = false,
  12. .secondaryWaitStates = false,
  13. .portSize = kFlexbus2bytes,
  14. .byteLaneShift = kFlexbusShifted,
  15. .writeAddressHold = kFlexbusHold1cycle,
  16. .readAddressHold = kFlexbusHold1or0cycle,
  17. .addressSetup = kFlexbusFirstRisingEdge,
  18. };
  19. init_fb_pins(FB_IDX);
  20. FLEXBUS_DRV_Init(FSL_FLEXBUS1,&flexBus1_InitConfig0);
  21. PEout(27)=1;
复制代码
PTE27这个IO被我拉到了LCD的背光上去,这里使用了位带操作比较简单。其中注意Flexbus的地址不要超出范围,具体看参考手册,我这里设置的是#define LCD_BASE                      (0x70000000),然后是地址mask的配置,然后是读写时序配置,位宽就是2字节,还有就是数据格式,最后时序我都设置的最快(毕竟NT35510还是比较给力的)。
     底层传输接口配置完了就要开始配置LCD的读写,主要还是两个地址,命令和数据的区分
  1. #define LCD_CMD_BASE (0x70000000)
  2. #define LCD_DATA_BASE (0x78000000)
复制代码
然后命令写入和数据读写就主要操作这两个地址了,具体操作见附件源码。       之前玩STM32F4时发现正点原子的参考程序里面有支持NT35510的驱动,果断放弃自己去一步步写,直接照搬过来,由于原子的LCD驱动为了兼容多个屏幕写的非常多,然而我只用一个屏,所以直接将里面多余的东西完全精简掉了,只支持NT35510的屏,驱动供大家参考学习。
还有一点就是原子NT35510的屏幕是800*480的分辨率,我这个屏幕是854*480,需要修改初始化时的分辨率设置寄存器的值,B500h写入5Bh对应854*480的分辨率。
       LCD驱动搞好了就可以玩裸屏,可以测试下能不能用,首先驱动里会先读取LCD的ID,然后串口输出LCD的ID,再去初始化LCD。好了LCD驱动搞好了之后就是开始移植emwin了,这里我使用的是IAR编译器,网上找了好长时间的emwin库才找到一个IAR的(并没有用STM32里stemwin支持IAR的库),移植的时候我先搞了一个动态内存管理,方面emwin里使用,下面是支持keil和IAR的几个四字节对齐内存管理的定义
  1. //内存池(4字节对齐)
  2. #if defined ( __CC_ARM )


  3. __align(4) u8 mem1base[MEM1_MAX_SIZE];        //内部SRAM内存池
  4. //__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XD0000000)));        //外部SRAM内存池
  5. //__align(4) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0X10000000)));        //内部CCM内存池
  6. //内存管理表
  7. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];        //内部SRAM内存池MAP
  8. //u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XD0000000+MEM2_MAX_SIZE)));        //外部SRAM内存池MAP
  9. //u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000+MEM3_MAX_SIZE)));        //内部CCM内存池MAP
  10. #endif
  11. #if defined ( __ICCARM__ )
  12. #pragma pack(push)
  13. #pragma pack(4) //按字节对齐
  14. __no_init u8 mem1base[MEM1_MAX_SIZE];        //内部SRAM内存池
  15. // __no_init u8 mem2base[MEM2_MAX_SIZE] @(0XD0100000);        //外部SRAM内存池
  16. //__no_init u8 mem3base[MEM3_MAX_SIZE] @(0X10000000);        //内部CCM内存池
  17. #pragma pack(pop)
  18. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];        //内部SRAM内存池MAP
  19. //u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] @(0XD0100000+MEM2_MAX_SIZE);        //外部SRAM内存池MAP
  20. //u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] @(0X10000000+MEM3_MAX_SIZE);        //内部CCM内存池MAP
  21. #endif        //内存总大小
  22. const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE};        //内存表大小
  23. const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE};        //内存分块大小
  24. const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE};        //内存总大小
复制代码
    具体还是参考正点原子的内存管理源码,只是移植到了IAR编译器里使用,由于外部SRAM的硬件问题,只能屏蔽掉外部SRAM的内存管理,只使用内部SRAM内存管理。emwin底层也是照搬的正点原子的源码,移植过程见正点原子STemwin教程,具体修改下面的代码(主要是快速画位图):
  1. static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {

  2. LCD_PIXELINDEX pixel;
  3. LCD_Set_Cursor(x,y);
  4. *(__IO uint16_t *)(LCD_CMD_BASE) = lcddev.wramcmd; //写入颜色值
  5. for (;xsize > 0; xsize--, x++, p++)
  6. {
  7. pixel = *p;
  8. *(__IO uint16_t *)(LCD_DATA_BASE) =pixel;
  9. }
  10. }
复制代码
最后就是emwin时基的配置,由于没有操作系统,不能上系统的时钟,所以我使用一个通道的PIT产生1ms中断作为emwin时基
  1. void PIT_Init(uint32_t us)
  2. {
  3. pit_user_config_t chn0Confg;
  4. chn0Confg.isInterruptEnabled= true;
  5. chn0Confg.periodUs=us;

  6. // Init pit module and enable run in debug
  7. PIT_DRV_Init(BOARD_PIT_INSTANCE, false);

  8. // Initialize PIT timer instance for channel 0 and 1
  9. PIT_DRV_InitChannel(BOARD_PIT_INSTANCE, 0, &chn0Confg);
  10. //PIT_DRV_InitChannel(BOARD_PIT_INSTANCE, 1, &chn1Confg);

  11. // Start channel 0

  12. PIT_DRV_StartTimer(BOARD_PIT_INSTANCE, 0);
  13. us_time=0;
  14. // Start channel 1

  15. // PIT_DRV_StartTimer(BOARD_PIT_INSTANCE, 1);
  16. }
  17. void PIT0_IRQHandler(void)
  18. {
  19. if(PIT_HAL_IsIntPending(g_pitBase[0], 0))
  20. {
  21. us_time++;
  22. OS_TimeMS++;
  23. PIT_HAL_ClearIntFlag(g_pitBase[0], 0U);
  24. }
  25. }
复制代码
以供emwin使用,到此在主函数里启动初始化emwin之后运行demo就能看到emwin的效果了
  1. int main(void)
  2. {

  3. // Configure board specific pin muxing
  4. OSA_Init();
  5. hardware_init();
  6. delay_init(120);
  7. PIT_Init(1000);
  8. FLEXBUS_LCD_Init();
  9. mem_init(SRAMIN);
  10. CLOCK_SYS_EnableCrcClock(0);
  11. WM_SetCreateFlags(WM_CF_MEMDEV);
  12. GUI_Init();
  13. GUIDEMO_Main();
  14. for (;;) // Forever loop
  15. {
  16. __asm("NOP");
  17. }


  18. }
复制代码
最后上几张飞卡K64跑emwin的图,由于直接拷贝的是STemwin里的demo,所以很多ST的logo,见谅了:
1.jpg 3.jpg
2.jpg
4.jpg
5.jpg
6.jpg
10.jpg
7.jpg
8.jpg
9.jpg
      裸机刷屏有1100W,只能说还不错吧,比较不是LCD专用的MCU,由于室内灯光不好,正好头顶两个大灯导致屏幕严重反光,实际效果还是 很给力的,只是在海豚那个界面有一点明显的残影,其他的效果挺好的,毕竟这么高的分辨率嘛,最后emwin例程如下,里面keil的工程没有搞,只是用飞卡的那个生成器生成了放在那里,并且keil的库也没加进去(主要由于keil编译资源占用太多,而且速度慢所以没有使用),IAR的emwin库里面有两个,不知道那两个库的区别在哪里。
emwin.zip (9.47 MB, 下载次数: 179)

评分

参与人数 1NXP金币 +30 收起 理由
小七 + 30 很给力!

查看全部评分

回复

使用道具 举报

  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
    发表于 2015-11-19 12:06:30 | 显示全部楼层
    不错不错!学习学习!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-11-19 12:23:36 | 显示全部楼层
    楼主你好,emwin是一个操作系统还是就单单是GUI,哪里有它的资料,谢谢
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16809
    最后登录
    1970-1-1
    发表于 2015-11-19 12:54:10 | 显示全部楼层
    不错,多谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-3-12 12:14
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    7

    主题

    556

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1601
    最后登录
    2017-3-12
    发表于 2015-11-19 14:18:30 | 显示全部楼层

    不错 哦~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13219
    最后登录
    2019-1-27
    发表于 2015-11-19 14:23:16 | 显示全部楼层
    不错不错,楼主出的是干货
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    111

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    366
    最后登录
    2017-2-9
    发表于 2015-11-19 22:38:27 | 显示全部楼层
    好nb的样子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-11-20 09:17:52 | 显示全部楼层
    这个厉害
    104930kli5jsmlssemljli.png
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-11-21 09:07:44 | 显示全部楼层
    楼主好厉害
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    569

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2119
    最后登录
    2018-2-1
    发表于 2015-11-21 11:37:38 | 显示全部楼层
    霸气,霸气~啥时候可以向楼主一样就NICE了 FreeLogo.png
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-23 05:04 , Processed in 0.108575 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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