我像STM8一样编写了GPIO程序,但是stm32f10x.h没有这个功能。是否有任何有位定义的.h文件?
对不起,但我不知道如何更好地解释这个问题。
我尝试了多个GPIO库。
发布于 2019-02-18 10:58:10
您在问题中提到了stm32f10x.h,所以我假设它是关于STM32F1系列控制器的。其他系列也有一些不同之处,但一般程序是一样的。
GPIO引脚被安排在16个称为端口的银行中,每个端口都有自己的一组控制寄存器,名为GPIOA、GPIOB等。它们被定义为指向GPIO_TypeDef结构的指针。有3个控制寄存器影响引脚输出。
写入ODR将所有16个引脚同时设置,例如GPIOB->ODR = 0xF00F通过B3设置引脚B0,通过B15设置引脚为1,通过B11将B4设置为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,通过C2将C0重置为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控制器(不是所有的控制器,但STM32F1系列都有)具有这样的特性,使内部内存和硬件寄存器中的单个位可寻址。0x40000000-0x400FFFFF范围中的每个位都映射到0x42000000-0x43FFFFFF范围内的一个完整的32位字。它不适用于此地址范围以外的外围设备,如USB或N维也纳。
可以使用此宏计算外围寄存器的位带地址。
#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作为它的值,写入它的值将写入值中最不重要的位复制到外围寄存器位。您甚至可以获取它的地址,并将其传递给一个使用引脚执行某些操作的函数。
位显带记录在PM0056 Cortex-M3编程手册中。
https://stackoverflow.com/questions/54735239
复制相似问题