joyfour 发表于 2017-2-22 16:45:29

STM32f7寄存器,无法正确设置的疑问

本人初学STM32F7,想通过GPIO口点亮LED灯做个试验。

代码如下:
#define RCC (0x40023800)
#define GPIOC (0x40020800)
       
#define GPIOC_MODER *(unsigned int*)(GPIOC+0x00)
#define GPIOC_OTYPER *(unsigned int*)(GPIOC+0x04)
#define GPIOC_OSPEEDR *(unsigned int*)(GPIOC+0x08)
#define GPIOC_PUPDR *(unsigned int*)(GPIOC+0x0C)
#define GPIOC_ODR *(unsigned int*)(GPIOC+0x14)
       
#define RCC_AHB1ENR *(unsigned int*)(RCC+0x30)
#define RCC_AHB1RSTR *(unsigned int*)(RCC+0x10)

int main(){运行结果是失败的。
经过调试发现,上述三个寄存器都没有正确设置成功。手动在调试时设置寄存器后,LED可以点亮。
另外,调试的时候总会发现 PC指向 0x1ff0xxxx,而没有在我设置的断点处中断。调试后RESET,PC固定指向0x1ff00210。
网上找到一个类似的问题 http://www.keil.com/forum/61975/。

请问我的操作出现了什么问题?希望大神不吝赐教!

joyfour 发表于 2017-2-22 22:31:43

问题解决。
不用调试器就行了。
参考:http://www.keil.com/support/docs/3778.htm
感谢上面两位的帮助,就此结贴。

joyfour 发表于 2017-2-22 16:48:20

代码重发:
#define RCC (0x40023800)
#define GPIOC (0x40020800)
       
#define GPIOC_MODER (*(unsigned int*)(GPIOC+0x00))
#define GPIOC_OTYPER (*(unsigned int*)(GPIOC+0x04))
#define GPIOC_OSPEEDR (*(unsigned int*)(GPIOC+0x08))
#define GPIOC_PUPDR (*(unsigned int*)(GPIOC+0x0C))
#define GPIOC_ODR (*(unsigned int*)(GPIOC+0x14))
       
#define RCC_AHB1ENR (*(unsigned int*)(RCC+0x30))
#define RCC_AHB1RSTR (*(unsigned int*)(RCC+0x10))

int main(){
        RCC_AHB1ENR |= 1<<2; //打开GPIOC时钟
       
GPIOC_MODER |= 1<<14; //设置GPIOC_PIN7为输出模式
        GPIOC_ODR |= 1<<7; //GPIOC_PIN7置高
       
        while(1);
}

cruelfox 发表于 2017-2-22 18:43:17

很常见的问题。
RCC_AHB1ENR |= 1<<2; 将GPIOC的时钟打开,然后紧接着GPIOC_MODER |= 1<<14; 就操作了GPIOC的寄存器,两次对AHB总线的访问靠得太近了。也就是说RCC修改要延迟一下,还没来得及把GPIOC激活,就对GPIOC的MODER发出了读写请求,导致没读或写成功。
在两条语句中间插一条 __NOP();或者__DMB();等待一下。

zoomdy 发表于 2017-2-22 19:08:59

调试的时候总会发现 PC指向 0x1ff0xxxx,而没有在我设置的断点处中断。调试后RESET,PC固定指向0x1ff00210。
0x1ff0xxxx是System memory区域。

joyfour 发表于 2017-2-22 20:47:33

cruelfox 发表于 2017-2-22 18:43
很常见的问题。
RCC_AHB1ENR |= 1

感谢!不过按照这个原理问题还在。由于没有找到<intrinis.h>文件,所以用这个来代替:
void delay(void){
        int i;
        for(i=0;i<1000;i++);
}

joyfour 发表于 2017-2-22 20:52:37

zoomdy 发表于 2017-2-22 19:08
0x1ff0xxxx是System memory区域。

多谢提醒。这个我注意到了,但我不明白为什么PC会指向system memory内。
板子的BOOT0、BOOT1都接GND了,启动方式应该也没有问题。

joyfour 发表于 2017-2-22 23:33:48

joyfour 发表于 2017-2-22 22:31
问题解决。
不用调试器就行了。
参考:http://www.keil.com/support/docs/3778.htm


现在发现这是歪打正着了,不过就这样吧...

creep 发表于 2017-2-23 09:02:36

joyfour 发表于 2017-2-22 22:31
问题解决。
不用调试器就行了。
参考:http://www.keil.com/support/docs/3778.htm


不用调试器你上面的程序能正常实现功能是吧。

xmshao 发表于 2017-2-23 11:50:10

joyfour 发表于 2017-2-22 22:31
问题解决。
不用调试器就行了。
参考:http://www.keil.com/support/docs/3778.htm


谢谢分享!
页: [1] 2
查看完整版本: STM32f7寄存器,无法正确设置的疑问