OpenEdv-开源电子网

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

求助,STM32底层库中的寄存器,被操作之后,在什么时候会生效啊

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-7-10
在线时间
1 小时
发表于 2015-7-10 20:42:58 | 显示全部楼层 |阅读模式
5金钱
我看的是ST库3.0的源码
里面的static void SetSysClockTo72(void)这个函数的这一段
    /*!< 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;
感觉有问题啊,首先是    /*!< PCLK1 = HCLK */这个注释,按照他配置的寄存器,应当是一个2分频啊,这里注释却没有说明,是写错了,还是我理解的有问题啊T_T还有一个就是PCLK1最大频率不是36M吗 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;这不就相当于直接设置APB1不分频,那么PCLK1的频率不就有72M了?会不会是我理解错了T_T还是有其他的问题啊




这个是在stm32f10x.h里面的宏定义
/*!< PPRE1 configuration */
#define  RCC_CFGR_PPRE1_DIV1                 ((uint32_t)0x00000000)        /*!< HCLK not divided */
#define  RCC_CFGR_PPRE1_DIV2                 ((uint32_t)0x00000400)        /*!< HCLK divided by 2 */
#define  RCC_CFGR_PPRE1_DIV4                 ((uint32_t)0x00000500)        /*!< HCLK divided by 4 */
#define  RCC_CFGR_PPRE1_DIV8                 ((uint32_t)0x00000600)        /*!< HCLK divided by 8 */
#define  RCC_CFGR_PPRE1_DIV16                ((uint32_t)0x00000700)        /*!< HCLK divided by 16 */



这个是system_stm32f10x.c里面的static void SetSysClockTo72(void)这个函数
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /*!< SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /*!< Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /*!< Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /*!< Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /*!< Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
 
    /*!< 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;
    
    /*!< PLLCLK = 8MHz * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);

    /*!< Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /*!< Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /*!< Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    /*!< Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /*!< If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */    

    /*!< Go to infinite loop */
    while (1)
    {
    }
  }
}

最佳答案

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

操作的时候就生效啊, 这个应该是误注释了  /*!< CLK1 = HCLK */  配置的是2分频  RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;  这个是配置AHB分频的   不是APB1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-7-10 20:42:59 | 显示全部楼层
操作的时候就生效啊, 这个应该是误注释了  /*!< CLK1 = HCLK */  配置的是2分频
 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;  这个是配置AHB分频的   不是APB1
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-7-10
在线时间
1 小时
 楼主| 发表于 2015-7-11 00:40:37 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
这个我仔细看了一下数据手册,明白是怎么回事的。
  /*!< HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
这个就是使得PCLK1上面的时钟频率为72M(此时没有输出到外设的时钟线上),但是在输出到外设时,还要经过一个与门,只有当外设时钟信号开启,APB1的分频后的时钟才是PLK1的时钟。当外设时钟开启之后,肯定是将 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;执行完成了。所以PCLK1上面没有超过最大36M的限制。
对于那个注释的问题,我坚定不移的相信是图错了<( ̄ˇ ̄)/
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-7-10
在线时间
1 小时
 楼主| 发表于 2015-7-11 00:41:49 | 显示全部楼层
就是这个图

回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-7-10
在线时间
1 小时
 楼主| 发表于 2015-7-11 00:42:07 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
O(∩_∩)O谢谢了!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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