STM32 GPIO寄存器电平输入

STM32 GPIO register level input

其实就是一个用led控制蜂鸣器的基本代码。我使用 HAL libraries.But 与我合作的机构也想在寄存器级别执行此操作。但我做不到。它不是太复杂但是我不明白问题出在哪里。 我的代码在下面。

    #include "stm32f10x.h"
void SystemCoreClockConfigure(void) 
{
    RCC->CR |= ((uint32_t)RCC_CR_HSION);                     // Enable HSI
  while ((RCC->CR & RCC_CR_HSIRDY) == 0);                  // Wait for HSI Ready

  RCC->CFGR = RCC_CFGR_SW_HSI;                             // HSI is system clock
  while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI);  // Wait for HSI used as system clock

  FLASH->ACR  = FLASH_ACR_PRFTBE;                          // Enable Prefetch Buffer
  FLASH->ACR |= FLASH_ACR_LATENCY;                         // Flash 1 wait state

  RCC->CFGR |= RCC_CFGR_HPRE_DIV1;                         // HCLK = SYSCLK
  RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;                        // APB1 = HCLK/2
  RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;                        // APB2 = HCLK

  RCC->CR &= ~RCC_CR_PLLON;                                // Disable PLL

 // PLL configuration:  = HSI/2 * 12 = 48 MHz
  RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL);
  RCC->CFGR |=  (RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);

  RCC->CR |= RCC_CR_PLLON;                                 // Enable PLL
  while((RCC->CR & RCC_CR_PLLRDY) == 0) __NOP();           // Wait till PLL is ready

  RCC->CFGR &= ~RCC_CFGR_SW;                               // Select PLL as system clock source
  RCC->CFGR |=  RCC_CFGR_SW_PLL;
  while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);  // Wait till PLL is system clock src
}

这是第一个振荡器激活part.I直到main函数才知道没有问题。 主要:

    int main(void)
    {

        SystemCoreClockUpdate();
        SysTick_Config(SystemCoreClock / 1000);     
        RCC->APB2ENR |= (1UL << 2);                /* Enable GPIOA clock            */
        RCC->APB2ENR |= (1UL << 4);                /* Enable GPIOC clock            */  

    //  Configure the GPIO Buttons 
    GPIOA->CRL   = 0x00000044;  //1SET    // GPIOA -> 0,1    
    GPIOC->CRL   = 0x00004400;  //3SET    // GPIOC -> 3,2   

    while (1)
  { 
    if(GPIOA->IDR == 0x0000003) // PA1 ON (Led4) //
    {
        GPIOC->CRH   = 0x00000002;  //  BUZZER SET 
        GPIOC->BSRR  = 0x00000100;  //  BUZZER ON
    }
  } 
 }

我正在使用 keil,我知道如果我只在 GPIOC->CRL = 0x00004400; //3SET // GPIOC -> 3,2 它 working.But 带有 GPIO->IDR(输入数据注册)按钮的读取输入。它不是切换或任何我不 know.I 已经被困在这里一个星期了,这真的很烦人。帮帮我!?

您的 while 循环中的代码完全错误!

while(1)
{
   if((GPIOA->IDR & 0x02) == 0x02) // 0x02 = 0b10 = PA1 (LED4)
   {
      GPIOC->BSRR = 0x100; // ON
   }
   else
   {
      GPIOC->BSRR = (0x100 << 16); // OFF
   }
}

并且还在 while 循环之前仅设置一次 GPIOC->CRH 寄存器。