一外设 (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单片机能够实现各种复杂的功能。四RCCReset and Clock Control复位和时钟控制负责管理微控制器的时钟树还有外设的晶振、内部振荡器以及各种时钟源的分频和倍频。可以控制各个外设的时钟使能确保只有当前使用设备才会消耗能量。什么是外设时钟指用于驱动外设模块的时钟信号。每个外设模块如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_TIM11RCC_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五GPIOGeneral Purpose input/output通用输入输出引脚GPIO基本结构内核可以通过APB2总线对寄存器进行读写完成输出电平和读取电平输出寄存器寄存器写1对应引脚输出高电平0低电平输入寄存器寄存器写1对应引脚为高电平0低电平寄存器为32位其中低16位对应PA0-15高16位没用驱动器增加信号驱动力GPIO位结构GPIO_Mode输入模式GPIO_Mode_AIN (0x0)定义模拟输入模式。特点引脚作为模拟信号输入使用通常用于ADC模数转换器。应用场景模拟传感器信号输入。GPIO_Mode_IN_FLOATING (0x04)定义浮空输入模式。特点引脚处于高阻态无内部上拉或下拉电阻输入状态完全由外部电路决定。悬空电平会不停跳动应用场景外部电路提供明确电平信号。如果外部的输入信号功率很小内部上拉电阻可能影响到这个输入信号就可以使用浮空输入。GPIO_Mode_IPD (0x28)定义下拉输入模式。特点引脚内部连接下拉电阻未连接外部电路时默认低电平。应用场景开关或按钮未按下时引脚保持低电平。GPIO_Mode_IPU (0x48)定义上拉输入模式。特点引脚内部连接上拉电阻未连接外部电路时默认高电平。应用场景开关或按钮未按下时引脚保持高电平。输出模式GPIO_Mode_Out_OD (0x14)定义开漏输出模式。特点引脚可以输出低电平或高阻态不主动驱动高电平需要外部上拉电阻来拉高电平。高电平相当于高阻态没有驱动能力低电平有驱动能力应用场景I2C总线、多个设备共用一条信号线。GPIO_Mode_Out_PP (0x10)定义推挽输出模式。特点引脚可以主动驱动高电平和低电平输出驱动能力强。高低电平均有驱动能力应用场景普通的数字输出如LED控制。复用功能模式GPIO_Mode_AF_OD (0x1C)定义复用开漏输出模式。特点引脚用于复用功能如USART、I2C等输出开漏模式需要外部上拉电阻。高电平相当于高阻态没有驱动能力低电平有驱动能力引脚控制权来自于输出数据寄存器如果想要使用复用开漏/推挽输出应用场景I2C总线、复用功能需要开漏输出的场合。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的调试端口如果要用作普通端口还要进行一些配置JTAGJoint Test Action Group是一种标准的测试和调试接口用于测试和调试集成电路IC包括微控制器如STM32。JTAG是一种串行接口标准IEEE 1149.1允许在芯片上进行调试、编程和测试。