OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5525|回复: 12

【systick】为什么SysTick_CLKSourceConfig 不分频 和 8分频进中断的时间一样?

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-12-15
在线时间
8 小时
发表于 2017-12-15 22:09:16 | 显示全部楼层 |阅读模式
#include "led.h"

void SysTick_Init()
{
        //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//        HCLK / 8 = 9000000
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
        SysTick_Config(SystemCoreClock/8);  //        1 / 9000000 * 9000000 = 1 s
}

void SysTick_Handler(void)//SysTick中断服务程序 ISR
{
        static u8 flag = 1;
       
        switch(flag)
        {
                case 1:
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        flag++;
                        break;
                case 2:
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        flag = 1;
                        break;
                default:
                        break;
        }
}

int main()
{
        LED_Init();
        SysTick_Init();
       
        while(1);
}
【问题】
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
这两句下载到板子上led的亮灭频率一样,用示波器看了一下,大概都是125ms亮 125ms灭。是有什么地方没有配置好?期待各位大拿!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-1-8
在线时间
3 小时
发表于 2018-1-8 17:00:20 | 显示全部楼层
本帖最后由 Geen 于 2018-1-8 17:05 编辑
qd18754223582 发表于 2018-1-8 11:33
3L说的对,不管你怎么选择的systik时钟,但是你配置的进入中断的时间就是,系统时钟/8,即125ms进入一次, ...

我是这么理解的:不论怎样配置SysTick的时钟源,SystemCoreClock/8=9M是不变的;在systick的clk=HCLK=72MHz时,相当于滴答定时器1秒钟可以数72M个数,但是我只需要它数9M个数,也就只需要(9M/72M)*1s也就是125ms。

现在我把SysTick的时钟源换成72MHz/8=9MHz了,也就是说SysTick现在1秒钟只能数9M个数了,但是SysTick_Config(SystemCoreClock/8)配置的入口参数SystemCoreClock/8=9M是不变的,那么现在SysTick应该是1秒钟进一次中断才对啊——望您不吝赐教
回复 支持 1 反对 0

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-1-8
在线时间
3 小时
发表于 2018-1-11 16:55:00 | 显示全部楼层
本帖最后由 Geen 于 2018-1-11 17:02 编辑

解决了:问题在于SysTick_Config(ticks)函数中对SysTick->CTRL的赋值语句:
[mw_shl_code=c,true]  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;[/mw_shl_code]

第一行中的SysTick_CTRL_CLKSOURCE_Msk将 SysTick->CTRL寄存器中的CLKSOURCE时钟源选择位 置1了,这与前面的SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);是等价的。(参考《Cortex-M3权威指南》8.7小节 SysTick定时器)
也就是说,不论你前面怎样配置SysTick的时钟源,后面的SysTick_Config(ticks)函数都会重新选择内核的FCLK作为SysTick的时钟源(FCLK=HCLK/1),这就是使前面配置无效的原因。

修改方式:①把上面代码第一行SysTick_CTRL_CLKSOURCE_Msk部分删除,②将这个赋值语句的等号“=”改为或等于“|=”
[mw_shl_code=c,true]  SysTick->CTRL  |= SysTick_CTRL_TICKINT_Msk   |    //使能SysTick中断                      0x10
                    SysTick_CTRL_ENABLE_Msk;         //启动SysTick定时器                   0x1  [/mw_shl_code]
这样你再操作前面你自己写的SysTick初始化函数就可以发现:选择HCLK作为时钟源时,每125ms进一次SysTick中断;  选择HCLK/8作为时钟源时,每1s进一次SysTick中断

【附注:】在3.5固件库版本中SysTick_Config(ticks)函数是写在core_cm3.h中的,而这个core_cm3.h是只读文件,不能直接修改,解决办法:(一)你可以把这个函数有用的部分复制出来自己做一个新的函数进行修改
(二)你也可以不用这个函数,直接对SysTick->CTRL寄存器本身进行操作,代码如下:
[mw_shl_code=c,true]//        SysTick->CTRL |= (1ul<<2);        //时钟源选择FCLK
        SysTick->CTRL &= (0ul<<2);        //时钟源选择HCLK/8
        SysTick->CTRL |= 0x03;                        //使能中断位、启动定时器[/mw_shl_code]

————最后,十分感谢各位网友的热心交流!
回复 支持 1 反对 0

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-12-15
在线时间
8 小时
 楼主| 发表于 2017-12-15 22:12:14 | 显示全部楼层
led.c 如下:

#include "led.h"

void LED_Init(void)
{
        GPIO_InitTypeDef GPIO_InitTypeStructure;
        RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA , ENABLE );
       
        GPIO_InitTypeStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitTypeStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitTypeStructure.GPIO_Speed = GPIO_Speed_10MHz;       
        GPIO_Init( GPIOA, &GPIO_InitTypeStructure);
        GPIO_SetBits( GPIOA, GPIO_Pin_8);//置高GPIOA.8,关闭LED
}
回复 支持 反对

使用道具 举报

21

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-6-8
在线时间
79 小时
发表于 2017-12-16 21:11:04 | 显示全部楼层
SysTick_Config(SystemCoreClock/8);  频率是SystemCoreClock,跟你上面选择SYSTICK 时钟源没关系
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-1-8
在线时间
3 小时
发表于 2018-1-8 10:01:01 | 显示全部楼层
本帖最后由 Geen 于 2018-1-8 13:28 编辑

SysTick_CLKSourceConfig不是配置滴答定时器时钟的吗,时钟频率变了,ticks=9M没变,为什么延时不变呢?
回复 支持 反对

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2018-1-8 11:33:48 | 显示全部楼层
3L说的对,不管你怎么选择的systik时钟,但是你配置的进入中断的时间就是,系统时钟/8,即125ms进入一次,楼主所说的只是配置systik不同而已,和进入中断的时间没有关系
回复 支持 反对

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2018-1-10 11:58:41 | 显示全部楼层
Geen 发表于 2018-1-8 17:00
我是这么理解的:不论怎样配置SysTick的时钟源,SystemCoreClock/8=9M是不变的;在systick的clk=HCLK=72M ...

systemcoreclock是系统内核时钟,是由滴答时钟提供的,你最后时钟源换成9M,那么内核时钟也就是9M了,后面的配置,只是把系统时钟频率分成8份,每125ms进入中断一次,所以才说和你选择的时钟源没有关系
回复 支持 反对

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2018-1-10 12:02:52 | 显示全部楼层
qd18754223582 发表于 2018-1-10 11:58
systemcoreclock是系统内核时钟,是由滴答时钟提供的,你最后时钟源换成9M,那么内核时钟也就是9M了,后 ...

你参考下参考手册RM0008,里面有介绍systick
回复 支持 反对

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-10-23
在线时间
35 小时
发表于 2018-1-10 12:03:15 | 显示全部楼层
Geen 发表于 2018-1-8 17:00
我是这么理解的:不论怎样配置SysTick的时钟源,SystemCoreClock/8=9M是不变的;在systick的clk=HCLK=72M ...

你参考下参考手册RM0008,里面有介绍systick
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2014-7-24
在线时间
10 小时
发表于 2018-1-13 12:23:04 | 显示全部楼层
问题在systick_config()中一直会设置时钟为HCLK,具体请查看这个函数代码。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-12-15
在线时间
8 小时
 楼主| 发表于 2018-3-9 14:54:27 | 显示全部楼层
Geen 发表于 2018-1-11 16:55
解决了:问题在于SysTick_Config(ticks)函数中对SysTick->CTRL的赋值语句:
[mw_shl_code=c,true]  SysTic ...

谢谢!!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-12-15
在线时间
8 小时
 楼主| 发表于 2018-3-9 20:49:21 | 显示全部楼层
先调用SysTick_Config();然后调用SysTick_CLKSourceConfig()就可以了,忘记说了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表