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

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

[复制链接]
wxjsy 发布时间:2014-4-11 10:08
    在对stm32f407进行emwin5.16+ucosii 移植过程中,遇到的问题进行总结,希望对大家有所帮助
   移植过程参考了baiyangbing2009 的文章,在此基础上加入了ucosii系统。
1,虽然emwin5.16的数据手册上明确写错,emwin没有用到浮点数,但是 mdk给出的库确实浮点数库 0.jpg
所以stm32f407必须开启浮点数 1.jpg
不然gui_init()初始化会进入硬件错误中断
2,添加浮点数的库 2P.jpg
,同时对修改部分文件,提高运行速度。
    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
                                    #if (__FPU_USED == 1) && defined ( __CC_ARM   )
                                              *pOut = __sqrtf(in);
                                   #else      
                                              *pOut = sqrtf(in);
                                   #endif
                                 return (ARM_MATH_SUCCESS);
                            }
                        else
                           {
                               *pOut = 0.0f;
                                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编译后会汇编代码的差别巨大差别。
       当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。(参考网上资料)。
3.jpg
3,修改stm32f407的堆栈大小。 如果堆栈过小也会造成 图形gui初始化失败。
在启动文件startup_stm32f10x_md.s中修改
“Stack_Size      EQU     0x00000200”,
将堆栈改大点,改为
“Stack_Size EQU  0x00004000”。
4,系统滴答时钟不准,在移植后发现系统时钟比正常时钟慢滴答为100ms 但是实际上比100ms慢好多,最后发现问题出在晶振频率的设定上。在官方固件中,提供的外部晶振为25mhz,但是实际上 stm32f4discovery 却是8mhz的系统时钟,所以需要进行修改,可以更换外部晶振也可以修改程序,将stm32f4xx.h中的
#if !defined  (HSE_VALUE) 
  #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 */
#endif /* HSE_VALUE */
同时修改mdk的晶振为8.0 4.jpg 。如果不想修改官方固件 也可以再c/c++ 选项卡define里添加
HSE_VALUE =8000000。
  这样重新编译一下,系统时钟就准了。
5,最后遇到的问题就是 在移植触摸屏中遇到无法校准问题。
emwin 和ucgui 在对触摸屏的ad值选取略有不同, 在实际移植过程中发现, ucgui在 宏定义中直接定义好
#define GUI_TOUCH_AD_LEFT     
#define GUI_TOUCH_AD_RIGHT   
#define GUI_TOUCH_AD_TOP         
#define GUI_TOUCH_AD_BOTTOM      
 只要这几个值选着的准确,就可以了。但是在emwin中 即是在宏定义中定义准确了,发现触摸屏也不准, 在emwin中必须通过触摸校准函数,触摸屏才可以准确识别。
GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 480, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);
GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 272, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);


我用的是ra8875驱动4.3寸屏幕,屏幕刷新率能达到15m以上。(产考图片来自baiyangbing2009)
 
5.jpg

 
 
补充工程文件链接在附件里, 不知道怎么压缩文件太大,只能存到网盘里了
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 手机版