OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3197|回复: 3

odr寄存器允许我单独访问某一位的这样的操作吗?

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-9-22
在线时间
5 小时
发表于 2020-10-17 16:30:46 | 显示全部楼层 |阅读模式
1金钱
  1. // 设置APB2总线的基地址
  2. #define APB2_BASE ((uint32)0x40010000)

  3. // 通过APB2总线基地址偏移量设置GPIOA~E的基地址
  4. #define GPIOA_BASE (APB2_BASE+0x0800)
  5. #define GPIOB_BASE (APB2_BASE+0x0C00)
  6. #define GPIOC_BASE (APB2_BASE+0x1000)
  7. #define GPIOD_BASE (APB2_BASE+0x1400)
  8. #define GPIOE_BASE (APB2_BASE+0x1800)

  9. typedef unsigned int uint32;
  10. typedef unsigned short uint16;
  11. typedef unsigned char uchar;

  12. // 定义一个结构体,前16位对应16个脚的输出
  13. typedef struct{
  14.         uchar odr0:1;
  15.         uchar odr1:1;
  16.         uchar odr2:1;
  17.         uchar odr3:1;
  18.         uchar odr4:1;
  19.         uchar odr5:1;
  20.         uchar odr6:1;
  21.         uchar odr7:1;
  22.         uchar odr8:1;
  23.         uchar odr9:1;
  24.         uchar odr10:1;
  25.         uchar odr11:1;
  26.         uchar odr12:1;
  27.         uchar odr13:1;
  28.         uchar odr14:1;
  29.         uchar odr15:1;
  30.         uint16 size_a_seat;
  31. }GpioOut;

  32. #define GPIOA_OUT ((GpioOut*)GPIOA_BASE+0x0C)// 把odr寄存器的基地址强制类型转换成为结构体指针
  33. #define GPIOB_OUT ((GpioOut*)GPIOB_BASE+0x0C)
  34. #define GPIOC_OUT ((GpioOut*)GPIOC_BASE+0x0C)
  35. #define GPIOD_OUT ((GpioOut*)GPIOD_BASE+0x0C)
  36. #define GPIOE_OUT ((GpioOut*)GPIOE_BASE+0x0C)
复制代码
我实验了一下,这样的代码能编译通过但好像并没有成功操作到odr的每一位。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-9-22
在线时间
5 小时
 楼主| 发表于 2020-10-17 16:32:13 | 显示全部楼层
这样的办法可行吗?如果不可行,有什么替代办法吗?
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-18 11:20:45 | 显示全部楼层
用宏定义位地址试试
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2020-10-19 15:16:50 | 显示全部楼层
别的地方不知道,这里肯定不对 #define GPIOA_OUT ((GpioOut*)GPIOA_BASE+0x0C)
指针加法和整数加法的效果不一样 比如 (int32_t *)(0) +1 和 0+1 结果就不一样
改成 #define GPIOA_OUT ((GpioOut*)(GPIOA_BASE+0x0C))这样试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 16:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表