打印
[STM32F0]

STM32F030F4使用内部时钟不工作的问题

[复制链接]
7752|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzhiyang|  楼主 | 2015-11-22 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前使用的是外部时钟,但遇到一个问题,用对讲机在旁边通话的时候,芯片就死掉了,我在里面加了开门狗,连看门狗都不起作用了,问了下FAE,说改成片内晶振看看,我修改如下:
void SystemInit (void)
{   
  RCC->CR |= (uint32_t)0x00000001;    /*HSI振荡器开启*/
  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */
  RCC->CFGR &= (uint32_t)0x08FFB80C;
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
  /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  RCC->CFGR &= (uint32_t)0xFFC0FFFF;
  /* Reset PREDIV1[3:0] bits */
  RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
  /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
  RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
  /* Reset HSI14 bit */
  RCC->CR2 &= (uint32_t)0xFFFFFFFE;
  /* Disable all interrupts */
  RCC->CIR = 0x00000000;
  /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  SetSysClock();
}

static void SetSysClock(void)
{
    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK/4 */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV4;
      
    /* PCLK = HCLK/4 */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV4;
    /* PLL configuration */
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
            
    /* 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)RCC_CFGR_SWS_PLL)
    {
    }
}

但这样修改之后,烧到芯片里面去,拿掉之前8M的晶振,芯片怎么都不工作,需要拿掉晶振脚上的电容吗?
还请高手指点下!

沙发
it_yrj| | 2015-12-20 12:30 | 只看该作者
首先确认下技术支持给的方案有没有道理
再次确认初始化内部晶振是否正确,建议还是再捋下代码

使用特权

评论回复
板凳
it_yrj| | 2015-12-28 22:28 | 只看该作者
今天试了下内部晶振,发现死在了
/* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
不知是什么原因?楼主解决了没

使用特权

评论回复
地板
289947679| | 2016-1-20 09:34 | 只看该作者
我也试过用内部时钟,可以做到,只改static void SetSysClock(void)

使用特权

评论回复
5
289947679| | 2016-1-20 09:36 | 只看该作者
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
        //RCC->CR |= ((uint32_t)RCC_CR_HSION);//使用内部8M时钟

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
                //HSEStatus = RCC->CR & RCC_CR_HSIRDY;//
    StartUpCounter++;  
  }
        //while((HSEStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
        while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

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

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
                //RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL9);
                //RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12);
            有//的是内部8M

使用特权

评论回复
6
小明飞飞飞| | 2017-6-7 09:24 | 只看该作者
5楼,你这setsysclok()函数是设置HSI内部时钟做systemclock

使用特权

评论回复
7
小明飞飞飞| | 2017-6-7 09:28 | 只看该作者
5楼,你这setsysclok()函数是设置HSI内部时钟做systemclock时钟吗?倍频之后的sysclock是多少M的呢?如何调用到usart,设置波特率呢??

使用特权

评论回复
8
viseng| | 2017-6-7 10:24 | 只看该作者
289947679 发表于 2016-1-20 09:36
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

//RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12);这个使用HSI使PLL输入,RCC_CFGR_PLLXTPRE_PREDIV1似乎可以不用吧?

使用特权

评论回复
9
viseng| | 2017-6-7 10:25 | 只看该作者
楼主,问题解决了吗?能分享下使用外部晶振死掉是因为干扰原因?有解决干扰问题吗?

使用特权

评论回复
10
viseng| | 2017-6-7 10:34 | 只看该作者
楼主如果可以接受内部时钟源,其实可以做个自动跳转的,如果HSE不稳定,再可以跳转到HSI
在  if (HSEStatus == (uint32_t)0x01)块中加else处理,在else中去打末HSI,这样是个两全的方案
当然如果设计要求上如果HSI精度满足不了,至少可以给出故障提示,或通过串口给出故障提示码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

190

帖子

2

粉丝