将AWTK移植到STM32f103ze裸系统

AWTK的可移植性很高,在移植时只需要实现平台初始化、lcd和mainloop三个方面的东西。本文以STM32f103ze为例介绍移植AWTK到新平台的过程。

一、平台初始化

除了基本的libc函数外,AWTK对平台没有特别要求,只需要get_time_ms和sleep_ms两个函数以及一块内存。我们使用systick来实现get_time_ms和sleep_ms两个函数,裸系统上只需加入src/platforms/raw/sys_tick.c并初始化sys_tick即可。

  1. #include "sys.h"
  2. #include "base/mem.h"
  3. #include "base/timer.h"
  4. void systick_init(void) {
  5. u8 fac_us = 0;
  6. u16 fac_ms = 0;
  7. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  8. fac_us = SystemCoreClock / 8000000;
  9. fac_ms = (u16)fac_us * 1000;
  10. SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
  11. SysTick->LOAD = fac_ms;
  12. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  13. }
  14. static uint32_t s_heam_mem[2048];
  15. ret_t platform_prepare(void) {
  16. tk_mem_init(s_heam_mem, sizeof(s_heam_mem));
  17. return RET_OK;
  18. }

参考:awtk-port/platform.c

二、实现lcd

lcd_t接口提供基本的显示功能,AWTK提供基于寄存器和基于framebuffer两种缺省实现,在此基础上实现自己的lcd_t接口非常方便。

stm32f103ze使用基于寄存器的lcd的缺省实现,只需要提供set_window_func和write_data_func两个函数/宏即可。这里直接使用了TFT_SetWindow和TFT_WriteData两个函数。

  1. #include "gui.h"
  2. #include "lcd_driver.h"
  3. #include "base/mem.h"
  4. #include "lcd/lcd_reg.h"
  5. typedef uint16_t pixel_t;
  6. #define set_window_func TFT_SetWindow
  7. #define write_data_func TFT_WriteData
  8. #include "blend/rgb565.inc"
  9. #include "blend/pixel_ops.inc"
  10. #include "lcd/lcd_reg.inc"

参考 awtk-port/lcd_stm32_raw.c

三、实现main_loop

main_loop主要负责事件分发和绘制这个不断循环的过程。main_loop_raw.inc里实现了裸系统main_loop的基本功能,在移植时加上输入事件的的分发即可:

  1. ret_t platform_disaptch_input(main_loop_t* l) { return RET_OK; }
  2. static lcd_t* platform_create_lcd(wh_t w, wh_t h) { return lcd_reg_create(w, h); }
  3. void TIM3_IRQHandler(void) {
  4. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
  5. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  6. if (TOUCH_Scan() == 0) {
  7. main_loop_post_pointer_event(main_loop(), TRUE, TouchData.lcdx, TouchData.lcdy);
  8. } else {
  9. main_loop_post_pointer_event(main_loop(), FALSE, TouchData.lcdx, TouchData.lcdy);
  10. }
  11. }
  12. }
  13. #include "main_loop/main_loop_raw.inc"

参考 awtk-port/main_loop_stm32_raw.c

注:目前以普中科技STM32F103ZET6开发实验板 为载体移植,其它开发板应该差不多。

完整项目和源码请参考:awtk-stm32f103ze-raw