stm32f107时钟配置和滴答定时器遇到问题

2019-08-20 18:27发布




上图是stm32f107的时钟树,请问系统滴答定时器的时钟来源只有HCLK或者HCLK八分频么?
因为我做了一个实验,就是改变system clock,发现系统滴答定时器不受影响,而Tim2受影响。HCLK来自system clock这样说应该没错吧。那么system clock改变了为什么与HCLK相关的系统滴答定时器没收到影响呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
XUZJWWSZ
1楼-- · 2019-08-20 20:42

原来问题在这里:

在设定两次中断的滴答次数之前,调用了一个获得系统时钟的函数:

  

 

 

在函数里面有一个外部晶振的值是事先定义好的:

  

 

 

它的定义位置如下图:

  

 

原来定义HSE_VALUE是25Mhz,改成20M就好了。

XUZJWWSZ
2楼-- · 2019-08-21 02:08
 精彩回答 2  元偷偷看……
XUZJWWSZ
3楼-- · 2019-08-21 02:49


可以确认define了STM32F10X_CL,对这段代码的更改也影响了tim2定时器,通过示波器观察到毫秒级别的明显变化。
XUZJWWSZ
4楼-- · 2019-08-21 07:43
在新的板子上没有25M晶体了,我只好用20M晶体代替,原来的例程里是25/5*8/5*9=72。我换了晶体之后用20/4*8/5*9=72不就行了么。于是我对下面代码做了更改:
原来是:
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

更改之后是:
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV4 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);


只是把第二段的RCC_CFGR2_PREDIV2_DIV5换成了RCC_CFGR2_PREDIV2_DIV4,程序下载后tim2定时器准确工作,说明获得了72Mhz的system clock。
但是滴答定时器却不准了。延时10ms变成了延时12.5ms。这不刚好是20M与25M的比例么!
也就是说系统滴答定时器绕过system clock直接受到了外部晶体HSE的影响,是在不理解是为什么,还是我前面的推断哪里出错了。
lycreturn
5楼-- · 2019-08-21 12:21
没用过107   看你的思路也没什么问题     检查下你2L的截图,里面芯片型号(STM32F10X_CL)有没有选错
XUZJWWSZ
6楼-- · 2019-08-21 16:43
回复【5楼】lycreturn:
---------------------------------
依然谢谢你,原来外部时钟的值被事先定义了。

一周热门 更多>