OpenEdv-开源电子网

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

定时器预分频系数的问题

[复制链接]

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
发表于 2013-9-5 13:23:55 | 显示全部楼层 |阅读模式
    我看原子哥的光盘里面的标准例程里面的定时器中断部分  如下
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M

void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;
  TIM3->ARR=arr;     
TIM3->SC=psc;    
TIM3->DIER|=1<<0;  
TIM3->CR1|=0x01;  
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);  
}

   通过看STM32的时钟树知道  APB1为 36M ,而通用定时器当预分频系数不为1时,时钟频率为APB1的倍频,即72M,那上面的程序中也没有通过RCC_CFGR配置预分频系数,此寄存器默认值为0x0000 即 预分频系数位  也为 000   即预分频系数为1啊,那上面的 这里时钟选择为APB1的2倍是怎么来的啊,是我理解错了,还是光盘资料有点问题啊?谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2013-9-5 13:58:55 | 显示全部楼层
回复【楼主位】kingchunhai:
---------------------------------
恩,在 Stm32_Clock_Init(u8 LL) 里面配置的, RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
看来是我太大意了
  那个库函数版本的int main(void)
 {
 
delay_init();         
NVIC_Configuration(); 
uart_init(9600);  
  LED_Init();    
TIM3_Int_Init(4999,7199);
    while(1)
{
LED0=!LED0;
delay_ms(200);    
}  

 
}  

这个实在不知道这个预分频系数或者类似的Stm32_Clock_Init(9); //系统时钟配置
在哪配置的了?谢谢
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-5 14:23:44 | 显示全部楼层
回复【2楼】kingchunhai:
---------------------------------
参考原子哥的代码以及F103的reference manual中RCC还有PLL相关的寄存器。
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2013-9-5 14:36:42 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------
谢谢,但是这个库函数的这个  类似于寄存器的 Stm32_Clock_Init(u8 LL)  的函数有没有?没有的话,我看那
原子哥库函数版本的 定时器中断程序 
//通用定时器3中断初始化
//这里选择为APB1的2倍 ,APB1 为36M 




void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //?±??????

//?¨?±?÷TIM3??????
TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷????????
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·?????
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?ò??????????
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //?ù?????¨????????????TIMx???±???ù??????
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //???????¨??TIM3????,???í?ü??????

//??????????NVIC?è??
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //??????????0??
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //????????3??
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??±?????
NVIC_Init(&NVIC_InitStructure);  //??????NVIC?????÷


TIM_Cmd(TIM3, ENABLE);  //????TIMx  
}


 那这个   这里选择为APB1的2倍就没有来由啊?谢谢
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2013-9-5 14:38:17 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------
谢谢,但是这个库函数的这个  类似于寄存器的 Stm32_Clock_Init(u8 LL)  的函数有没有?没有的话,我看那
原子哥库函数版本的 定时器中断程序 
//通用定时器3中断初始化
//这里选择为APB1的2倍 ,APB1 为36M 




void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


TIM_TimeBaseStructure.TIM_Period = arr; 
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);  


TIM_Cmd(TIM3, ENABLE);   
}


 那这个   这里选择为APB1的2倍就没有来由啊?谢谢
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-5 14:47:57 | 显示全部楼层
回复【5楼】kingchunhai:
---------------------------------
库函数的APB1时钟是在程序初始化过程就完成了,SystemInit()里面。在system_stm32f10x.c里面找找。在RCC寄存器的设置过程中。

刚才看了下,确切的是在system_stm32f10x.c里SetSysClock()里面完成的。

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2013-9-5 15:08:56 | 显示全部楼层
回复【6楼】ricefat:
---------------------------------
我也看了下,在Systeninit 里面如下
 #ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  #ifdef STM32F10X_CL
  /* Reset LL2ON and LL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
那这个  #ifndef STM32F10X_CL      STM32F10X_CL  是区分什么的?

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
同上,  STM32F10X_LD_VL      STM32F10X_MD_VL       STM32F10X_HD_VL  是区分  小型、中型、大型的吧?


Systeminit ()里面的这个才是吧?  谢谢
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-5 15:23:39 | 显示全部楼层
回复【7楼】kingchunhai:
---------------------------------
型号划分我也没好好研究过。

你贴的代码好像只是初始化RCC的,但是设置系统时钟还是在setsysclock里面。我贴的就是设置APB1和APB2以及系统时钟的设置代码
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2013-9-5 15:32:04 | 显示全部楼层
回复【8楼】ricefat:
---------------------------------
恩,确实是这样,在Systeminit 的最后面是 SetSysClock() 这个函数完成配置,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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