本帖最后由 xiaojie0513 于 2018-5-6 22:19 编辑 " ^8 t" i S( q0 M. g) U
3 X. M6 d0 H6 I& r6 S
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:* X# q% B6 [4 Q
- GPIO简介
- 点亮LED
, m: J4 l2 M# s, f, m, j+ O 1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。
' Y: d% {- t' B0 n( h0 A每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:
; K" P! W; ~1 S8 p- 端口的位(引脚)能独立配置
- 可选择的输入模式:浮空输入或上拉模式
- 可选择的输出模式:推挽输出或伪开漏输出
- 独立的数据输出和输出寄存器
- 外部中断能独立地使能或禁能
- 可控的输出速率能减少EMC噪声
- 可用于片上外设复用功能的I/O
- 在数据输出锁存上可实现数据读出--修改--写入
- I/O状态在1.6V~VDDIOmax下是稳定的8 A% n6 Q9 A" j# W1 @5 z! F+ r
GPIO的输入输出模式主要分为以下几种:
2 f4 i+ t" `; E6 {$ T, S- 浮空输入(初始状态由外部决定)
- 上拉输入(初始状态为VDD)
- 开漏输出(输出高由外部控制,输出低为VSS)
- 推挽输出(输出高为VDD,输出低为VSS)
_* j) ^- Q" m4 C. H 为了降低功耗,没有使用的I/O口的引脚应配置为以下功能之一:3 w. C; s- h# a8 t* c( C
- 通过外部上拉或下拉,作为浮空输入
- 配置为内部上拉/下拉输入
- 配置为推挽输出,输出低
/ Y" J/ [6 F* m; ?' X* S, U STM8L51F3的GPIO板块框图如下:, v) K( `, k0 I9 f/ _) C8 V7 u
注:在3.6V和5V兼容的I/O口,连接到VDD的保护二极管是不起作用的
/ C+ b& N- \: q' G在真正开漏的I/O口,P-Buffer、弱上拉和连接到VDD的保护二极管是不起作用的
/ w& V# y1 o Q5 {% m% A @' \+ m% \5 ?# K c0 t3 O0 e3 M# [
# Y5 K9 ~8 X: U0 e/ t' j2、点亮LED2.1 GPIO的输出配置本小节介绍将GPIO配置为输出模式实现点亮LED1。使用的例程:STM8L051F3_01_LED。实现的步骤如下:
3 l/ E, s3 k" }; i. T& U& f+ a 1)初始化LED1(PB1)为推挽输出模式(初始电平高)5 \% D% v. j3 y7 A: ?9 y
2.2 例程介绍LED1&LED2的初始化在led.c文件中定义:0 D$ u1 m& K/ \! u
void LED_Init(void)
+ b6 Z2 y6 \7 h X{
' l1 N* j2 v$ }; Y /* 配置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); }2 k- z4 {. U* R( {5 m
LED1&LED2的端口在led.h文件中定义:
) G+ q5 u' ~. l) Y$ @#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的状态:4 O0 @. z) q: P; R/ }' V! [
void main(void) D$ `, }) `* U% c* j) F# ~ Y) e
{
) A. Z; c. M( b( } LED_Init(); //初始化LED while(1) { delay_ms(300); GPIO_ToggleBits(LED1_GPIO_PORT, LED1_GPIO_PINS); //切换LED1状态 } }
& j* H# e+ f" n% y4 @% V! ? Delay_ms()函数在main.c文件中定义并实现:& }/ g* B' z. P( ]) ?' R
static void delay_ms(unsigned int ms)//延迟函数,MS级别
' M$ e1 y, ~" B5 T1 C7 a3 x{
5 f; X9 O* a) R( w" R+ d0 p unsigned int x,y; for(x = ms;x>0;x--) { for(y = 405;y>0;y--); } }
4 E! P1 p! A7 Y8 C 使用ST-LINK把程序下载到开发板中,然后可以看到LED1闪烁。注:例程中系统时钟使用的是默认HSI/8 = 2MHz。
2 j: |3 k. P2 |& f3 {) N3 N
- ~, s" v! N. m* j3 h& n2 W3 h8 O; d欢迎关注“创客飞梦空间”, B1 i0 X* [/ s, D/ a a( a
首发在公众号) z M; L$ X ^* f- J2 S
往期精彩回顾
( @5 f* k$ O) V: SSTM8L051F3_0c_新建工程 https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615744&fromuid=3250941 (出处: 意法半导体STM32/STM8技术社区)
. b9 I! C/ g0 {7 C
w5 v* \: I7 r0 g- U& G
7 Q7 v2 E! g5 ~- ]2 E
5 Z0 D1 r3 S. t |