OpenEdv-开源电子网

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

请教 关于 stm32 快速io与 普通 io位操作的 区别

[复制链接]

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1818
金钱
1818
注册时间
2011-10-9
在线时间
231 小时
发表于 2011-10-11 14:31:11 | 显示全部楼层 |阅读模式
原子哥

          请教一下 stm32 快速io与 普通 io位操作的 区别 
         如果通过 BSRR/BRR 快速改变IO口的输出 而且速度还比较快 那么为什么要用 ODR 来输出呢

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-11 15:16:57 | 显示全部楼层
回复【楼主位】simms01:
---------------------------------
因为ODR的某个位即可设置输出也可以清除输出.
BSRR/BRR能吗?

用了你就知道.

如非特殊要求,没必要用BSRR和BRR,因为用着不爽.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-11 22:15:26 | 显示全部楼层
我喜欢用:BSRR/BRR
它们只有“1”才会改变值,不用担心影响其他位。
BSRR的高位也可以用来清除。
反正用好了会方便的,但也不需要刻意用,哪个方便哪个来!
原子在这个问题上偏激了。。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-11 23:48:39 | 显示全部楼层
萝卜白菜,各有所爱吧.

喜欢哪个就用哪个吧.能达到效果就好.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-27
在线时间
0 小时
发表于 2012-6-27 12:18:39 | 显示全部楼层
回复【2楼】正点原子:

---------------------------------
快速IO和普通IO在固件库函数中的区别是不是GPIO_Speed上的设置?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-27 14:01:53 | 显示全部楼层
库函数没研究...
不过不是speed吧,speed是不是设置2M,10M,50M之类的那个?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-3-3
在线时间
10 小时
发表于 2013-3-3 19:54:58 | 显示全部楼层
回复【6楼】正点原子:
先看你的程序:
////////////////////////////////////////////////////////////////////
//-----------------LCD端口定义---------------- 
#define LCD_LED Cout(10) //LCD背光       C10 
//如果使用快速IO,则定义下句,如果不使用,则去掉即可!
//使用快速IO,刷屏速率可以达到28帧每秒!
//普通IO,只能14帧每秒!   

#if LCD_FAST_IO==1 //快速IO
//操作频繁,为了提高速度,建议直接寄存器操作
#define LCD_CS_SET  GPIOC->BSRR=1<<9    //片选端口        C9
#define LCD_RS_SET GPIOC->BSRR=1<<8    //数据/命令          C8    
#define LCD_WR_SET GPIOC->BSRR=1<<7    //写数据   C7
#define LCD_RD_SET GPIOC->BSRR=1<<6    //读数据   C6
    
#define LCD_CS_CLR  GPIOC->BRR=1<<9     //片选端口        C9
#define LCD_RS_CLR GPIOC->BRR=1<<8     //数据/命令          C8    
#define LCD_WR_CLR GPIOC->BRR=1<<7     //写数据   C7
#define LCD_RD_CLR GPIOC->BRR=1<<6     //读数据   C6
/*
#define LCD_CS_SET  GPIO_SetBits(GPIOC,GPIO_Pin_9)    //片选端口        PC9
#define LCD_RS_SET GPIO_SetBits(GPIOC,GPIO_Pin_8)    //数据/命令        PC8    
#define LCD_WR_SET GPIO_SetBits(GPIOC,GPIO_Pin_7)    //写数据   PC7
#define LCD_RD_SET GPIO_SetBits(GPIOC,GPIO_Pin_6)    //读数据   PC6
    
#define LCD_CS_CLR  GPIO_ResetBits(GPIOC,GPIO_Pin_9)     //片选端口        PC9
#define LCD_RS_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_8)     //数据/命令         PC8    
#define LCD_WR_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_7)     //写数据   PC7
#define LCD_RD_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_6)     //读数据   PC6
*/
    
#else //慢速IO

#define LCD_CS PCout(9)  //片选端口        PC9
#define LCD_RS PCout(8)  //数据/命令        PC8    
#define LCD_WR PCout(7)  //写数据   PC7
#define LCD_RD PCout(6)  //读数据   PC6

#endif
 //#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
//#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

1.都是宏定义,何来快慢之说?
2.你说不用BSRR/BRR ,但是你程序里却用(快速),自相矛盾?
3.有没有验证过?
  请刘老师解释一下,非常感谢!
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-3-3
在线时间
10 小时
发表于 2013-3-3 20:13:15 | 显示全部楼层
回复【7楼】casy:
---------------------------------
//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 

55 

原来楼主问问题的时候说反了,原子的程序完全正确!
以上代码的实现得益于CM3的位带操作,具体的实现比较复杂,
请参考<<CM3权威指南>>第五章
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 10:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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