STM32上的GPIO输出寄存器

2019-07-14 17:23发布

嗨我目前正在尝试使用基于STM32F334R8的STM32 Nucleo开发板编写一个简单的程序。应用程序设置GPIO端口A和C,并读取按钮的状态。如果按下按钮,则会打开LED。如果没有,它会将其关闭。从ST的文档(STM Nucleo 64)我已经确认按钮连接到引脚C13,LED2连接到引脚A5。从数据表中,我一直在阅读GPIO寄存器(Long STM32F334数据表),看看有三个似乎与输出有关; ODR,BSRR和BRR。在实现上述应用时,我首先想到的是使用ODR为输出LED写入GPIO引脚状态,如下所示:SET_BIT(GPIOA->ODR, GPIO_ODR_5);CLEAR_BIT(GPIOA->ODR, GPIO_ODR_5);
这似乎不起作用。检测到我的按钮被按下,因为我可以通过看到它按照不同的路径在调试器中验证这一点。这是我的GPIO设置代码:
  1. // set one to input
  2. CLEAR_BIT(GPIOC->MODER, GPIO_MODER_MODER13_0);
  3. CLEAR_BIT(GPIOC->MODER, GPIO_MODER_MODER13_1);
  4. // set another to output
  5. SET_BIT(GPIOA->MODER, GPIO_MODER_MODER5_0);
  6. CLEAR_BIT(GPIOA->MODER, GPIO_MODER_MODER5_1);
  7. // set output to push-pull
  8. CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_5);
  9. // set input with pull-up
  10. SET_BIT(GPIOC->PUPDR, GPIO_PUPDR_PUPDR13_1);
  11. CLEAR_BIT(GPIOC->PUPDR, GPIO_PUPDR_PUPDR13_0);

  12. // enable GPIOA and GPIOC clock
  13. SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN);
  14. SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOCEN);
复制代码我还看到了一块在我的主板上使用BSRR和BRR位的示例代码,如下所示:
  1. // set output high
  2. SET_BIT(GPIOA->BSRR, GPIO_BSRR_BS_5);
  3. // set output low
  4. SET_BIT(GPIOA->BRR, GPIO_BRR_BR_5);
复制代码
....但这不起作用。我不确定我理解三个寄存器及其功能之间的区别。每个用例有哪些?哪一个适合我的要求?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
gdfffa
1楼-- · 2019-07-15 00:44
你是对的,将时钟设置移动到该功能的顶部解决了问题并且应用程序正常工作!我没想到需要首先启用时钟,因为我认为它们只会控制引脚的采样,而不能完全启用外设。谢谢!
芯联天下
2楼-- · 2019-07-15 04:45
给楼主顶一顶。

一周热门 更多>