HK32F030C8T6把OSC_IN和OSC_OUT作为普通的IO口使用

这篇博客讲述了在STM32微控制器中,如何将OSC_IN和OSC_OUT引脚从外部晶振模式转换为普通GPIO输出模式。通过初始化GPIO结构体并修改SystemInit()和SetSysClock()函数,禁用外部晶振,使得GPIO输出达到预期的3.3V高电平。这一过程对于在不需要外部晶振的情况下利用这些引脚作为通用输入输出非常有用。
摘要由CSDN通过智能技术生成

1.将OSC_IN和OSC_OUT初始化相应的模式

    GPIO_InitStructure.GPIO_Pin = CSB_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(CSB_GPIO_PORT, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = RSTB_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_Init(RSTB_GPIO_PORT, &GPIO_InitStructure);

2.这样配置完之后发现GPIO输出的高电平电压完全达不到3.3V。原因是我们在初始化systemclock时,把外部晶振也初始化了。所以我们只需要把外部晶振不使能,就可以把OSC_IN和OSC_OUT当作普通的IO口使用了。

  1. 打开函数 SystemInit();
  2. 就会看到
    void SystemInit (void)
    {    
      /* Set HSION bit */
      RCC->CR |= (uint32_t)0x00000001;
    
      /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
      RCC->CFGR &= (uint32_t)0xF8FFB80C;
      
      /* 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();
    }

  3. 打开SetSysClock();并把 RCC->CR |= ((uint32_t)RCC_CR_HSEON) 修改为RCC->CR &= ~((uint32_t)RCC_CR_HSEON);

    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);
      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;
      }  
    
      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 */
        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);
                
        /* 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)
        {
        }
      }
      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 */
      }  
    }

4.完成这样的步骤就可以把OSC_IN和OSC_OUT当作IO口使用了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值