stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

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

I/O口模式:

GPIO的8种模式
通用输出 推挽输出(Puch-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|=1<<2;      //使能PORTA时钟
    RCC->APB2ENR|=1<<5;      //使能PORTD时钟
    GPIOA->CRH&=0XFFFFFFF0;
    GPIOA->CRH|=0X00000003;//PA8推挽输出
  GPIOA->ODR|=1<<8;                //PA8输出高

    GPIOD->CRL&=0XFFFFF0FF;
    GPIOD->CRL|=0X00000300;//PD2推挽输出
    GPIOD->ODR|=1<<2;         //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(9); //系统时钟设置
    delay_init(72);             //延时初始化
    LED_Init();        //初始化与LED连接的硬件接口
    while(1)
    {
        LED0=0;
        LED1=1;
        delay_ms(300);
        LED0=1;
        LED1=0;
        delay_ms(300);
    }
}

4.按键KEY输入

//key.c
#include "key.h"
#include "delay.h"
//按键初始化函数
//PA0 PA15 PC5设置成输入
void KEY_Init(void)
{
    RCC->APB2ENR|=1<<2;     //使能PORTA时钟
    RCC->APB2ENR|=1<<4;     //使能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|=1<<15;           //PA15上拉 PA0默认下拉
    GPIOC->CRL&=0XFF0FFFFF;    //PC5设置成输入
    GPIOC->CRL|=0X00800000;
    GPIOC->ODR|=1<<5;           //PC5上拉
}
//按键处理函数
//mode:0不支持连续按;1,支持连续按
//响应优先级KEY0>KEY1>WK_UP
u8 KEY_Scan(u8 mode)
{
    static u8 key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按
    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
    {
        delay_ms(10);//去抖动
        key_up=0;
        if(KEY0==0)
                    return KEY0_PRES;
        else if(KEY1==0)
                    return KEY1_PRES;
        else if(WK_UP==1)
                    return WKUP_PRES;
    }else if(KEY0==1&&KEY1==1&&WK_UP==0)
            key_up=1;
    return 0;// 无按键按下
}

//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(9);
    delay_init(72);
    LED_Init();
    KEY_Init();
    LED0 = 0;
    while(1)
    {
        t=KEY_Scan(0);
        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(10);
        }
    }
}
时间: 2024-07-30 13:46:21

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

stm32寄存器版学习笔记07 ADC

STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序:注入通道组相当于中断.程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换. 有16个多路通道.可以把转换组织成两组:规则组和注入组.在任意多个通道上以任意顺序进行的一系列转换构成成组转换.例如,可

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

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

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

stm32寄存器版学习笔记10 SPI

SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输出 MOSI 主设备数据输出,从设备数据输入 SCLK 时钟信号,有主设备产生 CS 从设备片选信号,有主设备控制 SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置.SPI_CR寄存器的CPOL(时钟极性)位,控制在没有数据传输时时钟的空闲状态电平,此位对

stm32寄存器版学习笔记08 DMA

DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f103有2个DMA控制器,DMA1有7个通道,DMA2有5个通道,专门用来管理来自外设对存储器的访问请求,还有一个仲裁器来协调各个DMA请求的优先权. 1.DMA各通道请求 从外设产生的DMA请求通过逻辑"或"输入到DMA控制器,这就意味着同时只能有一个请求有效. 例如,串口1发送的DMA,就

stm32寄存器版学习笔记09 IIC

I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中共有3种类型信号,分别是开始信号.结束信号和应答信号.   SCL SDA 开始信号 高电平 由高电平向低电平跳变,开始传送数据 结束信号 高电平 由低电平向高电平跳变,结束传送数据 应答信号 接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲,表示已经收到数据:CPU向受控单

Struts2学习笔记01 之 简介及配置

一.Struts简介 * 是轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层.运用ASOP的思想,使用拦截器来扩展业务控制器 二.使用步骤: 1.引入Sturts2的相关JAR包 2.配置前端控制器 3.创建struts.xml 5.编写业务控制器Action 6.编写JSP页面 7.配置struts.xml

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit