微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在没有 Cube MX 库的情况下控制 STM32F3 GPIO

如何解决在没有 Cube MX 库的情况下控制 STM32F3 GPIO

我正在为 this bootloader 调整 STM32F373CC 以适应我的设备。为了指示设备已通电但处于引导加载程序模式,我想打开一些状态 LED。但是,此引导加载程序不使用 STM Cube MX 库,因此我必须对其进行低级编码。包含头文件stm32f373xc.h,所以我可以使用GPIOB_BASE之类的表达式。

我在 main() 中尝试了以下第一件事,但不幸的是它不起作用:

// turn on GPIOB clock: SET_BIT(RCC->AHBENR,RCC_AHBENR_GPIOBEN);
uint32_t* rcc = (uint32_t*)RCC_BASE;
*(rcc+0x14) |= RCC_AHBENR_GPIOBEN;  // AHBENR is at offset 0x14

// configure Port B,pins 4 and 5 to GPIO,Open Drain,low.
uint32_t* gpiob = (uint32_t*)GPIOB_BASE;
*(gpiob) |= 0x500; // GPIO output mode --- GPIOB_MODER = 0x500; (bits 11:8 = 0101),offset 0
*(gpiob) &= ~0xA00;
*(gpiob+0x04) |= 0x30;   // output type open drain --- GPIOB_OTYPER = 0x30; (bits 5:4 = 11),offset 0x04
*(gpiob+0x0c) &= ~0xF00; // pull up/down off --- GPIOB_PUPDR = 0x0; (bits 11:8 = 0000),offset 0x0c
*(gpiob+0x14) &= ~0x30;  // output low --- GPIOB_ODR = 0x0; (bits 5:4 = 00),offset 0x14

知道我缺少什么吗?如何确定问题是端口 B 的时钟问题还是引脚配置问题?

我找到了 this similar post,但第一个答案需要整个 CMSIS,而第二个答案缺少注释,所以我不完全理解他们在做什么。

解决方法

我希望你知道开漏输出需要上拉(内部或外部)

使用 CMSIS 定义,而不是幻数和运算。

需要整个 CMSIS

问题是什么? CMSIS 不会给您的代码增加任何开销,只会添加方便的定义和内联函数,如果不使用它们不会改变代码的大小。

此外,即使您不使用 HAL 库本身,HAL 也有非常方便的宏(它也不会增加一个字节的代码大小)

我不会检查你的神奇偏移量和数字。

  1. 第一个错误:启用外设时钟后,您需要等待。它在参考手册中有描述。您无需等待,您的第一个 MODER 操作将无效。 HAL 宏读回寄存器以确保操作已完成。

来自 STM32L4 的示例:

#define __HAL_RCC_GPIOB_CLK_ENABLE()           do { \
                                                 __IO uint32_t tmpreg; \
                                                 SET_BIT(RCC->AHB2ENR,RCC_AHB2ENR_GPIOBEN); \
                                                 /* Delay after an RCC peripheral clock enabling */ \
                                                 tmpreg = READ_BIT(RCC->AHB2ENR,RCC_AHB2ENR_GPIOBEN); \
                                                 UNUSED(tmpreg); \
                                               } while(0)

然后使用 CMSIS 寄存器类型定义和定义。

#define PIN4    4
#define PIN5    5

GPIOB -> MODER &= ~((0b11 << (2 * PIN5)) | (0b11 << (2 * PIN4)));  
GPIOB -> MODER |= ((0b01 << (2 * PIN5)) | (0b01 << (2 * PIN4)));  
GPIOB -> OTYPER &= ~((1 << PIN4) | (1 << PIN5));
GPIOB -> OTYPER |= (1 << PIN4) | (1 << PIN5);
GPIOB -> BSRR = (1 << (PIN4 + 16)) | (1 << (PIN5 + 16));  // set the pins low

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?