STM32学习的I/O整理

        以前对I/O的使用功能,感觉不多,也觉得不复杂,原理不需要懂,会用就好,所以这里只是作为一个整理。
        4种输入模式
        (1)GPIO_Mode_AIN 模拟输入,这里是电压变化来识别,一般ADC转换接口,而且这里输入是0-3.3V之间的数据。据说低功耗下可以省电。
        在数据手册里面,如果标有“FT”的可以接受5V的输入,但是防止意外,还是建议将电压下调整到3.3V,我之前设计了冰浴机的电路,水流的流量传感器的信号是0-5V(使用分压或者比较器等方式将管脚处电压调整到3.3V以下就可以了),当时接到了ETR管脚上了,调整时没有分压直接串了个电阻,电压没有降下来 ,添加功能以后,开机单片机管脚爆掉了。那些未标有“FT”的基本上都是ADC的管脚,是只能接3.3V的,如果接5V,应该会爆掉的,采集数据的话,设定模拟输入就可以了。
        (2 GPIO_Mode_IN_FLOATING 浮空输入,这种受到干扰比较严重,用的比较少。
        (3 GPIO_Mode_IPD 下拉输入,这种,直接管脚对地了,是有接收到的信号是高电平才有变化。
        (4 GPIO_Mode_IPU 上拉输入,这种,管教直接对3.3V了, 是有接收到的信号是低电平才有变化。
        如果按键的话,根据需要吧,根据自己外围电路来设置模式。我之前就是采用了GPIO_Mode_IPU,外面按键按下就对地了,来采集按键动作的。
        4种输出模式
        (1 GPIO_Mode_Out_OD 开漏输出
        (2 GPIO_Mode_Out_PP 推挽输出
        (3 GPIO_Mode_AF_OD 复用开漏输出
        (4 GPIO_Mode_AF_PP 复用推挽输出
        我一般是采用的推挽输出作为电源指示灯,信号指示等的指示作用的。
在开源电子网找的:在STM32中选用IO模式
        (1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
        (2)带上拉输入_IPU——IO内部上拉电阻输入
        (3)带下拉输入_IPD—— IO内部下拉电阻输入
        (4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
        (5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
        (6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
        (7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
        (8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
        如果想象51那种进行位操作就需要用的下面一些程序。这个我也是之前设计程序时候总工他们给我的,详细的估计等我再学到这里可能会描述了。

        /* 利用“位带操作”,来实现单个位的操作*/
        #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))

        // IO映射
        #define GPIOA_ODR_Addr    ( GPIOA_BASE + 12 ) 
        #define GPIOB_ODR_Addr    ( GPIOB_BASE + 12 ) 
        #define GPIOC_ODR_Addr    ( GPIOC_BASE + 12 ) 
        #define GPIOD_ODR_Addr    ( GPIOD_BASE + 12 ) 
        #define GPIOE_ODR_Addr    ( GPIOE_BASE + 12 ) 
        #define GPIOF_ODR_Addr    ( GPIOF_BASE + 12 ) 
        #define GPIOG_ODR_Addr    ( GPIOG_BASE + 12 ) //这里是PA-PG的7组输出的地址设置

        #define GPIOA_IDR_Addr    ( GPIOA_BASE + 8 ) 
        #define GPIOE_IDR_Addr    ( GPIOE_BASE + 8 ) //这里是用到PA,PE的2组输入的地址设置

        #define PAout(n)    BIT_ADDR( GPIOA_ODR_Addr,n )
        #define PBout(n)    BIT_ADDR( GPIOB_ODR_Addr,n )
        #define PCout(n)    BIT_ADDR( GPIOC_ODR_Addr,n )
        #define PDout(n)    BIT_ADDR( GPIOD_ODR_Addr,n )
        #define PEout(n)    BIT_ADDR( GPIOE_ODR_Addr,n )
        #define PFout(n)    BIT_ADDR( GPIOF_ODR_Addr,n )
        #define PGout(n)    BIT_ADDR( GPIOG_ODR_Addr,n )//这里是PA-PG的7组中每一位的输出设置,n是0-15

        #define PAin(n)    BIT_ADDR( GPIOA_IDR_Addr,n )
        #define PEin(n)    BIT_ADDR( GPIOE_IDR_Addr,n )//这里是PA,PE的2组中每一位的输入设置,n是0-15 

      补:暂时就这些吧,我先学习到了这里,加上以前用的不多还真没注意那些I/O 的详细用法,只是用到的时候的一些设置,如果好用就那样不改了,现在看起来可能用的不标准,后面学到了更详细的在回来修改补充吧,寄存器目前看着有点晕乎,等以后使用时候再添加吧,毕竟我记得当时设计液晶的显示的时候,采用了并口通讯,因为管脚是已连续的,所以对于8位的输入输出,使用了寄存器设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

esmember

感谢大家喜欢我遇到的问题分享。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值