打印
[STM32F4]

F4的复位和启动问题

[复制链接]
2423|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ticomi|  楼主 | 2014-6-30 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在STM32F4中移植了官方提供的uCOSIII,测试中发现一个问题这个代码写到F4中后如果直接使用电源关闭再重启则是正常的,如果是复位就出现错误,跟踪发现是HardFault_Handler,不明白为什么复位和启动会出现这个问题。而我对ST的ARM的启动不是很理解,一时间也没有找到相关的资料看下,怎么设置才能使用复位和重启是一致的。

非常感谢!!
沙发
启动设置是什么?就是boot0,1的配置~另能跟踪到哪一步进入异常吗?还是软件复位后直接跳到异常了?

使用特权

评论回复
板凳
ticomi|  楼主 | 2014-7-1 08:32 | 只看该作者
想做大牛的小马 发表于 2014-7-1 07:52
启动设置是什么?就是boot0,1的配置~另能跟踪到哪一步进入异常吗?还是软件复位后直接跳到异常了?[em:yct2 ...

不是复位后直接跳转了,是使用ucosIII遇到了问题,在ucosIII中我开启了FPU模块,这个功能要求在使用前需要设置下,而在正常的启动中是设置了,但是在复位的启动中没有设置个FPU模块而导致的错误。所以我想知道怎么在复位的时候和正常启动的时候执行一样的代码?或者在复位的地方增加自己的代码?

谢谢

使用特权

评论回复
地板
ticomi 发表于 2014-7-1 08:32
不是复位后直接跳转了,是使用ucosIII遇到了问题,在ucosIII中我开启了FPU模块,这个功能要求在使用前需 ...

没有区别,fpu没有调过,但看这个情况应该是,你启用了fpu,配置了相关的reg,但是启动过程中,
这些reg可能影响到了启动,而断电后,这些reg里的值恢复了。。。~

使用特权

评论回复
5
ticomi|  楼主 | 2014-7-1 09:19 | 只看该作者
想做大牛的小马 发表于 2014-7-1 09:13
没有区别,fpu没有调过,但看这个情况应该是,你启用了fpu,配置了相关的reg,但是启动过程中,
这些reg ...

我没有使用官方提供的启动文件而是自己修改了ST提供的启动文件,在官方的文件中在复位处提供了这样一个代码
#if __ARMVFP__                                                  /* Enable access to Floating-point coprocessor.         */
    CPU_REG_NVIC_CPACR = CPU_REG_NVIC_CPACR_CP10_FULL_ACCESS | CPU_REG_NVIC_CPACR_CP11_FULL_ACCESS;
                                                                 
    DEF_BIT_CLR(CPU_REG_SCB_FPCCR, DEF_BIT_31);                 /* Disable automatic FP register content                */
    DEF_BIT_CLR(CPU_REG_SCB_FPCCR, DEF_BIT_30);                 /* Disable Lazy context switch                          */
#endif
   
    __iar_program_start();


而我使用的启动文件中已经实现了复位中断,我想知道怎么来处理这个启动文件中的带来的问题,也就是如何在我的复位中断中增加这些代码。

非常感谢!

使用特权

评论回复
6
ticomi 发表于 2014-7-1 09:19
我没有使用官方提供的启动文件而是自己修改了ST提供的启动文件,在官方的文件中在复位处提供了这样一个代 ...

(⊙o⊙)…你用的是什么文件,一般都是汇编啊。。。加上这些配置不就可以了吗?就是写core的scb,disable掉fpu先吧,官方提供的例程估计是这个意思。。。。

使用特权

评论回复
7
ticomi|  楼主 | 2014-7-1 10:07 | 只看该作者
想做大牛的小马 发表于 2014-7-1 09:35
(⊙o⊙)…你用的是什么文件,一般都是汇编啊。。。加上这些配置不就可以了吗?就是写core的scb,disable ...

是的,我把官方例程中的代码移植到了我的启动文件中,现在是复位正常了。出来新的问题了,正常启动时的ucosIII的系统时钟出现问题,正常启动时使用系统的延时函数OSTimeDly(500u, OS_OPT_TIME_DLY, &err);延时500个时钟节拍和直接在时钟节拍中断中进行直接测试时间发现OSTimeDly(500u, OS_OPT_TIME_DLY, &err);的延时较系统中断长了一倍,而复位启动时则是正常的。现在被搞糊涂了!!!

使用特权

评论回复
8
ticomi|  楼主 | 2014-7-1 10:34 | 只看该作者
现在解决问题的方式是在复位中断中添加自定义代码
#if __ARMVFP__                                                  /* Enable access to Floating-point coprocessor.         */
    CPU_REG_NVIC_CPACR = CPU_REG_NVIC_CPACR_CP10_FULL_ACCESS | CPU_REG_NVIC_CPACR_CP11_FULL_ACCESS;
                                                                 
    DEF_BIT_CLR(CPU_REG_SCB_FPCCR, DEF_BIT_31);                 /* Disable automatic FP register content                */
    DEF_BIT_CLR(CPU_REG_SCB_FPCCR, DEF_BIT_30);                 /* Disable Lazy context switch                          */
#endif
然后紧张中断延迟发布,这样在正常启动和复位启动都是正常的。出现的问题是在时钟中断中系统的OSTick中是正常的,在里面设置一个闪烁LED,和在一个任务中使用OSTimeDly(500u, OS_OPT_TIME_DLY, &err);延迟有一定的偏差且这个偏差是在累积的,时间长可以明显看到这个差值。我将OS_OPT_TIME_DLY修改为OS_OPT_TIME_PERIODIC也是一样的,问题是我只有一个任务的,这个不应该出现差值累计的。

使用特权

评论回复
9
检查一下系统时钟是多少,然后你的systick,就是你时钟节拍设置的是多少,1ms还是更小?
还有是如何进行测试的。。。你说的有点混乱

使用特权

评论回复
10
ticomi|  楼主 | 2014-7-1 10:58 | 只看该作者
想做大牛的小马 发表于 2014-7-1 10:39
检查一下系统时钟是多少,然后你的systick,就是你时钟节拍设置的是多少,1ms还是更小?
还有是如何进行测 ...

系统时钟48MHz,时钟节拍1000Hz,我看下了应该是uCOSIII的延时函数造成的,每次会有一定的时钟节拍延迟,这样就会出现延迟了累积问题。

我在时钟节拍中断中让LED闪烁,在任务中设置了延迟500个时钟节拍周期,也点亮另一个LED,两个LED在开启时是一同开始点亮闪烁,然后随着时间出现任务中的LED开始慢于节拍中断里的LED!

使用特权

评论回复
11
ticomi 发表于 2014-7-1 10:58
系统时钟48MHz,时钟节拍1000Hz,我看下了应该是uCOSIII的延时函数造成的,每次会有一定的时钟节拍延迟, ...

这个做法是出于神马目的?。。。延时函数一般不会有问题,任务调度函数里也是去数systick,
到500个之后,这个任务就已经就绪了,除非这时被更高优先级的抢占一段时间,按理说任务中的led应该就闪了,也就是说,如果你任务中设定500ms闪烁,它应该是严格的按照500ms的周期闪烁的!
systick中断里闪烁led?systick的优先级相当的高了,所以应该是更严格的按照你设定的周期闪烁!~

使用特权

评论回复
12
ticomi|  楼主 | 2014-7-1 11:26 | 只看该作者
想做大牛的小马 发表于 2014-7-1 11:21
这个做法是出于神马目的?。。。延时函数一般不会有问题,任务调度函数里也是去数systick,
...

我想也是如此,因为只有一个任务,不存在更高任务就绪造成延时。我现在也不是很明白原因是什么?uCOSIII的延时和uCOSII是不同的,不知道这里面是不是有差异。但是即便是有差异,也不应该是延时有累积,而应该是个固定的差异,比如任务就绪造成的时差等,但那是固定而不是现在的出现积累性延时误差!

使用特权

评论回复
13
ticomi 发表于 2014-7-1 11:26
我想也是如此,因为只有一个任务,不存在更高任务就绪造成延时。我现在也不是很明白原因是什么?uCOSIII ...

啊哦,没看过III的代码,等有空的时候仔细看看再讨论哈

使用特权

评论回复
14
ticomi|  楼主 | 2014-7-1 17:07 | 只看该作者
使用F4系列的目的是使用FPU,以前也在上面运行过uCOSII,当时没有开启FPU所以没有出错。现在开启了FPU后安镇官方提供的例子修改后是正常的。现在的问题是uCOSIII提供的延时函数是不准确的,与系统的心跳时钟有积累性的偏差,这个很难接受,而我现在只有一个任务在运行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

852

帖子

4

粉丝