OpenEdv-开源电子网

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

GPIO怎么用库函数对IO进行取反

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
发表于 2014-5-22 16:25:30 | 显示全部楼层 |阅读模式
5金钱
GPIO怎么用库函数对IO进行取反

最佳答案

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

回复【3楼】热情的meng: --------------------------------- 你可以在stm32f0xx.h添加以下内容:  typedef struct { u8 bit0:1; u8 bit1:1; u8 bit2:1; u8 bit3:1; u8 bit4:1; u8 bit5:1; u8 bit6:1; u8 bit7:1; u8 bit8:1; u8 bit9:1; u8 bit10:1; u8 bit11:1; u8 bit12:1; u8 bit13:1; u8 bit14:1; u8 bit15:1; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-5-22 16:25:31 | 显示全部楼层
回复【3楼】热情的meng:
---------------------------------
你可以在stm32f0xx.h添加以下内容:

 typedef struct
{
u8 bit0:1;
u8 bit1:1;
u8 bit2:1;
u8 bit3:1;
u8 bit4:1;
u8 bit5:1;
u8 bit6:1;
u8 bit7:1;

u8 bit8:1;
u8 bit9:1;
u8 bit10:1;
u8 bit11:1;
u8 bit12:1;
u8 bit13:1;
u8 bit14:1;
u8 bit15:1;

}FLAG_16BIT_TypeDef;
//IO的偏移地址,看你具体的单片机型号而定,F0的是20
#define GPIOA_ODR               ((__IO FLAG_16BIT_TypeDef*)(GPIOA_BASE+20))
#define GPIOB_ODR                ((__IO FLAG_16BIT_TypeDef*)(GPIOB_BASE+20))
#define GPIOC_ODR                ((__IO FLAG_16BIT_TypeDef*)(GPIOC_BASE+20))
#define GPIOD_ODR                ((__IO FLAG_16BIT_TypeDef*)(GPIOD_BASE+20))
#define GPIOF_ODR               ((__IO FLAG_16BIT_TypeDef*)(GPIOF_BASE+20))
//如此定义就可以用了
#define LED1          GPIOF_ODR->bit7
当然,你也可以自己写成自己喜欢的格式。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-22 17:18:18 | 显示全部楼层
用寄存器就很简单...
库函数不怎么用
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-22 17:35:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
在主函数中宏定义怎么不能用
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-22 17:37:29 | 显示全部楼层
回复【3楼】热情的meng:
---------------------------------
#define LED0 GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) 
LED0=0;
编译显示错误
这个我是直接写到main()里面的
为什么不行   
求助
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2014-5-22 18:23:35 | 显示全部楼层
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)  =0;

怎么看都不是合法的语句啊.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-22 18:57:11 | 显示全部楼层
回复【5楼】shihantu:
---------------------------------
这样可以吗
#define LED0 Bout(5)
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-22 18:57:55 | 显示全部楼层
回复【6楼】热情的meng:
---------------------------------
这样可以吗 
#define LED0 Bout(5)
LED0=0;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-22 20:58:55 | 显示全部楼层
回复【7楼】热情的meng:
---------------------------------
可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-23 09:07:52 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我是直接写到主程序的,编译出现错误,是软件的问题还是程序本身的错误   求助
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-23 09:15:28 | 显示全部楼层
回复【9楼】热情的meng:
---------------------------------
你PBOUT(5)的define做好没

//IO口地址映射
#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 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define Aout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define Ain(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define Bout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define Bin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define Cout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define Cin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define Dout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define Din(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define Eout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define Ein(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#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)  //输入
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-23 10:01:11 | 显示全部楼层
回复【10楼】聚东风:
---------------------------------
谢谢
回复

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-5-23 10:19:43 | 显示全部楼层
对IO的操作没必要认死一种方式,该写寄存器就写寄存器,该调库函数就调库函数,有时候自己根据自己的需要定义的宏操作也很方便。
大海啊,全是水; 骏马啊,四条腿。
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-4-28
在线时间
5 小时
发表于 2014-5-23 13:58:05 | 显示全部楼层
回复【4楼】热情的meng:
---------------------------------
这样肯定是不行的啊,读出的IO口本来就是一个值,怎么能再对一个值赋值呢?又不是变量!!!
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-23 21:42:05 | 显示全部楼层
回复【10楼】聚东风:
---------------------------------

TIM_OCInitTypeDef TIM_OCInitStructure; 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
TIM_OCInitStructure.TIM_Channel = TIM_Channel_1; 
TIM_OCInitStructure.TIM_Pulse = 0x3FFF; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
TIM_OCInit(TIM2, & TIM_OCInitStructure);
这条TIM_OCInitStructure.TIM_Pulse = 0x3FFF; 编译没反应
而用这个
    while(1)
{
   Delay_MS(10);  
if(dir)led0pwmval++;
else led0pwmval--;

   if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;   
TIM_SetCompare2(TIM3,led0pwmval);    
}
怎么可以
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-5-23 21:42:47 | 显示全部楼层
回复【10楼】聚东风:
---------------------------------
TIM_OCInitStructure.TIM_Pulse = 0x3FFF; 为什么用这条语句没有效果
回复

使用道具 举报

6

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-5-20
在线时间
2 小时
发表于 2014-6-6 12:01:46 | 显示全部楼层
用库翻转比较麻烦,需要先读引脚数据,在写数据进去。
用到的是这两个函数GPIO_ReadOutputDataBit() 和 GPIO_WriteBit()
不过这样比较麻烦,还是用bitband位带操作比较快点。
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-10-27
在线时间
0 小时
发表于 2015-10-29 08:39:27 | 显示全部楼层
回复【10楼】聚东风:
---------------------------------
#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   这些宏定义都代表意思??有参考文件吗??  大神
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2015-11-4 10:06:23 | 显示全部楼层
回复【17楼】Seeking:
---------------------------------
GPIOA_BASE,是GPIO端口的基础地址
在他的基础上加上个12就可以得到相应端口ODR寄存器的地址,这样写只是为了减少自己的记忆程度,基础弄好后,这些翻译工作编译器都会帮你完成的
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-12-13
在线时间
42 小时
发表于 2016-12-23 10:48:29 | 显示全部楼层
                                        switch(key_scan())
                                {                                 
                                        case 1:
                                        if(GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)==0)
                                        {
                                        GPIO_SetBits(GPIOD, GPIO_Pin_2);
                                        }
                                        else
                                        {
                                        GPIO_ResetBits(GPIOD, GPIO_Pin_2);
                                        }
                                        break;
                                }
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-7-15
在线时间
3 小时
发表于 2017-7-15 10:04:21 | 显示全部楼层
GPIO_WriteBit(GPIOE,GPIO_Pin_15,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_15)));    //IO的电平翻转  
首先读取输出的IO然后通过1-高低电平。如果为高,减去就是为0.如果为低,减去就是为1。  再通过写入电平就取反了。  库函数确实要麻烦很多。
回复

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-1-3
在线时间
98 小时
发表于 2020-7-27 20:37:33 | 显示全部楼层
定义一个变量,变量赋值给端口,然后变量取反操作就可以,程序进去一次就去翻一次,多端口的,可以自己联想,我已经测试过了,定时器取中断取反,没有问题,希望可以帮到你。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 04:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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