OpenEdv-开源电子网

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

Stm32_Clock_Init系统时钟设置和delay_init延时初始化的问题

[复制链接]

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
发表于 2014-10-21 17:35:57 | 显示全部楼层 |阅读模式
5金钱
用寄存器例程跑马灯实验:系统时钟是采用外部时钟(8MHZ)的。
主程序中delay_ms(1000)


灯亮灭的时间差不多1s的
但是改用内部(8MHZ)作为系统时钟,同样设置delay_ms(1000),灯就闪烁的很快。。没有一秒,而且还有个问题是delay_init(72);   //延时初始化,这个里面的72这个数为啥随便改都没什么影响。

以下是我改用内部时钟作为系统时钟的程序改写:


这个问题困扰了我很长时间,求帮忙解答。。。。。

最佳答案

查看完整内容[请看2#楼]

回复【5楼】ddong610: --------------------------------- 我是说在选用内部RC振荡器的情况下   delay_init() 里面选择外部时钟   在你上面的程序基础上  只改这儿 SysTick->CTRL&=~(1<<2); SysTick->CTRL=|(1<<2);   选择内部时钟源   是指的CM3上的自由运动时间    看你delay_init()  配置选的是Cortex系统时钟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5783
金钱
5783
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-10-21 17:35:58 | 显示全部楼层
回复【5楼】ddong610:
---------------------------------
我是说在选用内部RC振荡器的情况下   delay_init() 里面选择外部时钟  
在你上面的程序基础上  只改这儿 SysTick->CTRL&=~(1<<2);

SysTick->CTRL=|(1<<2);   选择内部时钟源   是指的CM3上的自由运动时间   
看你delay_init()  配置选的是Cortex系统时钟

回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5783
金钱
5783
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-10-21 20:35:30 | 显示全部楼层
delay_init()函数 选择外部时钟源
SysTick->CTRL&=~(1<<2);
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-21 21:45:55 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
恩,选外部时钟是SysTick->CTRL&=~(1<<2);
选内部时钟我用的是SysTick->CTRL|=1<<2;
但是LED延时1000,没效果,闪的很快
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5783
金钱
5783
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-10-21 21:46:59 | 显示全部楼层
回复【3楼】ddong610:
---------------------------------
你直接改外部时钟试试
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-21 22:02:25 | 显示全部楼层
回复【4楼】lycreturn:
---------------------------------
例程是外部的,能用~只是我在试验内部的~出错的~但找不到原因
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-21 23:16:59 | 显示全部楼层
内部时钟,最多只能倍频到64Mhz
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-22 17:20:57 | 显示全部楼层
回复【6楼】lycreturn:
---------------------------------
是这意思么:delay_init() 里面选择外部时钟--SysTick->CTRL&=~(1<<2);是Cortex系统时钟,因此必须要fac_us=SYSCLK/8;进行八分频。
而选用SysTick->CTRL=|(1<<2);   选择内部时钟源   是指的CM3上的自由运动时间 --就不需要8分频直接拿来用?
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-22 17:28:26 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
选用内部时钟(8MHZ)是要先对其进行2分频,然后在通过PLL设置,进行倍频。2~16,最大64MHZ。

但我在用内部时钟,设置16倍频,delay_init(),括号里面的数不管怎么改,调试的时候,下面程序中的SYSTICK都是64MHZ,0x03D09000。感觉这个SYSTICK外面delay_init(64),是没用的。。。求解释~谢谢原子哥
void delay_init(u8 SYSCLK)
{
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
u32 reload;
#endif
//  SysTick->CTRL&=~(1<<2); //SYSTICK使用外部时钟源
SysTick->CTRL|=1<<2; //SYSTICK使用内部时钟源  
fac_us=SYSCLK/8; //不论是否使用ucos,fac_us都需要使用
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-22 17:31:06 | 显示全部楼层
回复【6楼】lycreturn:
---------------------------------
对了~这里的systick选用内部时钟源,是用的芯片内部RC振荡器?选用外部时钟源是用的是外部晶体振荡的么?
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5783
金钱
5783
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-10-22 20:53:04 | 显示全部楼层
回复【10楼】ddong610:
---------------------------------
这儿systick的时钟源,因为翻译的差异,有的翻译是内/外部时钟源,但是根据时钟树明显看得出systick的2个时钟源:
一个是由AHB 8分频得到的Cortex系统时钟(也就是你说的外部时钟)
另一个是由AHB直接提供的FCLK Cortex自由运动时钟
这2个时钟源既不是外部高速时钟HSE,也不是内部RC时钟HSI
所以你配置systick时钟源要么AHB 8分频,要么直接用AHB
选择AHB 8分频   那么delay_init() 里面应该  SysTick->CTRL&=~(1<<2); fac_us=SYSCLK/8;
当然你可以选择直接用AHB     SysTick->CTRL|=1<<2; fac_us=SYSCLK;  但要注意的是,这个计数频率也是上面那个的8倍了  所以最大延时也变为上一个的1/8,
AHB 72M的情况下 延时一次1.86s  在这种情况下延时一次最多就1.86/8=233ms,所以在这种情况下delay_ms(1000); 也相对于只延时了233ms
所以  要想用systick延时更长,一般就选择 AHB  8分频
你如果非得要用AHB作systick时钟,并且一次延时1s   那么AHB的最大时钟不得大于 2^24/1000000=16.7MHz  你可以在AHB  为16MHz 条件下试试
回复

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
 楼主| 发表于 2014-10-23 08:32:02 | 显示全部楼层
回复【11楼】lycreturn:
---------------------------------
为啥我用SysTick->CTRL|=1<<2; fac_us=SYSCLK;  delay_ms(1000);延时1s和用外部时钟也就是你说的AHB 8分频得到的Cortex系统时钟延时1s,两个延时差不多呢~
还有为啥你说用AHB作systick时钟,最大不能大约16.7MHZ?手册里面有些最大能达到64MHZ.......你说的AHB和内部时钟不是一个东西?
谢谢~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 02:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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