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

【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个回答
andykim 回答时间: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函数,,,求解答,,
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版