OpenEdv-开源电子网

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

IIC实验位带操作问题

[复制链接]

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-12-4 10:29:49 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 satine 于 2018-12-4 11:03 编辑

#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA         
这两个宏对应
IIC_SCL    =1可不可以表示GPIO_SetBits(GPIOB, GPIO_Pin_8)
IIC_SCL    =0可不可以表示GPIO_ResetBits(GPIOB, GPIO_Pin_8)

我感觉是一样的,为什么改了之后IIC实验不成功呢?求原子哥解答。谢谢

最佳答案

查看完整内容[请看2#楼]

GPIO_SetBits(GPIOB,8) 其中8应该修改为GPIO_Pin_8 要注意:标准库函数中,端口脚号统一用GPIO_Pin_X表示,没有单纯数字这种表示方法的。 这个不要问为什么? 王八的屁股--龟腚。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-4 10:29:50 | 显示全部楼层
GPIO_SetBits(GPIOB,8)
其中8应该修改为GPIO_Pin_8
要注意:标准库函数中,端口脚号统一用GPIO_Pin_X表示,没有单纯数字这种表示方法的。
这个不要问为什么? 王八的屁股--龟腚。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-12-4 11:02:30 | 显示全部楼层
warship 发表于 2018-12-4 10:52
GPIO_SetBits(GPIOB,8)
其中8应该修改为GPIO_Pin_8
要注意:标准库函数中,端口脚号统一用GPIO_Pin_X表示 ...

是的是的,我打错了。我的意思是可不可以用这两个函数替代位操作,毕竟输出电平高低MCU是可以控制的,输入电平没法控制。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-4 11:58:25 | 显示全部楼层
satine 发表于 2018-12-4 11:02
是的是的,我打错了。我的意思是可不可以用这两个函数替代位操作,毕竟输出电平高低MCU是可以控制的,输 ...

你一楼说的例子是可以相互代替的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-4 12:00:51 | 显示全部楼层
satine 发表于 2018-12-4 11:02
是的是的,我打错了。我的意思是可不可以用这两个函数替代位操作,毕竟输出电平高低MCU是可以控制的,输 ...

不过如果可能的话,请尽量使用位带操作,输入输出都是可以用的。
有兴趣看我的帖子http://www.openedv.com/forum.php?mod=viewthread&tid=274196
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-12-4 12:32:21 | 显示全部楼层
warship 发表于 2018-12-4 12:00
不过如果可能的话,请尽量使用位带操作,输入输出都是可以用的。
有兴趣看我的帖子http://www.openedv.c ...

好的呢感谢warship
回复

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2018-11-20
在线时间
23 小时
发表于 2018-12-4 13:40:29 | 显示全部楼层
标准库里似乎没有这样的操作,可以这样做的原因是,你自己写的宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //ê&#228;3&#246;
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ê&#228;è&#235;

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //ê&#228;3&#246;
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ê&#228;è&#235;

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //ê&#228;3&#246;
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ê&#228;è&#235;

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //ê&#228;3&#246;
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ê&#228;è&#235;

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  

这部分代码,正点原子的例程里,在sys。h中有
回复

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2018-11-20
在线时间
23 小时
发表于 2018-12-4 13:42:55 | 显示全部楼层
如果,你自己的代码,没有这样的宏定义,就不可以这样做,只能用GPIO_SetBits(GPIOB, GPIO_Pin_8)和GPIO_ResetBits(GPIOB, GPIO_Pin_8)
那种方法是将0和1写到寄存器里了。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-12-4 13:43:58 | 显示全部楼层
那是你宏定义写的不对。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-12-4 13:47:24 | 显示全部楼层
#define SCK   GPIO_Pin_11           //PA11
#define SDA   GPIO_Pin_12           //PA12

#define RS    GPIO_Pin_11           //PC11
#define RST   GPIO_Pin_10    //PC10
#define CS    GPIO_Pin_12          //PC12

#define LED   GPIO_Pin_8    //PG8

#define GPIO_SPI   GPIOA
#define GPIO_SPI1  GPIOC
#define GPIO_SPI2  GPIOG

#define LED_H   GPIO_SetBits(GPIO_SPI2,LED)
#define LED_L   GPIO_ResetBits(GPIO_SPI2,LED)

#define SPI_SCK_H  GPIO_SetBits(GPIO_SPI,SCK)
#define SPI_SCK_L  GPIO_ResetBits(GPIO_SPI,SCK)

#define SPI_SDA_H  GPIO_SetBits(GPIO_SPI,SDA)
#define SPI_SDA_L  GPIO_ResetBits(GPIO_SPI,SDA)

#define SPI_RS_H   GPIO_SetBits(GPIO_SPI1,RS)
#define SPI_RS_L   GPIO_ResetBits(GPIO_SPI1,RS)

#define SPI_RST_H  GPIO_SetBits(GPIO_SPI1,RST)
#define SPI_RST_L  GPIO_ResetBits(GPIO_SPI1,RST)

#define SPI_CS_H   GPIO_SetBits(GPIO_SPI1,CS)
#define SPI_CS_L   GPIO_ResetBits(GPIO_SPI1,CS)
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-12-4 13:48:08 | 显示全部楼层
这是我写的SPI的引脚定义 。你可以这样写
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-12-4 15:14:03 | 显示全部楼层
douxiaolingyun 发表于 2018-12-4 13:48
这是我写的SPI的引脚定义 。你可以这样写

可以可以
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 08:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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