首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程类似于STM32的STM8 (寄存器级GPIO)

编程类似于STM32的STM8 (寄存器级GPIO)
EN

Stack Overflow用户
提问于 2019-02-17 16:31:00
回答 1查看 9.1K关注 0票数 2

我像STM8一样编写了GPIO程序,但是stm32f10x.h没有这个功能。是否有任何有位定义的.h文件?

对不起,但我不知道如何更好地解释这个问题。

我尝试了多个GPIO库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-18 10:58:10

您在问题中提到了stm32f10x.h,所以我假设它是关于STM32F1系列控制器的。其他系列也有一些不同之处,但一般程序是一样的。

GPIO引脚被安排在16个称为端口的银行中,每个端口都有自己的一组控制寄存器,名为GPIOAGPIOB等。它们被定义为指向GPIO_TypeDef结构的指针。有3个控制寄存器影响引脚输出。

写入ODR将所有16个引脚同时设置,例如GPIOB->ODR = 0xF00F通过B3设置引脚B0,通过B15设置引脚为1,通过B11B4设置为0,而不管它们以前的状态如何。我们可以编写GPIOD->ODR |= (1<<4)来将pin GPIOD4设置为1,也可以编写GPIOD->ODR &= ~(1<<4)来重置它。

编写BSRR将写入的值视为两个位掩码。低半字为设置掩码,值为1的位将ODR中的对应位设置为1,高半字为复位掩码,值为1的位将ODR中的对应位设置为0。GPIOC->BSRR = 0x000701E0将通过C8将引脚C5设置为1,通过C2C0重置为0,并保留所有其他端口位。在编写BSRR时,尝试同时设置和重置相同的位,然后将其设置为1。

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

现在可以编写一些宏,例如

代码语言:javascript
复制
#define GPIOD_OUT(pin, value) GPIOD->BSRR = ((0x100 + value) << pin)
#define GPIOD4_OUT(value) GPIOD_SET(4, value)

改变单个引脚,但它不像它可能是灵活的,例如,你不能获取一个单一引脚的地址,并传递它的变量。

位带状

Cortex控制器(不是所有的控制器,但STM32F1系列都有)具有这样的特性,使内部内存和硬件寄存器中的单个位可寻址。0x40000000-0x400FFFFF范围中的每个位都映射到0x42000000-0x43FFFFFF范围内的一个完整的32位字。它不适用于此地址范围以外的外围设备,如USB或N维也纳。

可以使用此宏计算外围寄存器的位带地址。

代码语言:javascript
复制
#define BB(reg) ((uint32_t *)(PERIPH_BB_BASE + ((uint32_t)&(reg) - PERIPH_BASE) * 32U))

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

代码语言:javascript
复制
#define PD_ODR_ODR4 (BB(GPIOD->ODR)[4])

并在作业中使用。读取它将提供0或1作为它的值,写入它的值将写入值中最不重要的位复制到外围寄存器位。您甚至可以获取它的地址,并将其传递给一个使用引脚执行某些操作的函数。

位显带记录在PM0056 Cortex-M3编程手册中。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54735239

复制
相关文章

相似问题

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