硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3890|回复: 3
收起左侧

[有问必答] 一个关于F103 modbus例程里面定时器的疑问

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2019-10-10 15:28:21 | 显示全部楼层 |阅读模式
关于定时器TIM2我的理解是
分频到计数器的每个周期是1us
然后通过捕获来确定两个帧之间的间隔是不是大于3.5个字节

但是具体到程序里面看,我就有点迷惑了
RCC_APB1PeriphClockCmd(TIM_HARD_RCC, ENABLE);

    /*-----------------------------------------------------------------------
                system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

                HCLK = SYSCLK / 1     (AHB1Periph)
                PCLK2 = HCLK / 2      (APB2Periph)
                PCLK1 = HCLK / 4      (APB1Periph)

                因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
                因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

                APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
                APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11

        ----------------------------------------------------------------------- */
        uiTIMxCLK = SystemCoreClock / 2;

        usPrescaler = uiTIMxCLK / 1000000 ;        /* 分频到周期 1us */
       
#if defined (USE_TIM2) || defined (USE_TIM5)
        //usPeriod = 0xFFFFFFFF;        /* 407支持32位定时器 */
        usPeriod = 0xFFFF;        /* 103支持16位 */
#else
        usPeriod = 0xFFFF;
#endif
        /* Time base configuration */
        TIM_TimeBaseStructure.TIM_Period = usPeriod;
        TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM_HARD, &TIM_TimeBaseStructure);


这一段的描述中  参考的是F4的 void SetSysClock(void)这个函数,里面给APB1的时钟是4分频的,那么这个时候TIM2的时钟的确是系统时钟的一半
但是我看例程中,F103的时钟配置里面关于APB1的时钟是这么配置的
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


也就是APB1二分频了,实际上F103在例程这个地方的时钟是系统时钟/2*2,就是系统时钟.
那这个程序在F103上捕获的速度应该是比预想的快了一倍.

不知道是不是我对这个程序的理解有错.
如果没错的话,虽然例程跑得起来,但是这捕获的速度变快了,会不会对稳定性有比较大的影响?
求指教
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2019-10-11 10:14:20 | 显示全部楼层
F1系列这里是个bug,要改了。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2019-10-11 15:04:35 | 显示全部楼层
这两天也在看MODBUS的代码,楼主要没发帖,还真没注意到这个地方,需要把那个2分频去掉吧,不然时间快了一倍,T3.5也快了很多,
回复

使用道具 举报

2

主题

19

回帖

25

积分

新手上路

积分
25
发表于 2020-5-21 11:13:55 | 显示全部楼层
夜乄謌 发表于 2019-10-11 15:04
这两天也在看MODBUS的代码,楼主要没发帖,还真没注意到这个地方,需要把那个2分频去掉吧,不然时间快了一 ...

是这里的二分频要去掉吗?
uiTIMxCLK = SystemCoreClock / 2;
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 00:58 , Processed in 0.153927 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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