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

STM8L051F3_01_GPIO应用

[复制链接]
xiaojie0513 发布时间:2018-5-6 21:59
本帖最后由 xiaojie0513 于 2018-5-6 22:19 编辑 7 W' h! v5 P9 O! c0 o
* U8 ]' h  e2 ?  L5 w0 q
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:
/ P' C; s/ n3 }: x5 l8 D4 L( b5 ]
  • GPIO简介
  • 点亮LED
    " C' ]/ X/ ?4 f
1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。' ~: n8 I4 t( F/ N! z* m2 w5 q1 Y/ V
每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:
! }; J; A) b) e6 c( s
  • 端口的位(引脚)能独立配置
  • 可选择的输入模式:浮空输入或上拉模式
  • 可选择的输出模式:推挽输出或伪开漏输出
  • 独立的数据输出和输出寄存器
  • 外部中断能独立地使能或禁能
  • 可控的输出速率能减少EMC噪声
  • 可用于片上外设复用功能的I/O
  • 在数据输出锁存上可实现数据读出--修改--写入
  • I/O状态在1.6V~VDDIOmax下是稳定的
    7 f- M' p/ C: |
GPIO的输入输出模式主要分为以下几种:$ {  E9 F) \# o7 C0 P& ^( i9 v+ v( E
  • 浮空输入(初始状态由外部决定)
  • 上拉输入(初始状态为VDD)
  • 开漏输出(输出高由外部控制,输出低为VSS)
  • 推挽输出(输出高为VDD,输出低为VSS)
    , t" l( q! ?, s# o4 H8 [
为了降低功耗,没有使用的I/O口的引脚应配置为以下功能之一:
  T# h7 Q* E$ H
  • 通过外部上拉或下拉,作为浮空输入
  • 配置为内部上拉/下拉输入
  • 配置为推挽输出,输出低( H2 S' N5 i3 }% x
STM8L51F3的GPIO板块框图如下:
7 U( L5 p# i6 R; H$ i) G: M注:在3.6V和5V兼容的I/O口,连接到VDD的保护二极管是不起作用的
5 B: C$ Q: K* H% C- s在真正开漏的I/O口,P-Buffer、弱上拉和连接到VDD的保护二极管是不起作用的/ A7 h4 n' Z" @2 D

  h* @7 ^+ m" U6 U+ j
; ]6 b4 z- U2 s, ~$ ?% W5 H( l; |$ e2、点亮LED2.1 GPIO的输出配置本小节介绍将GPIO配置为输出模式实现点亮LED1。使用的例程:STM8L051F3_01_LED。实现的步骤如下:, m8 M  p# r/ ?; `: \6 [% i
1)初始化LED1(PB1)为推挽输出模式(初始电平高)
9 A/ Q2 X$ Q3 L0 B8 o0 i# J' V2.2 例程介绍LED1&LED2的初始化在led.c文件中定义:. v. m$ v* t7 B6 W! t% Q" {
void LED_Init(void)) f2 u7 o6 ^  Y) M, L$ G& r
{
2 C! _( Q% J& ~# K, C
  /* 配置LED1 IO口为输出模式 ,初始状态为高*/
  GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_Mode_Out_PP_High_Fast);
  /* 配置LED2 IO口为输出模式 ,初始状态为高*/
  GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_Mode_Out_PP_High_Fast);
}4 h0 o8 {) s% Y% h/ I' Z' B/ O  ?+ z
LED1&LED2的端口在led.h文件中定义:1 V/ U$ ^6 N& d
#define LED1_GPIO_PORT  (GPIOB)
#define LED1_GPIO_PINS  (GPIO_Pin_1)
#define LED2_GPIO_PORT  (GPIOB)
#define LED2_GPIO_PINS  (GPIO_Pin_2)
在主函数中,LED_Init()函数对GPIO进行初始化,然后在循环中每300ms改变一次LED1的状态:& ^% m5 Z- X" t& ]' m$ g
void main(void)
. h+ B' H- j; \" W/ a/ ^{) o6 v6 Q1 X$ \" [( T
  LED_Init();   //初始化LED
while(1)
{
    delay_ms(300);
    GPIO_ToggleBits(LED1_GPIO_PORT, LED1_GPIO_PINS); //切换LED1状态
}
}" Q$ z3 |5 I# L2 x' ]7 Z& G, Z
Delay_ms()函数在main.c文件中定义并实现:- K9 [8 P, ?  l4 b: A
static void delay_ms(unsigned int ms)//延迟函数,MS级别6 m7 V7 J3 V: F( q8 P( m
{" u1 a, X/ ?7 _" e
  unsigned int x,y;
for(x = ms;x>0;x--)
{
for(y = 405;y>0;y--);
}
}3 j8 P8 q; M0 y2 `0 M4 I) Z. x
使用ST-LINK把程序下载到开发板中,然后可以看到LED1闪烁。注:例程中系统时钟使用的是默认HSI/8 = 2MHz。9 S: n; B3 n2 Y+ d
3 |( Y/ q" b1 g. w
欢迎关注“创客飞梦空间”
2 M8 A) i; c* M5 \2 Z首发在公众号
9 X; ^! ]6 c# b  E& A) |" X往期精彩回顾9 o5 ~6 T' G$ A' a+ D
STM8L051F3_0c_新建工程
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615744&fromuid=3250941
(出处: 意法半导体STM32/STM8技术社区)
5 |# d6 R/ \3 u1 T( [
4 T" F9 ^3 Z0 x! U6 G

2 F& G2 r# V: v6 s) }( a7 g$ m2 ]# C; i# s% y1 B* B* ]* H
赞 收藏 1 评论2 发布时间:2018-5-6 21:59

举报

2个回答
sjh948401219 回答时间:2018-5-31 16:13:37
好是 是
sjh948401219 回答时间:2018-5-31 16:13:53
我是小白

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版