STM32 SysTick时钟配置问题!!!

zzfei90 2011-06-30 12:01:11
这两天在看STM32的SysTick定时器,用到系统时钟配置的时候有个问题
就是

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_SetPriority(SysTick_IRQn,0);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
// SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_Config(72000);

while(1)
{
Delay_ms(1000);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
GPIO_SetBits(GPIOF,GPIO_Pin_9);
Delay_ms(1000);
GPIO_SetBits(GPIOF,GPIO_Pin_6);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
}
这里头我用SysTick_CLKSource_HCLK_Div8和用SysTick_CLKSource_HCLK是完全一样的效果
我写成
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_Config(72000);
的时候Delay_ms(1000)是1S的效果
换成
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
还是一样的效果

可是我觉得如果我用SysTick_CLKSource_HCLK_Div8的话不是应该是SysTick_Config(9000);的时候才会是1S吗?过来人麻烦进来解释下
...全文
1249 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzfei90 2011-10-25
  • 打赏
  • 举报
回复
嗯 的确是这样 试过了 可以 不错 谢了 呵呵
geshuyong 2011-10-07
  • 打赏
  • 举报
回复
问题已经找到:请看这个函数
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
/*********************************************************************************/
(1)控制寄存器 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
此时SysTick时钟为系统时钟即SysTick_CLKSource_HCLK;
(2)控制寄存器 SysTick->CTRL =
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
此时SysTick时钟为系统时钟8分频即SysTick_CLKSource_HCLK_Div8

SysTick_Config(uint32_t ticks)此函数应经对时钟进行了选择,固定为系统时钟 。

/*************************************************************************/
所以只要这两个函数调换一下位置就OK了!
SysTick_Config(72000);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

geshuyong 2011-10-07
  • 打赏
  • 举报
回复
我也遇到了同样的问题,SysTick_CLKSource_HCLK_Div8和SysTick_CLKSource_HCLK效果是一样的,有人知道怎么回事吗?
当我遇上-你 2011-07-01
  • 打赏
  • 举报
回复
我没使用库,自己配置的,呵呵
zzfei90 2011-07-01
  • 打赏
  • 举报
回复
我的Delay_ms()函数是这样的
void Delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
可是也应该能计算的啊 为什么按理论计算出来不正确呢
lbing7 2011-07-01
  • 打赏
  • 举报
回复
LZ您看一下,大概您的那个DELAY_MS函数与系统时钟有关么?

我在标准库里没有看到相应的函数。

另外,我在用系统时钟的时候,我也没有这么具体地去操作它

只要定义了系统时钟频率,然后,用标准库里提供的那个接口配置一下即可

SysTick_Config(SystemFrequency / 1000);

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧