初级会员

- 积分
- 192
- 金钱
- 192
- 注册时间
- 2015-7-22
- 在线时间
- 126 小时
|
1金钱
本帖最后由 sanv 于 2016-5-13 10:54 编辑
最近在细看STM32的基本设置。发下战舰板子的程序源码好像在延迟函数初始化时候有个错误。战舰板程序源码如下
void delay_init()
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
#endif
}
这里好像不应该把Systick系统时钟初始化为系统时钟的8分频吧!应该是系统时钟频率才对吧。[size=18.018px]fac_us=SystemCoreClock/8000000;不是9次么?
Systick的时钟如果是8分频的话那应该是900000次1秒吧。那么[size=18.018px]fac_us=[size=18.018px]900000[size=18.018px]/8000000吧!所以应该改为以下两种方式的一种吧
第一种
[size=18.018px]void delay_init()
[size=18.018px]{
[size=18.018px]#if SYSTEM_SUPPORT_OS //如果需要支持OS.
[size=18.018px] u32 reload;
[size=18.018px]#endif
[size=18.018px] [size=18.018px]SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK[size=18.018px]); //直接使用系统时钟72MHz
[size=18.018px] fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
[size=18.018px]#if SYSTEM_SUPPORT_OS //如果需要支持OS.
[size=18.018px] reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K
[size=18.018px] reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
[size=18.018px] //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
[size=18.018px] fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
[size=18.018px] SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
[size=18.018px] SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
[size=18.018px] SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
[size=18.018px]#else
[size=18.018px] fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
[size=18.018px]#endif
[size=18.018px]}
[size=18.018px]
[size=18.018px]第二种
[size=18.018px]void delay_init()
[size=18.018px]{
[size=18.018px]#if SYSTEM_SUPPORT_OS //如果需要支持OS.
[size=18.018px] u32 reload;
[size=18.018px]#endif
[size=18.018px] [size=18.018px]SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK的8分频
[size=18.018px] fac_us=SystemCoreClock/8/8000000; //1us所需次数
[size=18.018px]#if SYSTEM_SUPPORT_OS //如果需要支持OS.
[size=18.018px] reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K
[size=18.018px] reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
[size=18.018px] //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
[size=18.018px] fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
[size=18.018px] SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
[size=18.018px] SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
[size=18.018px] SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
[size=18.018px]#else
[size=18.018px] fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
[size=18.018px]#endif
[size=18.018px]}
[size=18.018px]
[size=18.018px]不知道这个理解对不对,原子哥出来解释一下。
[size=18.018px]
|
|