OpenEdv-开源电子网

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

请教软件延时问题(自适应不同的cpu主频)

[复制链接]

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
发表于 2013-3-19 17:01:41 | 显示全部楼层 |阅读模式
请教软件延时方面(想自适应不同的cpu主频)。
我想做一个软件延时程序,在不同的cpu频率下都适用,但是下面好像是文件中不能识别SYSCLK_FREQ_24MHz,SYSCLK_FREQ_48MHz等定义。请问怎搞?
谢谢。

#if defined SYSCLK_FREQ_24MHz
  #define Delay_Val1  4000
#elif defined SYSCLK_FREQ_48MHz
  #define Delay_Val1  8000
#elif defined SYSCLK_FREQ_72MHz
  #define Delay_Val1  12000
#else 
  #define Delay_Val1  4000
#endif

void Dly_nms(u16 nms)
{
  vu16 i;
vu16 j;
for (i=0;i<nms;i++)
{
 for (j=0;j<Soft_Delay_Val1;j++) ;
}
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-19 18:24:28 | 显示全部楼层
没法搞.
你不知道外部晶振的频率,横竖都无法统计.除非软件编译的时候,确定外部晶振的频率.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
 楼主| 发表于 2013-3-19 22:17:54 | 显示全部楼层
不是啊,知道频率的啊,在 system_stm32f10x.c 中有相关主频的定义,但是我不知道怎么在其他文件中引用到这个宏,例如 SYSCLK_FREQ_72MHz

回复【2楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-19 23:00:49 | 显示全部楼层
你怎么知道?
比如你的代码是针对8M的外部晶振写的
我给你换个6M的晶振,那不频率就变了?
换个10M的呢?那不也不对.

所以...你没法知道频率.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
 楼主| 发表于 2013-3-20 14:46:15 | 显示全部楼层
不是,我是想知道在Delay.c中怎么知道system_stm32f10x.c是否定义了相关的值,例如 SYSCLK_FREQ_48MHz
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-20 21:33:24 | 显示全部楼层
回复【5楼】gz_ddc:
---------------------------------
应该是有全局宏定义的.你跟踪下就知道了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-21 14:00:56 | 显示全部楼层
//System_Clock为系统时钟,  定时还是很准确的。
//System_Clock 一般都能被 8000000整除, 如72

#define delay_par (1.6*((System_Clock/8000000)))
void delay_us(int x)
{
int _dcnt = (int)(x*delay_par);
while(--_dcnt>0);
}
#define delay_ms(x) delay_us(1000UL*x)

这个程序以前版本是 
void delay_us(x)  do{\
int _dcnt = (int)(x*delay_par);\
while(--_dcnt>0);}while(0)

不开中断测试 ,完全准确
但是在C里面调用会有一定的问题。 在C++没事。 因为c 函数内部不能定义变量,只能放在函数开始

改后, 在us级别时候 误差稍稍大一些,时间越长 , 误差就可忽略

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 23:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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