STM32的I/O口可以由软件配置成如下8种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽式复用功能及开漏复用功能。每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CRL和CRH(模式、速度);数据寄存器IDR和ODR;置位/复位寄存器BSRR;复位寄存器BRR;锁存寄存器LCKR。

I/O口模式:

GPIO的8种模式
通用输出 推挽输出(Push-Pull) 可以输出高、低电平,连接数字器件  
开漏输出(Open-Drain) 开漏引脚不连接外部的上拉电阻时,只能输出低电平;如果需要同时具备输出高电平的功能,则需要接上拉电阻  
复用功能输出 复用功能推挽输出 片内外设功能(I2C的SCL,SDA) GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
复用功能开漏输出 片内外设功能(TX1,MOSI,MISO,SCK,SS)
输入 模拟输入 应用ADC模拟输入,或者低功耗下省电  
浮空输入 可以做KEY识别,外部按键输入 IO的电平状态是不确定,完全由外部输入决定
下拉输入 IO内部下拉电阻输入 不确定信号->低电平
上拉输入 IO内部上拉电阻输入 不确定信号->高电平

  

1.GPIO口配置步骤

①使能PORTx(x=A~G)

  APB2外设时钟使能寄存器(RCC_APB2ENR)

置1开启。清0关闭。

8-2位使能GPIO G-A

  Eg:RCC->APB2ENR| = 1 << 2;  //使能PORTA时钟

②配置IO口模式 低8位(CRL) 高8位(CRH)

  端口配置低寄存器(GPIOx_CRL) (x=A..E)

  Eg:GPIOA->CRL |= 0x00000003;  //PA0推挽输出

③配置端口输入和输出电平

  端口输入数据寄存器(GPIOx_IDR) (x=A..E)

  端口输出数据寄存器(GPIOx_ODR) (x=A..E)

Eg: GPIOA->ODR |= 1 <<8;  //PA8输出高

2.GPIO配置相关寄存器

  端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)

ODR寄存器只进行置1操作,不支持写0操作。用BSRR寄存器进行清除。

  端口位清除寄存器(GPIOx_BRR) (x=A..E)

  端口位清除寄存器(GPIOx_BRR) (x=A..E)  具体参看数据手册

  当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。 每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。

3.LED

//led.c
//LED IO口初始化
void LED_Init(void)
{
RCC->APB2ENR|=<<; //使能PORTA时钟
RCC->APB2ENR|=<<; //使能PORTD时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8推挽输出
GPIOA->ODR|=<<; //PA8输出高 GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD2推挽输出
GPIOD->ODR|=<<; //PD2输出高
} //led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h" //LED端口定义
#define LED0 PAout(8) // PA8
#define LED1 PDout(2) // PD2 void LED_Init(void); //初始化
#endif //main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(); //系统时钟设置
delay_init(); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
while()
{
LED0=;
LED1=;
delay_ms();
LED0=;
LED1=;
delay_ms();
}
}

4.按键KEY输入

//key.c
#include "key.h"
#include "delay.h"
//按键初始化函数
//PA0 PA15 PC5设置成输入
void KEY_Init(void)
{
RCC->APB2ENR|=<<; //使能PORTA时钟
RCC->APB2ENR|=<<; //使能PORTC时钟
JTAG_Set(SWD_ENABLE); //关闭JTAG 开启SWD PA15占用了JTAG一个口
GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF; //PA15设置成输入
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=<<; //PA15上拉 PA0默认下拉
GPIOC->CRL&=0XFF0FFFFF; //PC5设置成输入
GPIOC->CRL|=0X00800000;
GPIOC->ODR|=<<; //PC5上拉
}
//按键处理函数
//mode:0不支持连续按;1,支持连续按
//响应优先级KEY0>KEY1>WK_UP
u8 KEY_Scan(u8 mode)
{
static u8 key_up=;//按键按松开标志
if(mode)key_up=; //支持连按
if(key_up&&(KEY0==||KEY1==||WK_UP==))
{
delay_ms();//去抖动
key_up=;
if(KEY0==)
return KEY0_PRES;
else if(KEY1==)
return KEY1_PRES;
else if(WK_UP==)
return WKUP_PRES;
}else if(KEY0==&&KEY1==&&WK_UP==)
key_up=;
return ;// 无按键按下
} //key.h
#ifndef __KEY_H
#define __KEY_H
#include "sys.h" #define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define WKUP_PRES 3 //WK_UP按下 #define KEY0 PCin(5) //PC5
#define KEY1 PAin(15) //PA15
#define WK_UP PAin(0) //PA0 WK_UP void KEY_Init(void);
u8 KEY_Scan(u8 mode);
#endif //main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h" int main(void)
{
u8 t;
Stm32_Clock_Init();
delay_init();
LED_Init();
KEY_Init();
LED0 = ;
while()
{
t=KEY_Scan();
switch(t)
{
case KEY0_PRES:
LED0=!LED0;
break;
case KEY1_PRES:
LED1=!LED1;
break;
case WKUP_PRES:
LED0=!LED0;
LED1=!LED1;
break;
default:
delay_ms();
}
}
}

stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)的更多相关文章

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  2. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  3. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

  4. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  5. stm32寄存器版学习笔记10 SPI

    SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...

  6. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  7. stm32寄存器版学习笔记08 DMA

    DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...

  8. stm32寄存器版学习笔记04 定时计数器中断

    STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...

  9. stm32寄存器版学习笔记09 IIC

    I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中 ...

随机推荐

  1. 解决 libnanomsg.so.0: cannot open shared object file: No such file or directory 无法找到libnanomsg动态链接库

    参考: [11]缺少动态连接库.so--cannot open shared object file: No such file or directory Importing Issues: cann ...

  2. hiho 有序01字符串 dp

    题目1 : 有序01字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0.那么,你最少需要修改多少 ...

  3. hdu 1241 搬寝室 水dp

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  4. ItemsControl的应用

    ItemsControl是集合类控件的基类,如:ListBox.ComboBox.TreeView 所以,我们可以直接应用“ItemsControl”自定义我们“需要的”集合类型控件

  5. 转载:10+ handy and reusable jQuery code snippets

    源地址:http://www.catswhocode.com/blog/10-handy-and-reusable-jquery-code-snippets Smooth scrolling to t ...

  6. [洛谷U62358]求导函数

    U62358 求导函数 题面 给出一个n次函数\(f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_0\)的各项系数\(a_n,a_{n-1}...a_1,a_0 ...

  7. HDU - 5988The 2016 ACM-ICPC Asia Qingdao Regional ContestG - Coding Contest 最小费用流

    很巧妙的建边方式 题意:有n个区域,每个区域有一些人数si和食物bi,区域之间有m条定向路径,每条路径有人数通过上限ci.路径之间铺了电线,每当有人通过路径时有pi的概率会触碰到电线,但是第一个通过的 ...

  8. poj1228稳定凸包

    就是给一系列点,看这是不是一个稳定凸包 稳定凸包是指一个凸包不能通过加点来使它扩大面积,也就是说每条边最少有三个点 判断的地方写错了,写了两边循环,其实数组s已经排好了序,直接每三个判断就好了 #in ...

  9. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  10. find命令中选项-path和-prune的使用

    在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能.假如在当前目录下查 ...