你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

[复制链接]
wxjsy 发布时间:2014-4-11 10:08
    在对stm32f407进行emwin5.16+ucosii 移植过程中,遇到的问题进行总结,希望对大家有所帮助
' j' X$ Q# a# G& P: H   移植过程参考了baiyangbing2009 的文章,在此基础上加入了ucosii系统。
, e' [6 C; p- W4 O* J& ~1,虽然emwin5.16的数据手册上明确写错,emwin没有用到浮点数,但是 mdk给出的库确实浮点数库 0.jpg ( s8 k" u0 M3 F0 C3 k7 G
所以stm32f407必须开启浮点数 1.jpg ,# n) E! ~$ H! c0 O9 W
不然gui_init()初始化会进入硬件错误中断。5 S3 M; b9 z2 U' d6 M
2,添加浮点数的库 2P.jpg 0 o4 _. i! O  D3 I0 P( @8 E5 q8 I
,同时对修改部分文件,提高运行速度。 , f, y. y! o# V  @. ~, M
    STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:0 t, R9 w7 U! w( F" M4 k$ k; j( g
        1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:
% D3 c2 x5 l2 `4 }/* FPU settings ------------------------------------------------------------*/# v  ^; c1 K  ?( v  x- @# T
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
: ~8 i5 T  n% A    SCB->CPACR |= ((3UL  0)* @2 B  O" Y4 T6 t
                             {# p8 @8 B: w7 M7 s  G9 J) p" V0 F; g
                                     //    #if __FPU_USED
. |7 y1 S2 I5 h1 N* _; {                                    #if (__FPU_USED == 1) && defined ( __CC_ARM   )
3 h3 ^; G9 Z( \2 X                                              *pOut = __sqrtf(in);
/ y9 _+ `& e3 C) j; Y                                   #else      & Q0 U0 n5 O' R9 t
                                              *pOut = sqrtf(in);
  ~5 H0 F! a5 W1 K  V$ y, `                                   #endif6 W  w  e2 g/ A* a% s  z
                                 return (ARM_MATH_SUCCESS);7 ^) n3 J7 G, p0 L; r8 d% P% o. k& F
                            }, H$ J3 q, w( T& U+ }) l
                        else
) e( J; t$ k* Q0 A# `                           {5 J* t# d6 P2 D0 d
                               *pOut = 0.0f;
% S; r0 k- k+ y' g9 k                                return (ARM_MATH_ARGUMENT_ERROR);
' `5 M+ y! W6 M# `5 I                          }" D& v6 @+ D; E' [; `
               }   # f, ]( n0 s: f- [
        即开方用的函数是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编译后会汇编代码的差别巨大差别。* ?" e' s% i) [  f$ `: X- r, L* R
       当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。(参考网上资料)。% e! k7 |7 E1 P+ I7 c/ _: t! d
3.jpg
( J; H* a, C/ @( v0 G3,修改stm32f407的堆栈大小。 如果堆栈过小也会造成 图形gui初始化失败。, i! ^* M# S" N
在启动文件startup_stm32f10x_md.s中修改6 A6 U+ X5 O; n* u
“Stack_Size      EQU     0x00000200”,
+ G6 o' S( T$ |: ^$ K* q将堆栈改大点,改为
+ _6 p: j4 ^7 ~9 }0 {6 _0 G0 O' V( z“Stack_Size EQU  0x00004000”。
" y6 x2 S1 P4 Y1 L8 O4,系统滴答时钟不准,在移植后发现系统时钟比正常时钟慢滴答为100ms 但是实际上比100ms慢好多,最后发现问题出在晶振频率的设定上。在官方固件中,提供的外部晶振为25mhz,但是实际上 stm32f4discovery 却是8mhz的系统时钟,所以需要进行修改,可以更换外部晶振也可以修改程序,将stm32f4xx.h中的
8 \/ ^# J- z! a; b#if !defined  (HSE_VALUE) + `' a7 n" P! u- S
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
6 v2 d) D% E4 T* b#endif /* HSE_VALUE */
9 l, [- B) [9 `修改为
" D, g; ^5 j" B* s. I" k#if !defined  (HSE_VALUE) 4 o$ B' v% D0 \4 T; J2 O5 d
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */- z' [. ?, [1 R* C
#endif /* HSE_VALUE */# X1 d# Z- v9 R
同时修改mdk的晶振为8.0 4.jpg 。如果不想修改官方固件 也可以再c/c++ 选项卡define里添加
. ~& d9 z; L& [/ c2 `9 _6 sHSE_VALUE =8000000。
4 k8 G8 n0 H8 M# f* N2 }  这样重新编译一下,系统时钟就准了。
7 A( r8 v- P8 D; @, N5,最后遇到的问题就是 在移植触摸屏中遇到无法校准问题。
8 R8 L$ ^) f* S; I7 B$ _emwin 和ucgui 在对触摸屏的ad值选取略有不同, 在实际移植过程中发现, ucgui在 宏定义中直接定义好
8 l+ R4 [2 }4 r/ h) E% e) L#define GUI_TOUCH_AD_LEFT     
& R/ X2 C: E8 A) b5 r#define GUI_TOUCH_AD_RIGHT   
! A8 [+ W/ E! d% r#define GUI_TOUCH_AD_TOP         
0 i! K3 v9 \( j9 t2 {#define GUI_TOUCH_AD_BOTTOM      
' U7 Z, H* m( h8 B- E. x' H6 H 只要这几个值选着的准确,就可以了。但是在emwin中 即是在宏定义中定义准确了,发现触摸屏也不准, 在emwin中必须通过触摸校准函数,触摸屏才可以准确识别。
7 Z$ S& S# S; W0 g4 B# K+ xGUI_TOUCH_Calibrate(GUI_COORD_X, 0, 480, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);
5 u  Q$ X* z; h4 z. T7 ZGUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 272, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);
+ G$ B1 {7 A8 s* e8 e; B% \# }
9 G+ b, g/ \& n+ N  I* G" [, V# i$ \% I0 V8 E
我用的是ra8875驱动4.3寸屏幕,屏幕刷新率能达到15m以上。(产考图片来自baiyangbing2009)4 r1 D: n) D: H- p
 
& V$ |  t* C& H- V7 m0 |& j9 H  v 5.jpg 2 j$ _: Y& r  R+ P9 a( G3 ~
0 V7 }2 {7 |9 G
 . b6 z9 L! k' |* I
 9 P4 K4 y' j. C- A2 W5 C
补充工程文件链接在附件里, 不知道怎么压缩文件太大,只能存到网盘里了
6.jpg
7.jpg
8.jpg

工程文件链接.txt

下载

31 Bytes, 下载次数: 148

赞 收藏 1 评论12 发布时间:2014-4-11 10:08

举报

12个回答
jinniuxing 回答时间:2020-9-26 11:16:15
链接不存在了
A.K. 回答时间:2014-4-15 15:13:36

RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

谢谢分享
andrew_lya 回答时间:2014-4-15 17:07:15

RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

谢谢分享,学习下!
wakojosin 回答时间:2014-4-15 22:50:32

RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

谢谢分享,看看,学习学习
csc57 回答时间:2014-4-16 08:18:24

回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

good good 
Andrew31 回答时间:2014-4-16 09:21:29

回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

讚
zhengjiwu1 回答时间:2014-4-16 10:27:06

RE:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

我也遇到问题了,非常感谢
zhangxk99 回答时间:2014-4-16 11:56:01

回复:解决stm32f407移植emwin5.16+ucosii 移植不成功 问题

 正在学习f407,参考下。谢谢分享!
linyue732 回答时间:2014-12-8 16:56:27
来学习一下,拜见高手
水之韵 回答时间:2014-12-9 13:29:32
怎么不行呢,楼主,移植不成功,stm32f4+ra8875,7寸屏,根本就进不去main函数,不知道哪儿出错了,我在main函数里放了一个蜂鸣器开关,程序也许就没跳进去main函数,,,求解答,,
水之韵 回答时间:2014-12-10 12:53:49
太感谢楼主了,十分感谢楼主的分享,系统初步跑起来了,,
jinniuxing 回答时间:2020-9-26 11:14:35
遇到问题了,非常感谢

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版