STM32 GPIO寄存器电平输入

时间:2018-02-10 21:53:25

标签: arm embedded stm32 gpio keil

它实际上是用LED控制蜂鸣器的基本代码。我使用了HAL库。但我所在的机构也希望在寄存器级别这样做。但我不能。它并不复杂,但我不明白问题所在。 我的代码在下面。

    #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
}

这是第一个振荡器激活部分。我知道在主要功能之前没有问题。 主要:

    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-&gt; CRL = 0x00004400; // 3SET // GPIOC - &gt; 3,2  它正在工作。但是带有GPIO-> IDR(输入数据注册)按钮的读数输入它没有切换或我不知道的任何东西。我被卡住了这里待了一个星期,真的很烦人。帮助我!?

1 个答案:

答案 0 :(得分:0)

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寄存器设置一次。