你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
joyfour 提问时间:2017-2-22 16:45 /
本人初学STM32F7,想通过GPIO口点亮LED灯做个试验。

代码如下:
  1. #define RCC (0x40023800)
  2. #define GPIOC (0x40020800)
  3.        
  4. #define GPIOC_MODER *(unsigned int*)(GPIOC+0x00)
  5. #define GPIOC_OTYPER *(unsigned int*)(GPIOC+0x04)
  6. #define GPIOC_OSPEEDR *(unsigned int*)(GPIOC+0x08)
  7. #define GPIOC_PUPDR *(unsigned int*)(GPIOC+0x0C)
  8. #define GPIOC_ODR *(unsigned int*)(GPIOC+0x14)
  9.        
  10. #define RCC_AHB1ENR *(unsigned int*)(RCC+0x30)
  11. #define RCC_AHB1RSTR *(unsigned int*)(RCC+0x10)

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

请问我的操作出现了什么问题?希望大神不吝赐教!
收藏 2 评论10 发布时间:2017-2-22 16:45

举报

10个回答
joyfour 回答时间:2017-2-22 22:31:43
问题解决。
不用调试器就行了。
参考:http://www.keil.com/support/docs/3778.htm
感谢上面两位的帮助,就此结贴。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

joyfour 回答时间:2017-2-22 16:48:20
代码重发:
  1. #define RCC (0x40023800)
  2. #define GPIOC (0x40020800)
  3.        
  4. #define GPIOC_MODER (*(unsigned int*)(GPIOC+0x00))
  5. #define GPIOC_OTYPER (*(unsigned int*)(GPIOC+0x04))
  6. #define GPIOC_OSPEEDR (*(unsigned int*)(GPIOC+0x08))
  7. #define GPIOC_PUPDR (*(unsigned int*)(GPIOC+0x0C))
  8. #define GPIOC_ODR (*(unsigned int*)(GPIOC+0x14))
  9.        
  10. #define RCC_AHB1ENR (*(unsigned int*)(RCC+0x30))
  11. #define RCC_AHB1RSTR (*(unsigned int*)(RCC+0x10))

  12. int main(){
  13.         RCC_AHB1ENR |= 1<<2; //打开GPIOC时钟
  14.        
  15.   GPIOC_MODER |= 1<<14; //设置GPIOC_PIN7为输出模式
  16.         GPIOC_ODR |= 1<<7; //GPIOC_PIN7置高
  17.        
  18.         while(1);
  19. }
复制代码
cruelfox 回答时间:2017-2-22 18:43:17
很常见的问题。
RCC_AHB1ENR |= 1<<2; 将GPIOC的时钟打开,然后紧接着  GPIOC_MODER |= 1<<14; 就操作了GPIOC的寄存器,两次对AHB总线的访问靠得太近了。也就是说RCC修改要延迟一下,还没来得及把GPIOC激活,就对GPIOC的MODER发出了读写请求,导致没读或写成功。
在两条语句中间插一条 __NOP();  或者  __DMB();  等待一下。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zoomdy 回答时间:2017-2-22 19:08:59
调试的时候总会发现 PC指向 0x1ff0xxxx,而没有在我设置的断点处中断。调试后RESET,PC固定指向0x1ff00210。

0x1ff0xxxx是System memory区域。
2017-02-22 19:07:40的屏幕截图.png

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

joyfour 回答时间:2017-2-22 20:47:33
cruelfox 发表于 2017-2-22 18:43
很常见的问题。
RCC_AHB1ENR |= 1

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

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

谢谢分享  !
请叫我小张张 回答时间:2017-2-24 17:45:52
谢谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版