你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F1笔记(一)GPIO输出

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:17
GPIO最经典应用:LED灯。

先看电路。声明:参考正点原子战舰开发板。

20180820151215293.png


20180820151305214.png


20180820151054641.png


与LED串联的电阻称为限流电阻。

限流电阻计算公式:R=(U-LED压降)/20ma。

U为LED工作电压,LED一般最大电流为20ma。

在此R=(3.3-0.7)/0.02=130Ω。

因此本次示例中限流电阻阻值大于130Ω,才不会烧坏LED。


再看代码。

GPIO初始化。
  1. void LED_Init(void)
  2. {
  3.     GPIO_InitTypeDef  GPIO_InitStructure;
  4.          
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
  6.         
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  11.     GPIO_SetBits(GPIOB, GPIO_Pin_5);

  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  13.     GPIO_Init(GPIOE, &GPIO_InitStructure);
  14.     GPIO_SetBits(GPIOE, GPIO_Pin_5);
  15. }
复制代码

LED应用
  1. void HW_Led0_Off(void)
  2. {
  3.     GPIO_SetBits(GPIOB, GPIO_Pin_5);    //设置GPIO输出1
  4. }

  5. void HW_Led0_on(void)
  6. {
  7.     GPIO_ResetBits(GPIOB, GPIO_Pin_5);  //设置GPIO输出0
  8. }

  9. void HW_Led1_Off(void)
  10. {
  11.     GPIO_SetBits(GPIOE, GPIO_Pin_5);    //设置GPIO输出1
  12. }

  13. void HW_Led1_on(void)
  14. {
  15.     GPIO_ResetBits(GPIOE, GPIO_Pin_5);  //设置GPIO输出0
  16. }
复制代码

思考:为什么IO输出低电平时LED亮,而不是输出高电平?

思路:

    1、由于单片机的I/O口的结构决定了它灌电流能力较强,而拉电流能力比较弱(即IO口的低平驱动能力较强而高电平驱动能力较差);

    2、为了简化单片机接口的设计。高电平驱动和低电平驱动是同样的效果,另外,低电平驱动也简化了控制代码,避免了单片机上电复位时端口置高电平后对led的影响;

从STM32中文参考手册内得知,STM32的GPIO可配置为八种模式。

    1、浮空输入(Input floating)

    2、上拉输入(Input pull-up)

    3、下拉输入(Input pull-down)

    4、模拟输入(Analog)

    5、开漏输出(Output open-drain)

    6、推挽式输出(Output push-pull)

    7、推挽式复用功能(Alternate function push-pull)

    8、开漏复用功能(Alternate function open-drain)

  1. typedef enum
  2. {
  3.     GPIO_Mode_AIN = 0x0,
  4.     GPIO_Mode_IN_FLOATING = 0x04,
  5.     GPIO_Mode_IPD = 0x28,
  6.     GPIO_Mode_IPU = 0x48,
  7.     GPIO_Mode_Out_OD = 0x14,
  8.     GPIO_Mode_Out_PP = 0x10,
  9.     GPIO_Mode_AF_OD = 0x1C,
  10.     GPIO_Mode_AF_PP = 0x18
  11. }GPIOMode_TypeDef;
复制代码

驱动LED使用的是推挽输出。推挽电路(push-pull)就是两个不同极性晶体管间连接的输出电路。

20180820152844392.png


简单理解推挽和开漏的区别:驱动能力不同。推挽驱动能力强。

复用意思是GPIO不作为普通IO,而是特殊功能使用,比如ADC、USART等。

引脚输出速度有3种:
  1. typedef enum
  2. {
  3.   GPIO_Speed_10MHz = 1,
  4.   GPIO_Speed_2MHz,
  5.   GPIO_Speed_50MHz
  6. }GPIOSpeed_TypeDef;
复制代码

GPIO的速度应该与应用匹配。速度配置越高,噪声越大,功耗越大。

比如配置为串口应用,波特率为115200,此时GPIO的速度配置为2MHz就够了,既省电也噪声小。

I2C接口,400K波特率,若想把余量留大些,可以配置为10MHz。

SPI接口,18M或9M需要选用50MHz的GPIO速度。


收藏 评论0 发布时间:2021-11-30 21:17

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版