你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关於时钟设置 SystemInit

[复制链接]
yaomei65 提问时间:2016-5-15 23:48 /
本帖最后由 yaomei65 于 2016-5-15 23:50 编辑

所使用的版子是STM32F072RB DISCO
库用了STM32F0xx_StdPeriph 1.5.0版本

把库全部弄好 LED确实有出来
接下来要测试systick的时候delay一直不对
後来发现系统时间只有8MHZ 理论上要是48MHZ

截取一小段程序放在下方
里面的 "HSEStatus" 数值一直都是0
以至於无法设定时钟
我认为这是HSE没有就绪 请问我是有漏掉设定哪个步骤吗?


static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  
  /* SYSCLK, HCLK, PCLK 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 != HSE_STARTUP_TIMEOUT));

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


在附上我的文档
除了main与it其他都没去修改

LED_test.rar

下载

4.01 MB, 下载次数: 2, 下载积分: ST金币 -1

收藏 评论10 发布时间:2016-5-15 23:48

举报

10个回答
freeelectron 回答时间:2016-5-18 09:17:10
hse起振后,不是有个倍频的过程吗?
wenyangzeng 回答时间:2016-5-18 10:35:24
STM32F072RB DISCO好像没有焊接外部晶振呀

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wolfgang 回答时间:2016-5-18 12:49:55
检查晶振是否起振。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

sting 回答时间:2016-5-18 12:50:48
先检查外部晶振有无起振,在void SetSysClock(void),若hse无起振,就不会倍频到48Mhz,单片机会继续使用内部hsi,所以是8Mhz

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

Dylan疾风闪电 回答时间:2016-5-18 16:20:28
贴一个我自己常用的时钟初始化代码。
调用很简单:
#define        USE_EXTERNAL_HSE        0
#define        USE_INTERNAL_HSI                 1

#define    SystemClockMHz               48//MHZ
void func()
{
if (HW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) == 0) //为了USB尝试切换HSE时钟//SystemClockMHz
{
        HW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);                /* 配置系统时钟为48M for USB clock */
}

}

  1. /**
  2.   * <b>配製系統主時鐘頻率。</b>
  3.   * <p>功能:選擇時鐘源,并進行PLL倍頻。
  4.   * @param  osc   高速時鐘源的選擇。
  5.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振
  6.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
  7.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册
  8.   * @return         osc
  9.   * @version                2.0.0.0(20160407)
  10.   * <p-2014>实现CM0与CM3兼容完成!
  11.         * <p-2016>對字符串/單詞進行變更。
  12.   * @author             Dylan
  13.   */
  14. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)
  15. {
  16. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  17.         uint8_t errCode = 0xff;
  18.         uint32_t sTimeCount, sTimeMax = 0xFFF;
  19. #endif
  20.        
  21.   HW_SystemPowerON();
  22.   
  23.         switch(osc)
  24.         {
  25.                 case USE_EXTERNAL_HSE:
  26. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  27.                         RCC->CR |= 1<<16;       //HSEON
  28.                
  29.                         sTimeCount = sTimeMax;
  30.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪
  31.                         {
  32.                                 if (sTimeCount--) return errCode;
  33.                         }
  34.                        
  35.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz
  36.                        
  37.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)
  38.                        
  39.                         //存在等待状态时,必须先开启预取缓冲区
  40.                         if (maxFreq <= 24)
  41.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
  42.                         else if (maxFreq <= 48)
  43.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
  44.                         else
  45.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
  46.                        
  47.                         RCC->CR |= 1<<24;                   //PLLON
  48.                        
  49.                         sTimeCount = sTimeMax;
  50.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪
  51.                         {
  52.                                 if (sTimeCount--) return errCode;
  53.                         }
  54.                        
  55.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
  56.                        
  57.                         sTimeCount = sTimeMax;
  58.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪
  59.                         {
  60.                                 if (sTimeCount--) return errCode;
  61.                         }
  62. #elif defined  (STM32F051) || defined  (STM32F042) //none
  63. #else
  64.                 #warning "Make sure needn't define STM32Fxxx etc. ?"
  65. #endif
  66.                         break;
  67.                 default:                //case USE_INTERNAL_HSI:
  68.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/2
  69.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
  70.                        
  71.                         //存在等待状态时,必须先开启预取缓冲区
  72.                         if (maxFreq <= 24)
  73.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
  74.                         else if (maxFreq <= 48)
  75.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
  76.                         else
  77.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
  78.                        
  79.                         RCC->CR |= 1<<24;                   //PLLON
  80.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪
  81.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
  82.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪
  83.                         break;
  84.         }
  85.        
  86.         return 0;
  87. }

  88. /**
  89.   * <b>芯片上电默认时钟配置。</b>
  90.   * <p>功能:用来恢复时钟系统到上电默认状态。
  91.   * @version                1.1.0.0(20140228)
  92.   * <p-2014>实现CM0与CM3兼容完成!
  93.   * @author             Dylan
  94.   */
  95. void HW_SystemPowerON(void)
  96. {
  97. #if defined  (STM32F051) || defined  (STM32F042)
  98.         RCC->CR |= 0x00000001;//HSION

  99.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */

  100.         RCC->CFGR &= 0x0000000C;/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0],PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */

  101.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置

  102.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */

  103.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */

  104.         RCC->CIR = 0x00000000;/* Disable all interrupts */

  105. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  106.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪

  107.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2

  108.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志

  109.         //配置向量表
  110.         #ifdef  VECT_TAB_RAM
  111.         /* Set the Vector Table base location at 0x20000000 */
  112.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  113.         #else  /* VECT_TAB_FLASH  */
  114.         /* Set the Vector Table base location at 0x08000000 */
  115.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  116.         #endif
  117. #else
  118.         #warning "Make sure needn't define STM32F051 etc. ?"
  119. #endif
  120. }
复制代码


评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

Dylan疾风闪电 回答时间:2016-5-18 16:23:54
对于一般的应用,可以不焊HSE。
即使是USB的应用,也可以通过HSI倍频PLL到48MHz,来使用。(DEMO板测试正常)
这段代码我从2010年开始用到现在了,每次换MCU也只是对其进行局部调整#if
希望对你有帮助~~
Dylan疾风闪电 回答时间:2016-5-18 16:26:35
使用我的时钟初始化,将defined  (STM32F042) 替换成defined  (STM32F072)就可以了。
huaiqiao 回答时间:2016-5-18 17:13:29
像这个072的 discovery的板子是不带HSE的,除非楼主您自己焊接。
估计如果跑例程的话,他自带的是HSI了。这个要看时钟树了

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

zcl201207 回答时间:2016-5-18 23:28:28
zhenweiaaa 回答时间:2020-8-28 17:41:30
谢谢lz

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版