【发布时间】:2021-11-03 20:21:48
【问题描述】:
我刚开始学习嵌入式系统,但在我的 stm32f746ng-discovery 板上正确设置 LED 引脚时遇到了一些麻烦。我不确定我的类型转换是否正确或引脚的地址错误,但是,我相信我已经正确处理了所有内容,并且我没有在监视窗口中看到导致我的 GPIO 输出数据寄存器的值变化相信我的代码可能有问题。
为了定义寄存器及其各自的地址,这是我采用的方法:
//Referring to STM32F746xx Memory Map and Register Boundary Addresses:
#define PERIPH_BASE (0x40000000UL)
#define AHB1PERIPH_OFFSET (0x00020000UL)
#define AHB1PERIPH_BASE (PERIPH_BASE + AHB1PERIPH_OFFSET)
#define GPIOI_OFFSET (0x2000UL)
#define GPIOI_BASE (AHB1PERIPH_BASE + GPIOI_OFFSET)
#define RCC_OFFSET (0x3800UL)
#define RCC_BASE (AHB1PERIPH_BASE + RCC_OFFSET)
#define RCC_AHB1EN_R_OFFSET (0x30UL)
#define RCC_AHB1EN_R (*(volatile unsigned int *)(RCC_BASE + RCC_AHB1EN_R_OFFSET)) //register
#define MODE_R_OFFSET (0x00UL)
#define GPIOI_MODE_R (*(volatile unsigned int *)(GPIOI_BASE + MODE_R_OFFSET)) //register
#define OD_R_OFFSET (0x14UL)
#define GPIOI_OD_R (*(volatile unsigned int *)(GPIOI_BASE + OD_R_OFFSET)) //register
#define GPIOIEN (1U << 0)
#define PIN_1 (1U << 1)
#define LED_PIN PIN_1
上述十六进制地址是我从 stm32f746xx 数据表的内存映射/表和 stm32f74xxx 的 RM0385 参考手册中找到的。
下面的代码是我尝试更改GPIOI_OD_R寄存器的位值的主要功能:
int main(void)
{
/* 1. Enable clock access for GPIOI.*/
/* 1.1 I use the OR operator to only change the first bit instead of the whole 32bit chain. */
RCC_AHB1EN_R |= GPIOIEN;
/* 2. Sets PIN_1 as output.*/
GPIOI_MODE_R |= (1U << 2);
GPIOI_MODE_R &=~(1U << 3);
while(1)
{
/* 3. Sets PIN_1 high */
GPIOI_OD_R |= LED_PIN;
}
}
我遇到的问题是 GPIOI_OD_R 寄存器的位值未正确更新并设置为 00 而不是 01,这是 GPIOI Pin_1 (LED) 设置为通用目的所需的值输出模式。
以上参数是我从stm32f74xxx的RM0385参考手册中得到的,如下图所示:
但是,在运行代码时,GPIOI_MODE_R 和 GPIOI_OD_R 位的值不会改变,如下图所示:
我需要正确的寄存器值才能将我的 stm32f746ng-discovery 板上的 LED PIN 设置为高电平。
我尝试将 GPIOI_MODE_R 设置操作合并为一个操作:GPIOI_MODE_R = (GPIOI_MODE_R | (1U << 2)) & ~(1U << 3),但这会导致程序与调试器的连接松动。
我正在使用带有以下 MCU GCC 编译器设置的 STM32CubeIDE:
提前致谢,如果引用不正确,请原谅我是嵌入式系统的新手。
【问题讨论】: