首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用Cube库控制STM32F3 GPIOs

不使用Cube库控制STM32F3 GPIOs
EN

Stack Overflow用户
提问于 2021-04-12 11:40:05
回答 1查看 321关注 0票数 1

我正在将这个引导加载程序用于STM32F373CC以适应我的设备。为了表明设备是供电的,但在引导加载模式下,我想打开一些状态LED。但是,这个引导加载程序不使用STM Cube MX库,所以我必须将其编码为低级代码。其中包括头文件stm32f373xc.h,因此我可以使用像GPIOB_BASE这样的表达式。

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

代码语言:javascript
复制
// 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的时钟问题,还是引脚配置问题?

我找到了这个类似的职位,但是第一个答案需要整个CMSIS,而第二个答案缺乏评论,所以我不完全理解他们在做什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 13:15:42

我希望你知道明渠输出需要拔起(内部或外部)。

使用CMSIS定义,而不是魔术数字和操作。

需要整个CMSIS

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

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

我不会检查你的魔法补偿和数字。

  1. 第一个错误:启用外围时钟后,您需要等待。“参考手册”对此作了说明。您不等待,您的第一次MODER操作没有任何影响。HAL宏读取寄存器以确保操作已经完成。

来自STM32L4的示例:

代码语言:javascript
复制
#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寄存器、类型和定义。

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67057709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档