你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

不好意思,问个定时器的问题

[复制链接]
beary 提问时间:2016-1-8 12:01 /
不好意思,各位,初学STM32,对于定时器的计算和频率的获取有些不太理解

我想稍微可以略精确的控制定时器的时间,
网上看到公式

f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;

不好意思,各位,初学STM32,对于定时器的计算和频率的获取有些不太理解

我想稍微可以略精确的控制定时器的时间,
网上看到公式

f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;


void MY_TIMERINIT(int arr,int psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        NVIC_InitTypeDef  NVIC_InitStruct;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period = arr;
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
        TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStruct);
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
        NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
        NVIC_Init(&NVIC_InitStruct);
}
arr = 9999;
psc = 7199;
打印的非常快
我看到代码里有
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;

看上去是APB1总线得到时钟,分频是1,看上去好像是APB1过来多少,那时钟频率就是多少。

我看到手册里的图
QQ图片20160108115944.png


APB1的时钟好像是AHB分频来的,AHB的时钟代码哪里可以看到呢?

不是很理解。。。

问的比较基础,,,我也查过一些资料

麻烦各位了  谢谢
QQ图片20160108115858.png
收藏 评论18 发布时间:2016-1-8 12:01

举报

18个回答
wolfgang 回答时间:2016-1-8 12:27:32
f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;

一般
参数 (TIM_Prescaler+1) 处理成为1MHZ 的整数倍
参数 (1+TIM_Period)  对1MHZ的整数 分频成为所需要的具体频率

72MHZ  = 72000*1000

因为(TIM_Prescaler  最大 0xFF= 65535 那么 就只能处理成为 32766了 剩下的 2MHZ交给TIM_Period 来处理  TIM_Period=1999 可以处理为1秒一次的频率~~

希望对您有所帮助



beary 回答时间:2016-1-8 16:20:45
安 发表于 2016-1-8 15:27
看手册RCC这一章,里面描述了各个模块使用的频率,还有就是看框图。

谢谢!!

框图看过了,不过有些地方,麻烦斑竹君了。

APB1是由AHB给的,AHB最高是72,APB1最高是36

我程序中直接就用了
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
那请问AHB是多少呢?在程序哪儿可以看到配置的呢?
beary 回答时间:2016-1-8 12:21:34
void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_IT_Update)!=RESET)
  {
    static int co_sec = 0;
    co_sec++;
    printf("%d\r\n",co_sec);
  }
}
beary 回答时间:2016-1-8 12:20:45
太奇怪了。。怎么我设置了
int arr = 64999;
int psc = 64999;
速度还是很快。。。
beary 回答时间:2016-1-8 12:24:31
找到原因了 没有清楚标志位
beary 回答时间:2016-1-8 12:24:52
不过我还是想知道- -  时钟分配的问题,
xmshao 回答时间:2016-1-8 13:23:08

clk

clk

beary 回答时间:2016-1-8 14:51:58
wolfgang2015 发表于 2016-1-8 12:27
f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;

一般

非常感谢,
你说的让我更明白了。

不过我的提问可能没说清楚。
我比较疑惑的是72m这个值是在那个文档可以查阅到呢?


麻烦你了,谢谢
beary 回答时间:2016-1-8 14:52:13

还有配图,非常给力!非常感谢
拼命三郎 回答时间:2016-1-8 14:57:06
有啥不好意思的
废鱼 回答时间:2016-1-8 15:27:15
看手册RCC这一章,里面描述了各个模块使用的频率,还有就是看框图。
xmshao 回答时间:2016-1-8 15:32:37
每个芯片手册都有个 CLOCK TREE的,那里说的很清楚了。
废鱼 回答时间:2016-1-9 08:54:49
AHB的频率在时钟配置那看。请问用的是标准库还是HAL?
zcl201207 回答时间:2016-1-9 21:18:14
学习ing。。。。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版