gpt4 book ai didi

c - 像STM8一样编程STM32(寄存器级GPIO)

转载 作者:行者123 更新时间:2023-12-04 14:53:11 30 4
gpt4 key购买 nike

我对 STM8 GPIO 进行了编程,如 PD_ODR_ODR4 = 1;,但 stm32f10x.h 没有此功能。是否有.h文件定义了位?

抱歉,我不知道如何更好地解释这个问题。

我尝试了多个 GPIO 库。

最佳答案

你提到 stm32f10x.h在问题中,所以我假设它是关于 STM32F1 系列 Controller 的。其他系列略有不同,但大体流程相同。

GPIO 引脚排列成 16 个称为端口的组,每个端口都有自己的一组控制寄存器,名为 GPIOA , GPIOB等。它们被定义为指向 GPIO_TypeDef 的指针。结构。影响管脚输出的控制寄存器有3个。

写作 ODR 一次设置所有 16 个引脚,例如GPIOB->ODR = 0xF00F设置引脚 B0通过B3B12通过B15到 1,和 B4通过B11到 0,无论他们以前的状态如何。可以写 GPIOD->ODR |= (1<<4)设置引脚 GPIOD4到 1,或 GPIOD->ODR &= ~(1<<4)重置它。

写作 BSRR 将写入的值视为两个位掩码。低半字是设置掩码,值为 1 的位设置 ODR 中的相应位。为 1。高半字是复位掩码,值为 1 的位设置 ODR 中的相应位。到 0。GPIOC->BSRR = 0x000701E0将设置引脚 C5虽然C8为 1,重置 C0通过C2为 0,并保留所有其他端口位。在写入 BSRR 时尝试设置和重置相同的位, 那么它将被设置为 1.

写作 BRR 与在 BSRR 中写入重置位掩码相同,即 GPIOx->BRR = x相当于GPIOx->BSRR = (x << 16) .

现在可以写一些宏了

#define GPIOD_OUT(pin, value) GPIOD->BSRR = ((0x100 + value) << pin)
#define GPIOD4_OUT(value) GPIOD_SET(4, value)

改变单个引脚,但它不像它应该的那样灵活,例如。您不能获取单个引脚的地址并在变量中传递它。

位带

Cortex-M Controller (不是所有 Controller ,但 STM32F1 系列 Controller 有)具有使内部 RAM 和硬件寄存器中的各个位可寻址的功能。 0x40000000-0x400FFFFF 中的每一位范围映射到 0x42000000-0x43FFFFFF 中的完整 32 位字范围。它不适用于此地址范围之外的外围设备,例如 USB 或 NVIC。

可以用这个宏计算外设寄存器的位带地址

#define BB(reg) ((uint32_t *)(PERIPH_BB_BASE + ((uint32_t)&(reg) - PERIPH_BASE) * 32U))

您可以将生成的指针视为包含 32 个字的数组的基数,每个字对应于外围寄存器中的一个位。现在可以

#define PD_ODR_ODR4 (BB(GPIOD->ODR)[4])

并在作业中使用它。读它会给出 0 或 1 作为它的值,写入它的值将写入值的最低有效位复制到外围寄存器位。您甚至可以获取它的地址,并将其传递给一个函数,该函数使用该 pin 执行某些操作。

PM0056 Cortex®-M3 编程手册中记录了位带。

关于c - 像STM8一样编程STM32(寄存器级GPIO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54735239/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com