
在对stm32f407进行emwin5.16+ucosii 移植过程中,遇到的问题进行总结,希望对大家有所帮助) L7 S3 m. l# m; y% E8 G# n/ T 移植过程参考了baiyangbing2009 的文章,在此基础上加入了ucosii系统。- u8 e% E- B' J+ {% i1 p8 S. X- j 1,虽然emwin5.16的数据手册上明确写错,emwin没有用到浮点数,但是 mdk给出的库确实浮点数库 ![]() 所以stm32f407必须开启浮点数 ![]() 不然gui_init()初始化会进入硬件错误中断。8 U9 p. v4 ^& @" W9 i: |) | 2,添加浮点数的库 ![]() ,同时对修改部分文件,提高运行速度。 - }/ c. x! Q; Q: Q( E STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置: 1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码: /* FPU settings ------------------------------------------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL 0) { // #if __FPU_USED% F) p+ y }0 S4 R' Q6 D/ d #if (__FPU_USED == 1) && defined ( __CC_ARM ) *pOut = __sqrtf(in);' F1 F" d i- \# M8 ] #else *pOut = sqrtf(in);2 y. `! {2 e) \, C0 q #endif) V% t/ W% E4 X8 t, w9 {+ U1 D+ O return (ARM_MATH_SUCCESS); } else6 H# _' A6 J( C: g; ]$ D { *pOut = 0.0f;( F( V0 t. B" M" z return (ARM_MATH_ARGUMENT_ERROR); } } 即开方用的函数是arm_sqrt_f32(),其中首先判断被开发的书是否大于0,只有大于0的才能进行运算,否则输出结果为0并返回“错误”标志。如果大于0,并且实用了FPU和__CC_ARM控制项,那调用__sqrtf()来完成编译,否则调用sqrtf()——这个sqrtf()是能在keil的math.h中找到的,即调用子函数来完成运算,而__sqrtf()呢?新出现的,相信大家都能猜到是什么玩意儿:对,就是VSQRT指令!因此要把这点性能也要发挥出来,就需要工程选项之C/C++选项卡的define中继续加入语句__CC_ARM才行。大家可以比较一下是否加入__CC_ARM编译后会汇编代码的差别巨大差别。0 E$ f- q& U6 E 当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。(参考网上资料)。 ![]() 3,修改stm32f407的堆栈大小。 如果堆栈过小也会造成 图形gui初始化失败。 在启动文件startup_stm32f10x_md.s中修改" U( R# d u' h. ?6 ~ “Stack_Size EQU 0x00000200”,9 G- n- u1 y0 Z0 u. s Q+ d7 E 将堆栈改大点,改为/ Q% f& C5 z! Y( X “Stack_Size EQU 0x00004000”。 4,系统滴答时钟不准,在移植后发现系统时钟比正常时钟慢滴答为100ms 但是实际上比100ms慢好多,最后发现问题出在晶振频率的设定上。在官方固件中,提供的外部晶振为25mhz,但是实际上 stm32f4discovery 却是8mhz的系统时钟,所以需要进行修改,可以更换外部晶振也可以修改程序,将stm32f4xx.h中的 #if !defined (HSE_VALUE) 9 O% l* I! ^" ~* }2 c #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ 修改为 #if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */, i N$ G* ?: i8 h #endif /* HSE_VALUE */$ t. b- |3 n; f 同时修改mdk的晶振为8.0 ![]() HSE_VALUE =8000000。 这样重新编译一下,系统时钟就准了。! A7 x( ^2 K: p- G6 S 5,最后遇到的问题就是 在移植触摸屏中遇到无法校准问题。 emwin 和ucgui 在对触摸屏的ad值选取略有不同, 在实际移植过程中发现, ucgui在 宏定义中直接定义好* J* V( G# [; q3 _$ `" u' E1 f4 ` #define GUI_TOUCH_AD_LEFT 5 l& K; n$ c3 ~, W4 q #define GUI_TOUCH_AD_RIGHT #define GUI_TOUCH_AD_TOP + ~/ F. G9 S3 h7 ^8 S( G #define GUI_TOUCH_AD_BOTTOM ( I6 ^% X( H; h- r 只要这几个值选着的准确,就可以了。但是在emwin中 即是在宏定义中定义准确了,发现触摸屏也不准, 在emwin中必须通过触摸校准函数,触摸屏才可以准确识别。0 a. V& u6 \9 z3 n- h4 J9 Z1 Q GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 480, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);4 f1 q, N7 g/ T8 j. @ GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 272, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);/ S* x( D& h1 E; Z $ \$ O# ` X0 B. |1 Q9 k : j4 C) u/ Y# s# r7 H5 V6 ] 我用的是ra8875驱动4.3寸屏幕,屏幕刷新率能达到15m以上。(产考图片来自baiyangbing2009) ![]() , k/ y, Y+ f) h$ o 3 a3 A7 o& t8 ^! L 补充工程文件链接在附件里, 不知道怎么压缩文件太大,只能存到网盘里了 |
RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题
回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题