STM32单片机 RCC与GPIO

一,外设 (Peripherals)

外设是指与主处理器(CPU)连接的硬件模块,这些模块提供了扩展功能,使得单片机可以与外部设备进行交互。常见的外设包括:

  • GPIO(通用输入/输出):用于控制单片机的输入和输出引脚。
  • RCC(复位和时钟控制):用于配置和管理时钟和复位。
  • USART/UART(串行通信接口):用于串行通信,如RS232。
  • SPI(串行外设接口):用于高速串行数据传输。
  • I2C(集成电路间通信):用于连接多个从设备的串行通信。
  • ADC(模数转换器):将模拟信号转换为数字信号。
  • DAC(数模转换器):将数字信号转换为模拟信号。
  • 定时器(Timers):用于产生精确的时间间隔或计数事件。

每一个外设都需要时钟信号来正常工作,这些时钟信号就是由RCC模块来控制。

二,总线 (Buses)

总线是指在单片机内部用于连接CPU、存储器和外设的通信通道。总线负责传输数据、地址和控制信号。STM32单片机中主要有以下几种总线:

  • AHB(高级高速总线):用于连接高速外设和存储器,如Flash和SRAM。AHB总线具有较高的传输速率。
  • APB(高级外设总线):用于连接低速外设,如UART、SPI、I2C等。APB总线的传输速率相对较低,但功耗较低。
  • AXI(高级可扩展接口):主要用于高级STM32系列的高性能总线系统,支持更高的带宽和复杂的总线仲裁机制。

三,总线与外设的关系

外设通过总线与CPU和存储器进行通信。总线提供了数据传输的路径,而外设执行具体的功能。不同的外设通过不同的总线连接,依据其带宽和速度要求。例如,高速外设(如USB或Ethernet)通常连接到AHB总线,而低速外设(如I2C和UART)则连接到APB总线。

总结来说,外设是实现特定功能的硬件模块,而总线是连接这些模块和CPU的通信路径。两者共同作用,使得STM32单片机能够实现各种复杂的功能。

四,RCC(Reset and Clock Control)复位和时钟控制

  1. 负责管理微控制器的时钟树,还有外设的晶振、内部振荡器以及各种时钟源的分频和倍频。
  2. 可以控制各个外设的时钟使能,确保只有当前使用设备才会消耗能量。

什么是外设时钟?

指用于驱动外设模块的时钟信号。每个外设模块(如USART、SPI、I2C、ADC、GPIO等)需要一个时钟信号来同步内部操作数据传输

RCC库函数

在rcc.h文件中

//最常用的3个函数

//控制高级高速总线(AHB)上的某个外设的时钟,参数1:指定要控制的AHB外设时钟;参数2:选择使能还是失能
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

**************************************************************************************************************

//该函数是由RCC模块控制连接在AHB总线上的外设的时钟信号

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);

//该函数是由RCC模块控制连接在APB2总线上的外设的时钟信号

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

//该函数是由RCC模块控制连接在APB1总线上的外设的时钟信号

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

**************************************************************************************************************

不清楚哪个外设连接在哪个总线,跳转定义查看。若跳转定义失败,重新编译。

RCC_AHBPeriph可以是

  * @param  RCC_AHBPeriph: specifies the AHB peripheral to gates its clock.
  *   STM32互联型的设备可以在这个列表选择
  *   For @b STM32_Connectivity_line_devices, this parameter can be any combination
  *   of the following values:        
  *     @arg RCC_AHBPeriph_DMA1
  *     @arg RCC_AHBPeriph_DMA2
  *     @arg RCC_AHBPeriph_SRAM
  *     @arg RCC_AHBPeriph_FLITF
  *     @arg RCC_AHBPeriph_CRC
  *     @arg RCC_AHBPeriph_OTG_FS    
  *     @arg RCC_AHBPeriph_ETH_MAC   
  *     @arg RCC_AHBPeriph_ETH_MAC_Tx
  *     @arg RCC_AHBPeriph_ETH_MAC_Rx
  * 
  *   其他设备在下面列表选择
  *   For @b other_STM32_devices, this parameter can be any combination of the 
  *   following values:        
  *     @arg RCC_AHBPeriph_DMA1
  *     @arg RCC_AHBPeriph_DMA2
  *     @arg RCC_AHBPeriph_SRAM
  *     @arg RCC_AHBPeriph_FLITF
  *     @arg RCC_AHBPeriph_CRC
  *     @arg RCC_AHBPeriph_FSMC
  *     @arg RCC_AHBPeriph_SDIO
  *   
  * @note SRAM and FLITF clock can be disabled only during sleep mode.

RCC_APB2Periph可以是

  * @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     

RCC_APB1Periph可以是

  * @param  RCC_APB1Periph: specifies the APB1 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  *          RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  *          RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  *          RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  *          RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  *          RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  *          RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  *          RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14

五,GPIO(General Purpose input/output)通用输入输出引脚

 GPIO基本结构

内核可以通过APB2总线对寄存器进行读写,完成输出电平和读取电平

输出寄存器寄存器写1,对应引脚输出高电平,0低电平

输入寄存器寄存器写1,对应引脚为高电平,0低电平

寄存器为32位,其中低16位对应PA0-15,高16位没用

驱动器:增加信号驱动力

GPIO位结构

GPIO_Mode

输入模式

  1. GPIO_Mode_AIN (0x0)

    • 定义:模拟输入模式。
    • 特点:引脚作为模拟信号输入使用,通常用于ADC(模数转换器)。
    • 应用场景:模拟传感器信号输入。
  2. GPIO_Mode_IN_FLOATING (0x04)

    • 定义:浮空输入模式。
    • 特点:引脚处于高阻态,无内部上拉或下拉电阻,输入状态完全由外部电路决定。
    • 悬空,电平会不停跳动
    • 应用场景:外部电路提供明确电平信号。如果外部的输入信号功率很小,内部上拉电阻可能影响到这个输入信号,就可以使用浮空输入。
  3. GPIO_Mode_IPD (0x28)

    • 定义:下拉输入模式。
    • 特点:引脚内部连接下拉电阻,未连接外部电路时,默认低电平。
    • 应用场景:开关或按钮未按下时引脚保持低电平。
  4. GPIO_Mode_IPU (0x48)

    • 定义:上拉输入模式。
    • 特点:引脚内部连接上拉电阻,未连接外部电路时,默认高电平。
    • 应用场景:开关或按钮未按下时引脚保持高电平。

输出模式

  1. GPIO_Mode_Out_OD (0x14)

    • 定义:开漏输出模式。
    • 特点:引脚可以输出低电平或高阻态(不主动驱动高电平),需要外部上拉电阻来拉高电平。高电平相当于高阻态,没有驱动能力低电平有驱动能力
    • 应用场景:I2C总线、多个设备共用一条信号线。
  2. GPIO_Mode_Out_PP (0x10)

    • 定义:推挽输出模式。
    • 特点:引脚可以主动驱动高电平和低电平,输出驱动能力强。高低电平均有驱动能力
    • 应用场景:普通的数字输出,如LED控制。

复用功能模式

  1. GPIO_Mode_AF_OD (0x1C)

    • 定义:复用开漏输出模式。
    • 特点:引脚用于复用功能(如USART、I2C等),输出开漏模式,需要外部上拉电阻。
    • 高电平相当于高阻态,没有驱动能力,低电平有驱动能力
    • 引脚控制权来自于输出数据寄存器,如果想要使用复用开漏/推挽输出
    • 应用场景:I2C总线、复用功能需要开漏输出的场合。
  2. GPIO_Mode_AF_PP (0x18)

    • 定义:复用推挽输出模式。
    • 特点:引脚用于复用功能,输出推挽模式,能主动驱动高低电平。
    • 高低电平均有驱动能力
    • 应用场景:复用功能如USART、SPI等,要求强输出驱动能力。

输出配置框图

普通开漏 / 推挽输出

复用开漏 / 推挽输出​​​​​​​

GPIO库函数

在gpio.h文件中

//复位GPIO外设,参数可以是GPIOA、GPIOB等等
void GPIO_DeInit(GPIO_TypeDef* GPIOx);

//复位AFIO外设
void GPIO_AFIODeInit(void);

//重要
//用结构体参数来初始化GPIO口
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

//把结构体变量赋一个默认值
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

//下面4个是GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);    //读取输入寄存器某一端口的输入值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);    //读取整个输入数据寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);   //读取输出数据寄存器的某一位 
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);    //读取整个输出数据寄存器

//下面4个是GPIO写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);    //将指定端口设置为高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);    //将指定端口设置为低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);    //同时对16个端口进行写入操作

//
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

STM32引脚定义图

注意A15、B3、B4口默认是JTAG的调试端口,如果要用作普通端口,还要进行一些配置

JTAG(Joint Test Action Group)是一种标准的测试和调试接口,用于测试和调试集成电路(IC),包括微控制器如STM32。JTAG是一种串行接口标准(IEEE 1149.1),允许在芯片上进行调试、编程和测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值