【问题标题】:Reading IDR on STM32F411 Board在 STM32F411 板上读取 IDR
【发布时间】:2020-08-01 15:22:52
【问题描述】:

我目前正在尝试自己学习如何在寄存器级别对这些微控制器进行编程,但我刚刚走到了死胡同

我想要完成的事情非常简单。基本上,我拥有的 STM32F411 板在引脚 A5 上映射了一个 LED,在引脚 C13 上映射了一个按钮

我正在尝试制作一个简单的 LED 闪烁程序,其中 A5 上的 LED 会在按下按钮时亮起,在按下按钮时熄灭

现在,只要我加载我的程序,LED 就会亮起,但无论我按下多少次按钮,它的状态都不会改变

如果有人可以在这里给我任何见解,我将不胜感激:C

我在下面发布我的代码

#include "stm32f4xx.h"

/*
NOTES

USER LED IS ON PIN A5
USER BUTTON IS ON PIN C13

*/
uint8_t var=0;

int main(){


    RCC->AHB1ENR |=(1<<0); //Clock on port A
    RCC->AHB1ENR |=(1<<2); //Clock on port C

    //PORT A PIN 5 Config
    /*
        00: Input (reset state)
    01: General purpose output mode
    10: Alternate function mode
    11: Analog mode
    */
    GPIOA->MODER |= ~(1<<11);
    GPIOA->MODER |= (1<<10);
    GPIOA->OSPEEDR |= ((1<<11)|(1<<10));


    //PORT C PIN 13 Config
    /*
        00: Input (reset state)
    01: General purpose output mode
    10: Alternate function mode
    11: Analog mode
    */
    GPIOC->MODER |= ~(1<<27);
    GPIOC->MODER |= ~(1<<26);
    GPIOC->OSPEEDR |= ((1<<27)|(1<<26));
    GPIOC->PUPDR |= (1<<27);
    GPIOC->PUPDR |= ~(1<<26);

    while(1)
    {
        var = GPIOC->IDR;

        if(var==0)
        {
         GPIOA->BSRR = (1<<5);
        }       
        else
        {
         GPIOA->BSRR = 1<<(5+16);
        }

    }

}

提前谢谢你!

【问题讨论】:

  • 首先停止使用幻数。使用 stm 提供的定义。它使代码人性化
  • 幻数没有任何问题,这些数字没有任何魔力,它们直接来自芯片文档,因此是正确的。
  • var = GPI0C->IDR & (1
  • 你不需要弄乱 OSPEEDR,重置值适合你正在做的事情。否则看起来很好

标签: microcontroller stm32 stm32f4discovery


【解决方案1】:

这是错误的GPIOC-&gt;PUPDR |= ~(1&lt;&lt;26); 它没有清除第 26 位。你需要&amp;=

这也是错误的

    var = GPIOC->IDR;

    if(var==0)
    {

您需要屏蔽正确的位。 我没有检查幻数的正确性

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2020-11-24
    • 2012-12-29
    • 1970-01-01
    • 2016-11-14
    • 2022-11-23
    • 2018-08-30
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多