工控BLUCK 2021-11-04 19:51 采纳率: 78.3%
浏览 33
已结题

stm32寄存器问题?

下面讲的有几点不懂:1 代码5-2中“GPIOH_BASE+0x14”怎么得来的?2 代码5-2和5-3差一个*号,是不是代码5-2少写了?
比如,我们找到 GPIOH 端口的输出数据寄存器 ODR 的地址是 0x4002 1C14(至于这
个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是 32bit,低 16bit
有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指
针的操作方式,让 GPIOH 的 16 个 IO 都输出高电平,具体见代码 5-1。
代码 5-1 通过绝对地址访问内存单元

1 // GPIOH 端口全部输出 高电平
2 *(unsigned int*)(0x4002 1C14) = 0xFFFF;

0x4002 1C14 在我们看来是 GPIOH 端口 ODR 的地址,但是在编译器看来,这只是一
个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,
把它转换成指针,即(unsigned int *)0x4002 1C14,然后再对这个指针进行 * 操作。
刚刚我们说了,通过绝对地址访问内存单元不好记忆且容易出错,我们可以通过寄存
器的方式来操作,具体见代码 5-2。
代码 5-2 通过寄存器别名方式访问内存单元

1 // GPIOH 端口全部输出 高电平
2 #define GPIOH_ODR   (unsigned int*)(GPIOH_BASE+0x14)
3 * GPIOH_ODR = 0xFF;

为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面,具体见代码 5-3。
代码 5-3 通过寄存器别名访问内存单元


1 // GPIOH 端口全部输出 高电平
2 #define GPIOH_ODR *(unsigned int*)(GPIOH_BASE+0x14)
3 GPIOH_ODR = 0xFF;
  • 写回答

3条回答 默认 最新

  • 有问必答小助手 2021-11-08 09:54
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月8日
  • 已采纳回答 11月8日
  • 创建了问题 11月4日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料