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

关於时钟设置 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

查看全部评分

wolfgang2015 回答时间: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
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版