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

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

[复制链接]
wxjsy 发布时间:2014-4-11 10:08
    在对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给出的库确实浮点数库 0.jpg $ f+ ?5 B* H2 T' Z; V& y
所以stm32f407必须开启浮点数 1.jpg
0 `/ F6 M9 r7 o8 i) {不然gui_init()初始化会进入硬件错误中断8 U9 p. v4 ^& @" W9 i: |) |
2,添加浮点数的库 2P.jpg
3 B) Q$ D1 B, h,同时对修改部分文件,提高运行速度。 - }/ c. x! Q; Q: Q( E
    STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:
3 l  [* O4 u9 v3 i        1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:
' H2 @9 K" N) F; ]% J/* FPU settings ------------------------------------------------------------*/
  s# i7 `$ \4 w  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
, F" q8 T2 ?7 G    SCB->CPACR |= ((3UL  0)
( \2 {. d. C5 J. B9 ?- u                             {
% n+ w6 K; ?3 h% ^: t. V) K                                     //    #if __FPU_USED% F) p+ y  }0 S4 R' Q6 D/ d
                                    #if (__FPU_USED == 1) && defined ( __CC_ARM   )
+ ^4 \. j4 J$ e, I# f7 G; y                                              *pOut = __sqrtf(in);' F1 F" d  i- \# M8 ]
                                   #else      
1 G9 d: Z7 F7 [1 Q& _                                              *pOut = sqrtf(in);2 y. `! {2 e) \, C0 q
                                   #endif) V% t/ W% E4 X8 t, w9 {+ U1 D+ O
                                 return (ARM_MATH_SUCCESS);
/ f& ]# V3 L) ~5 q                            }
* ?1 {+ V$ l. |" G6 |/ q6 E                        else6 H# _' A6 J( C: g; ]$ D
                           {
1 n+ X! d" l% S! _1 Y7 _" y9 C5 S                               *pOut = 0.0f;( F( V0 t. B" M" z
                                return (ARM_MATH_ARGUMENT_ERROR);
$ X+ K  y" z; C                          }
: ?( j9 R7 s# Y! x  ]1 ^7 M- R               }   
; V# O9 @' p$ Y1 p/ g4 l        即开方用的函数是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指令。(参考网上资料)。
7 Y! ^9 ?. V1 r 3.jpg 5 l3 ~2 l9 C" I+ {% ~$ k
3,修改stm32f407的堆栈大小。 如果堆栈过小也会造成 图形gui初始化失败。
* B7 c+ b' Z/ b在启动文件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”。
: y2 j! F8 A9 A% R8 N% M4,系统滴答时钟不准,在移植后发现系统时钟比正常时钟慢滴答为100ms 但是实际上比100ms慢好多,最后发现问题出在晶振频率的设定上。在官方固件中,提供的外部晶振为25mhz,但是实际上 stm32f4discovery 却是8mhz的系统时钟,所以需要进行修改,可以更换外部晶振也可以修改程序,将stm32f4xx.h中的
( t0 t+ Z) ^. O9 L; X  W* I4 A7 `. v#if !defined  (HSE_VALUE) 9 O% l* I! ^" ~* }2 c
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
, D( U2 I1 ?5 C, _( _. L#endif /* HSE_VALUE */
) i+ B; Q$ n! ]8 I% F7 ~( w% F  `9 P修改为
  s) y* T3 `% `( y0 F#if !defined  (HSE_VALUE) 
! O/ Z! R, h+ N( S  L  #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 4.jpg 。如果不想修改官方固件 也可以再c/c++ 选项卡define里添加
0 r# N! A, I) ~7 u# rHSE_VALUE =8000000。
+ G8 o) y8 N% u  这样重新编译一下,系统时钟就准了。! A7 x( ^2 K: p- G6 S
5,最后遇到的问题就是 在移植触摸屏中遇到无法校准问题。
# v4 D. S( a/ v3 V4 K! h8 Vemwin 和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   
7 a( }7 d9 y  l3 Y#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)
: M7 [/ A. R& I+ S* a% G; [ 
+ K+ a. m! _- l8 d: r0 z4 @, ~ 5.jpg
4 r, c0 B1 G5 `( g! a1 `, k/ y, Y+ f) h$ o
 
* _- ^" R, E& Z* N 3 a3 A7 o& t8 ^! L
补充工程文件链接在附件里, 不知道怎么压缩文件太大,只能存到网盘里了
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版