1,GPIO : STM32 可控制的引脚,STM32 芯片 的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 STM32芯片的 GPIO 被分成很多组,每组有 16个引脚,所有的 GPIO引脚都有基本的输入输出功能。
    最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,如把 GPIO 引脚接入到LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以 通过继电器或三极管控制外部大功率电路的通断。
    最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低 区分按键是否被按下。
    2,GPIO分析:
    image.png
    1区保护二极管及上、下拉电阻:引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入
    2区P-MOS管和 N-MOS管:GPIO 引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出 模式”结构
    3区输出数据寄存器
    4区复用功能输出
    5区输入数据寄存器
    6区复用功能输入
    7区模拟输入输出
    时钟分析:四个时钟源:HSE(high speed exit)高速外,高速内,低速外,低速内。内部由RC震荡产生,不稳定,外部由晶振产生,比较稳定。晶振时钟经过分频倍频后送到各外设和核内
    3,GPIO的工作模式:
    image.png
    大致三类:1输入模式(模拟/浮空/上拉/下拉)
    2输出模式(推挽/开漏)
    3复用功能(推挽/开漏)

    4,使用寄存器点亮LED灯:
    原理图:
    image.png
    红色灯对应的端口为PB5,绿色对应的端口为PB0,蓝色对应的端口为PB1。
    当端口为低电平的时候,灯被点亮。查阅手册可知,GPIOB的存储器映像为0X40010C00-0X40010FFF;而端口对应的输出数据寄存器的偏移量为0Ch。

    配置寄存器(使用了c语言位移操作):
    image.png
    代码:
    *(unsigned int *)0x40010C0C &=~(1<<0);

    配置低端口寄存器:我们还先配置端口模式和功能。查阅手册可知,由CNF0和MODE0分别控制功能和模式,我们需要相应地配置,以用于GPIO口的使用。
    image.png
    代码:
    (unsigned int )0x40010C00 |=(1<<(4*0));

    配置时钟:先启动时钟才能正常运行,由于GPIOB是APB2总线上的外设,所以我们需要打开APB2中GPIOB对应的时钟
    image.png
    打开对应端口的第三个寄存器

    查阅手册,APB2的RCC的起始地址为0x40021000-0x400213FF。

    代码:
    *(unsigned int *)0x40021018 |=(1<<3);

    寄存器点亮LED总程序:
    int main(void)
    {
    //配置时钟
    (unsigned int )0x40021018 |=(1<<3);

    //配置I/O口模式
    (unsigned int )0x40010C00 |=(1<<(40));

    //控制ODR寄存器
    (unsigned int *)0x40010C0C &=~(1<<0);
    }
    5,外设都有对应的C文件和H文件。H文件是C文件的实现声明,调用外设必须将C H文件都添加到工程中。其中conf.h是一个包含所有H文件的文件。比如点灯要用到:启动文件,cm3核文件,gpio端口文件,rcc时钟配置文件,32f10x.c文件