OpenEdv-开源电子网

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

STM32的SystemInit()函数是怎么设置APB1的时钟为2分频的?

[复制链接]

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
发表于 2018-1-22 22:48:39 | 显示全部楼层 |阅读模式
1金钱
看了下SystemInit()的源码
对CFGR寄存器操作的只有这么几行,
[mw_shl_code=cpp,true]#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;[/mw_shl_code]

全都是&=操作。

如果要设置CFGR寄存器的8~10位来设置分频系数,应该是|=操作才对啊。

RCC_CFGR

RCC_CFGR



那么,到底SystemInit()函数,是怎么设置APB1的2分频的呢???

最佳答案

查看完整内容[请看2#楼]

&就是在清除某些位,设置在后头呢,看代码要有耐心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-22 22:48:40 | 显示全部楼层
&就是在清除某些位,设置在后头呢,看代码要有耐心
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
 楼主| 发表于 2018-1-23 14:28:54 | 显示全部楼层
正点原子 发表于 2018-1-22 22:48
&就是在清除某些位,设置在后头呢,看代码要有耐心

谢原子哥指教。
SystemInit()函数中调用了
[mw_shl_code=cpp,true]/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /* Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();[/mw_shl_code]

然后,在SetSysClock()函数中,调用了
[mw_shl_code=cpp,true]#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();[/mw_shl_code]

进一步,在函数SetSysClockTo72()中设置了APB1时钟的2分频。
[mw_shl_code=cpp,true]/* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;[/mw_shl_code]
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-25 18:38:30 | 显示全部楼层
本帖最后由 warship 于 2018-7-25 18:40 编辑
卡卡_73 发表于 2018-1-23 14:28
谢原子哥指教。
SystemInit()函数中调用了
[mw_shl_code=cpp,true]/* Configure the System clock freq ...

太麻烦了,一个函数搞定。
void Stm32_Clock_Init(u8 PLL)
{

        bRCC_CLK_HSEON=1;    //外部高速时钟使能HSEON
        while(!bRCC_CLK_HSERDY);//等待外部时钟就绪
        RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
        PLL-=2;                                  //抵消2个单位(因为是从2开始的,设置0就是2)
        RCC->CFGR|=PLL<<18;   //设置PLL的倍频数 2~16
        bRCC_CONFIG_PLLSRC=1;          //PLLSRC ON
        FLASH->ACR|=0x32;           //FLASH 2个延时周期
        bRCC_CLK_PLLON=1;            //PLLON
        while(!bRCC_CLK_PLLRDY);//等待PLL锁定
        bRCC_CONFIG_SW_PLL=1;    //PLL作为系统时钟
        while(!bRCC_CONFIG_SWS_PLL); //等待PLL作为系统时钟设置成功
}
其中RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
这一句设定把各区域的时钟一把搞定。               
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 17:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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