若STLINK就是连接不上,可以依次尝试以下办法:
- 更新STLINK驱动。
- 设备管理器删除未识别的设备,然后拔了重插。
- 关闭电源选项中的“USB选择性暂停”,然后重新插。https://www.bilibili.com/read/cv18126898
- 换一个STLINK。
注:宗旨就是遇到什么报错就百度什么报错,实在弄不成就换STLINK。
首先来看看STM32的芯片系统结构(只需要大致了解一下即可):
- Cortex-M3:内核。注意ICode、DCode、System是直接从内核引出的三根总线。
- Flash:存储编写的程序。ICode总线和DCode总线主要用于连接Flash闪存。
- SRAM:用于存储程序运行时的变量数据。
- ICode:指令总线。加载程序指令。
- DCode:数据总线。加载数据,如常量和调试参数。
- System:系统总线。连接到Flash以外其他外设上,如SRAM、FSMC(本课程不会用到)。
- AHB系统总线:先进高性能总线。用于挂载最基本的(如复位和时钟控制RCC、SDIO)、或者性能比较高的外设。
- APB2、APB1:先进外设总线。用于连接一般的外设。通常AHB(72MHz)性能总体高于APB,而APB2(72MHz)性能高于APB1(36MHz)。所以APB2连接外设中稍微重要的部分,如GPIO、各外设的1号接口;剩下的次要外设给APB1。
- 桥接2、桥接1:由于AHB和APB的总线协议、 总线速度、数据传输格式上的差异,需要加上2个桥接,来完成数据的转换和缓存。
- DMA2、DMA1:拥有和CPU相同的总线控制权,用于帮助CPU完成数据搬运这样简单但重复的活,相当于CPU的小秘书。若外设需要进行数据搬运,那么会直接找DMA(DMA请求),DMA就会获得总线控制权来搬运数据,整个过程无需CPU的参与。
上图给出了UP主自己做的STM32F103C8T6引脚定义。一些说明如下:
- 标红色的是电源相关的引脚,标蓝色的是最小系统相关的引脚,标绿色的是IO口、功能口引脚。所以 最小系统板主要关心红色和蓝色部分。
- 类型:S代表电源、I代表输入、O代表输出、I/O代表输入输出。
- I/O口电平:表示I/O所能容忍的电压,默认3.3V,FT表示最高容忍5V。注意没有FT标志的引脚都需要加装电平转换电路。
- 主功能:上电默认功能。
- 默认复用功能:I/O口上同时连接的外设功能引脚,配置IO口时可以设置是主功能/复用功能。
- 重定义功能:如果需要某一个端口上实现两个功能,那么可以将其中一个功能重映射到另一个空闲端口上,这个空闲端口的重定义功能需要包含相应的功能。
- 推荐优先使用加粗的IO口,没有加粗的可能需要配置或兼具其他功能,使用时需要注意。
下面来一一介绍这些引脚的功能(包括PA0~PA15、PB0~PB15、PC13~PC15、9个供电、2个时钟、1复位、1个BOOT0):
- 引脚1:备用电池供电。可接3V电池,系统断电时为芯片内部的RTC和备用寄存器提供电源。
- 引脚2:IO口/入侵检测/RTC。IO口输出或读取高低电平;入侵检测提供安全保障,可以将外部一些防拆的触点接在此端口,若触点电平变化,STM32芯片会自动清空寄存器数据;RTC可输出RTC校准时钟、RTC闹钟脉冲、秒脉冲。
- 引脚3、4:IO口/32.765kHzRTC晶振。
- 引脚5、6:系统主晶振,一般8MHz,芯片内的锁相环电路将时钟倍频成72MHz作为系统主时钟。
- 引脚7:系统复位引脚。N表示低电平复位。
- 引脚8、9:芯片内部模拟部分的电源,如ADC、RC振荡器等。VSS接地、VDD接3.3V。
- 引脚10~19、21~22、25~33、41~43、45~46:共26个默认普通IO口。 其中的PA0兼具WKUP功能,用于唤醒处于待机状态的STM32。
- 引脚20:IO口/BOOT1引脚。BOOT1引脚用于控制启动模式。
- 引脚23/24、35/36、47/48:系统的主电源口。STM32采用分区供电的方式,所以供电口多。
- 引脚34、37~40:IO口/调试端口。STM32支持SWD和JTAG两种调试方式。SWD只需SWDIO、SWCLK两根线;JTAG需要全部的5根。教程使用STLINK(SWD)下载程序,此时剩余3个引脚可配置成IO口。
- 引脚44:BOOT0,和BOOT1配合,用于启动配置。启动配置就是指定程序开始运行的位置,一般程序在Flash程序存储器中运行,但在某些情况下可以指定程序在别的地方开始执行以完成特殊功能。
- “主闪存存储器”启动模式最常用。
- “系统存储器”模式用于串口下载程序,系统存储器中存储的是一段STM32的BootLoader程序,其作用就是接收串口数据然后刷新到主闪存中。当5个调试端口全被配置成IO口时,单片机将无法再下载程序!! 此时只能使用串口下载程序的方式进行补救。另外,当手头上没有STLINK和JLINK,也可以使用串口来下载程序,通俗来说就是“刷机”。
- “内置SRAM”模式主要用于程序调试,使用较少,本教程不会出现。
- 注意BOOT值是在上电一瞬间(第4个时钟上升沿)有效,后面随意,即BOOT1引脚后续会变成普通IO口。
一般性描述:
- 进行某个外设初始化时,一定要注意先开启相应的RCC外设时钟,但是EXTI、内核外设(如NVIC)无需手动开启。
- 配置外设时钟时,可以参考上面的“STM32芯片系统结构”,以找到外设对应的位置。
- stm32中每个中断通道都对应一个固定的中断函数的名称,这些名称从启动文件
startup_stm32f10x_md.s
里查看,最开始后缀是xxxxHandler
的定义都是中断函数名。- 保险起见,每次进入中断函数时,都应该先看一下当前中断的中断标志位是否为SET状态。中断函数结束前,也一定要记得清除该中断的中断标志位。
GPIO外设配置:
- 关于GPIO的模式配置GPIO_Mode,可以查阅参考手册的“8.1.11 外设的GPIO配置”一节,里面已经规定好各种外设(如TIM、USART、SPI、IIC、CAN等)应该配置的GPIO模式。
GPIO_PinLockConfig
【使用不多】:用于锁定GPIO配置,防止配置被更改。GPIO_PinRemapConfig
【重要】:用于进行引脚重映射,不要随便动SWD调试端口。注意参数GPIO_Remap_SWJ_Disable
慎用!!会将PA13、PA14、PA15、PB3、PB4这5个调试端口全变成普通的GPIO口,失去调试功能,就不能使用STLINK下载程序了。恢复的方法就是使用串口重新下载初始化程序。
AFIO外设配置:
- 库函数在GPIO中。
GPIO_AFIODeInit
:复位AFIO外设,调用该函数会清除AFIO外设的全部配置。GPIO_EventOutputConfig
【使用不多】:用于配置AFIO的事件输出功能。GPIO_EventOutputCmd
【使用不多】:用于配置AFIO的事件输出功能。GPIO_EXTILineConfig
【重要】:配置AFIO的数据选择寄存器,来选择想要的中断引脚。
EXTI_DeInit
:将EXTI的配置清除,恢复成上电默认的状态。EXTI_Init
【常用】:根据结构体的参数配置EXTI外设,常用于初始化EXTI。EXTI_StructInit
:把参数传递的结构体变量赋默认值。
注:上面这个三个函数,基本上所有的外设都有。EXTI_GenerateSWInterrupt
:用于软件触发外部中断,使得相应的中断线产生一次外部中断。只需要外部引脚触发外部中断,则不需要这个函数。EXTI_GetFlagStatus
:获取指定的标志位状态。用于主程序。EXTI_ClearFlag
:清除指定的标志位。用于主程序。EXTI_GetITStatus
:获取中断标志位。用于中断函数。EXTI_ClearITPendingBit
:清除中断挂起标志位。用于中断函数。
上面这四个函数都是对状态寄存器的读写,只不过后两个函数只能读写与中断有关的标志位,并对中断是否允许做出了判断;前两个函数只是一般的读写标志位,没有额外的处理,能不能触发中断的标志位都能读取。
NVIC内核外设配置:(在misc文件中)
NVIC_PriorityGroupConfig
【重要】:用于中断分组,每个工程只允许出现一次。NVIC_Init
【重要】:根据结构体里面指定的参数初始化NVIC。其中NVIC_InitTypeDef
包括:
NVIC_IRQChannel
:中断通道,选择时看清芯片型号为stm32共有的中断通道以及STM32F10X_MD
系列中断通道。- 其他参数略。
NVIC_SetVectorTable
【使用不多】:设置中断向量表。NVIC_SystemLPConfig
【使用不多】:系统低功耗配置。
TIM_DeInit
:恢复默认配置。TIM_TimeBaseInit
【重要】:时基单元初始化。用于配置时基单元。TIM_TimeBaseStructInit
:为时基单元结构体赋一个默认值。TIM_Cmd
【常用】:对应定时中断基本结构的“运行控制”模块,用于使能时基单元的计数器。TIM_ITConfig
【常用】:“中断输出控制”模块,用于使能中断输出信号。下面6个函数对应时基单元的时钟源选择部分。
TIM_InternalClockConfig
【常用】:选择 内部时钟。TIM_ITRxExternalClockConfig
:选择 ITRx其他定时器 的时钟。TIM_TIxExternalClockConfig
:选择 TIx捕获通道 的时钟。TIM_ETRClockMode1Config
:选择 ETR通过外部时钟模式1 输入的时钟。TIM_ETRClockMode2Config
:选择 ETR通过外部时钟模式2 输入的时钟。TIM_ETRConfig
:不是用于选择时钟的,而是单独用来配置ETR引脚的预分频器、极性、滤波器等参数。下面是一些可以单独更改某些参数的函数,可以防止每次更改参数都要进行一次初始化。
TIM_PrescalerConfig
:单独更改时基单元 预分频 的值。还可以选择 预分频器 是否启用缓冲寄存器。TIM_CounterModeConfig
:单独改变时基单元计数器的计数模式。TIM_ARRPreloadConfig
:自动重装器的预装功能配置,也就是选择时基单元的 计数器 是否启用缓冲寄存器。TIM_SetClockDivision
:单独配置时基单元的 时钟分频系数。这个系数的作用位置比预分频器靠前,但功能与预分频器相同,只不过只能选择固定的分频系数(不分频、2分频、4分频),对分频要求不高则一般配置为不分频。TIM_SetCounter
:给计数器写入一个值。TIM_SetAutoreload
:给自动重装载寄存器写入一个值。TIM_GetCounter
:获取当前计数器的值。TIM_GetPrescaler
:获取当前的预分频器的值。最后4个是获取定时中断标志位和清除定时中断标志位的函数。
TIM_GetFlagStatus
:用于主函数,获取定时中断标志位的状态。TIM_ClearFlag
:用于主函数,清除定时中断标志位的状态。TIM_GetITStatus
:用于中断函数,获取定时中断标志位的状态。TIM_ClearITPendingBit
:用于中断函数,清除定时中断标志位的状态。
TIM_OC1Init
【常用】:配置第一路输出比较模块。TIM_OC2Init
、TIM_OC3Init
、TIM_OC4Init
则分别是配置第二、三、四路。TIM_OCStructInit
【常用】:给输出比较结构体赋一个默认值。TIM_CtrlPWMOutputs
【重要】:仅高级定时器使用,使用高级定时器输出PWM波时,必须调用此函数,否则PWM将不能正常输出。TIM_ForcedOC1Config
【不常用】:配置强制输出模式,但由于占空比100%输出高电平、0%输出低电平,与强制输出高、低电平等价,所以使用不多。第二、三、四路同理。TIM_OC1PreloadConfig
【不常用】:用于配置CCR寄存器的预装功能,即CCR的影子寄存器。不会立即生效,而是在更新时间后才会生效。第二、三、四路同理。TIM_CCPreloadControl
:一次性设置所有的4路输出比较通道寄存器CCR的预装载方式,也就是是否启用影子寄存器。TIM_OC1FastConfig
【不常用】:用于配置快速使能,在参考手册“14.3.10单脉冲模式”有介绍。第二、三、四路同理。TIM_ClearOC1Ref
【不常用】:在参考手册“14.3.11在外部事件时清除OCxREF信号”有介绍。第二、三、四路同理。TIM_OC1PolarityConfig
、TIM_OC1NPolarityConfig
:用于单独设置输出比较的极性,第二、三、四路同理。带N的函数就是高级定时器里互补通道的配置。这个极性设置与 输出比较模块结构体 中的设置极性相同。一般来说结构体中的参数都有一个专门的函数用于修改。TIM_CCxCmd
、TIM_CCxNCmd
:用于单独修改输出使能参数。TIM_SelectOCxM
:用于单独更改输出比较模式的函数。TIM_SetCompare1
【重要】:用于单独更改CCR寄存器的值,可以更改PWM波的占空比。第二、三、四路同理。
TIM_ICInit
【常用】:初始化输入捕获单元,只能配置单一通道。注意与输出比较模块的四个通道各自有一个初始化函数不同,输入捕获模块的四个通道共用一个初始化函数。这是因为有交叉通道的配置,整合在一个函数中会比较方便。TIM_PWMIConfig
【常用】:初始化输入捕获单元。可以快速的配置通道1和通道2的PWMI模式。TIM_ICStructInit
:给输入捕获结构体赋一个初值。TIM_GetCapture1
【重要】:读取输入捕获通道1的 输入/捕获寄存器CCR1 的值。第二、三、四路同理。下面四个函数是配置主从触发模式:
TIM_SelectOutputTrigger
【常用】:选择主模式的输出触发源TRGO。TIM_SelectInputTrigger
【常用】:选择从模式的输入触发源TRGI。TIM_SelectSlaveMode
【常用】:选择从模式要执行的操作。TIM_SelectMasterSlaveMode
:选择是否使能主从触发模式。下面是单独修改输入捕获通道某些参数:
TIM_SetIC1Prescaler
:单独配置输入捕获通道1的预分频值。第二、三、四路同理。
TIM_EncoderInterfaceConfig
【常用】:配置编码器接口。下面是目前还没有涉及到的TIM库函数:
TIM_BDTRConfig
:用于配置定时器的 BDTR(Break and Dead-Time Register)寄存器。TIM_BDTRStructInit
:给 BDTR 寄存器的配置参数结构体 TIM_BDTRInitTypeDef 赋一个初值。TIM_GenerateEvent
:强制定时器产生中断。TIM_DMAConfig
:配置TIM模块的 DMA传输功能。stm32中定时器模块可以与 DMA 控制器进行集成,通过 DMA 传输机制实现定时器的计数器值、比较寄存器值等数据的快速传输,减少 CPU 的负担,提高系统的效率。TIM_DMACmd
:使能或禁用定时器的 DMA 传输功能。TIM_SelectCOM
:选择定时器模块的复合输出模式(Complementary Output Mode)包括主输出模式、复合模式、复合滤波模式等。COM模式可以实现多种输出波形的生成,例如矩形波、三角波、脉冲波等,同时还可以实现硬件互锁、反相输出、输出极性选择等功能。TIM_SelectCCDMA
:使能或禁用通道比较DMA传输状态。TIM_UpdateDisableConfig
:使能或禁用定时器的更新事件。TIM_UpdateRequestConfig
:配置更新请求(URS)寄存器的功能,从而实现定时器的周期性更新。。TIM_SelectHallSensor
:选择不同的霍尔传感器模式,从而实现电机的精确控制。TIM_SelectOnePulseMode
:选择单脉冲模式,从而实现精确的时间控制。
ADC初始化/一般性配置:
RCC_ADCCLKConfig
【必需】:配置 ADCCLK 的分频器(rcc库函数)。可以对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCLK。但由于ADCCLK规定不能超过14MHz,所以一般选择分频系数为6。ADC_DeInit
:将ADCx的配置恢复成默认值。ADC_Init
【必需】:ADC的初始化函数。ADC_StructInit
:给ADC结构体赋一个默认值。ADC_Cmd
【必需】:ADC外设的开关控制,用于给ADC上电。- 间断模式:
ADC_DiscModeCmd
:是否启用间断模式。ADC_DiscModeChannelCountConfig
:配置间断模式,每隔几个通道间断一次。- 触发转换:
ADC_SoftwareStartConvCmd
:软件触发。用于软件触发ADC进行转换。ADC_ExternalTrigConvCmd
:ADC外部触发转换控制。是否允许外部触发转换。默认关闭。ADC_GetSoftwareStartConvStatus
【不常用】:获取软件开始转换状态,看看规则通道是否已经开始转换,但并不能用于指示转换的结束。- 配置通道:
ADC_TempSensorVrefintCmd
:开启内部的温度传感器、参考电压通道作为输入源。ADC_RegularChannelConfig
【必需】:ADC规则组通道配置。给序列的每个位置填写指定的通道。- 获取结果:
ADC_GetFlagStatus
:获取ADC内任意指定标志位状态(比如转换结束标志位EOC)。ADC_ClearFlag
:清除所选定的标志位。ADC_GetConversionValue
:获取ADC转换值,就是用于读取转换之后的结果。ADC_GetDualModeConversionValue
:获取ADC双模式转换值。ADC校准【必需】:ADC初始化完成后,依次调用即可。
ADC_ResetCalibration
:复位校准。ADC_GetResetCalibrationStatus
:获取校准状态。ADC_StartCalibration
:开始校准。ADC_GetCalibrationStatus
:获取开始校准状态。注入组的配置:
ADC_AutoInjectedConvCmd
ADC_InjectedDiscModeCmd
ADC_ExternalTrigInjectedConvConfig
ADC_ExternalTrigInjectedConvCmd
ADC_SoftwareStartInjectedConvCmd
ADC_GetSoftwareStartInjectedConvCmdStatus
ADC_InjectedChannelConfig
ADC_InjectedSequencerLengthConfig
ADC_SetInjectedOffset
ADC_GetInjectedConversionValue
DMA相关:
ADC_DMACmd
:开启DMA,使其可以转运数据。中断相关:
ADC_AnalogWatchdogCmd
:软件看门狗使能。ADC_AnalogWatchdogThresholdsConfig
:软件看门狗的上下阈值配置。ADC_AnalogWatchdogSingleChannelConfig
:软件看门狗的通道配置。ADC_ITConfig
:ADC的中断输出控制。用于控制某个中断能否通向NVIC。ADC_GetITStatus
:获取中断标志位。ADC_ClearITPendingBit
:清除中断标志位。
DMA_DeInit
:将DMA恢复到默认配置。DMA_Init
【必需】:DMA初始化。DMA_StructInit
:给DMA的初始化结构体赋一个初值。DMA_Cmd
【必需】:DMA的开关控制。DMA_ITConfig
:DMA的中断输出使能,用于开启DMA中断。DMA_SetCurrDataCounter
:设置DMA计数器。DMA_GetCurrDataCounter
:获取当前DMA的计数器值。DMA_GetFlagStatus
:主函数,获取DMA的各种标志位。DMA_ClearFlag
:主函数,清除DMA各种标志位。DMA_GetITStatus
:中断函数,获取DMA的各种标志位。DMA_ClearITPendingBit
:中断函数,清除DMA的各种标志位。
一般性配置和正常收发数据功能:
USART_DeInit
:将USART结构体恢复成默认值。USART_Init
【必需】:初始化USART结构体。USART_StructInit
:给USART结构体赋一个初值。USART_Cmd
【常用】:USART的开关控制。USART_ITConfig
【常用】:USART的中断配置。USART_SendData
【常用】:发送数据,写DR寄存器。USART_ReceiveData
【常用】:接收数据,读DR寄存器。USART_GetFlagStatus
:主函数调用,获取USART的各种标志位。USART_ClearFlag
:主函数调用,清除USART指定的标志位。USART_GetITStatus
:中断函数调用,获取中断状态。USART_ClearITPendingBit
:中断函数调用,清除中断状态。其他单独的配置:
USART_SetGuardTime
:在两个连续字符之间添加一个额外的时间间隔,默认为1位。USART_SetPrescaler
:设置波特率发生器的预分频值DIV,以产生相应的比特率。USART_HalfDuplexCmd
:启用或禁用半双工模式。USART_OverSampling8Cmd
:启用或禁用USART的8倍过采样模式。在8倍过采样模式下,USART对串行数据线的采样次数将达到8次,从而提高数据传输的精度和可靠性。USART_OneBitMethodCmd
:启用或禁用单线半双工通信模式。DMA触发源:
USART_DMACmd
:开启USART的DMA硬件触发源。时钟同步功能:
USART_ClockInit
:时钟输出功能,时钟输出初始化。USART_ClockStructInit
:时钟输出功能,时钟输出结构体初始化。流控功能(总线通信):
USART_SetAddress
:总线通信功能,设置USART的地址。USART_WakeUpConfig
:总线通信功能,启用USART唤醒功能,检测到特定事件就会被唤醒。USART_ReceiverWakeUpCmd
:总线通信功能,启用USART的接收唤醒功能,接收到特定的数据包就会被唤醒。LIN总线通信:
USART_LINBreakDetectLengthConfig
:LIN模式,检测到BREAK信号的长度。USART_LINCmd
:开启LIN模式。USART_SendBreak
:发送一个BREAK信号。智能卡模式:
USART_SmartCardCmd
:启用或禁用智能卡模式。USART_SmartCardNACKCmd
:在USART智能卡模式中,启用或禁用非应答模式。红外接收IrDA模式:
USART_IrDAConfig
:配置USART通信中的红外数据通信模式。USART_IrDACmd
:启用或禁用红外数据通信模式(IrDA)。
I2C_DeInit
:将I2C外设的寄存器恢复成默认值。I2C_Init
【必需】:初始化I2C。I2C_StructInit
:将指定的I2C初始化结构体中的成员变量设置为默认值。I2C_Cmd
【必需】:开启I2C外设。收发时序常用:
I2C_GenerateSTART
:生成起始条件。I2C_GenerateSTOP
:生成终止条件。I2C_AcknowledgeConfig
:配置应答使能。也就是stm32作为主机,收到1个字节后,是否给从机应答。I2C_SendData
:发送数据。将数据写入到DR寄存器。I2C_ReceiveData
:接收数据。从DR寄存器中读取数据。I2C_Send7bitAddress
:发送7位地址的专用函数。当然也可以用I2C_SendData
函数完成该功能。I2C_FastModeDutyCycleConfig
:用于配置I2C的快速模式(Fast-mode)占空比。这个一般再初始化的时候就配置好不变了。状态监控函数:(更多细节内容可以查看源码注释)
上文提到EVx事件可能会包含多个标志位,如果一个一个判断可能非常麻烦,所以i2c的库函数还额外给出了“状态监控函数”,来辅助用户同时判断多个标志位,以确定某个EVx状态是否发生。下面有三种方法:
- 基本状态监控——
I2C_CheckEvent
【推荐】。可以同时判断一个或多个标志位,来确定EVx状态是否发生,UP主推荐。- 高级状态监控——
I2C_GetLastEvent
。实际并不高级,只是将两个状态寄存器SR1、SR2拼接成16位数据发送给用户。不推荐。- 基于标志位的状态监控——
I2C_GetFlagStatus
。就是一次判断一个标志位。
I2C_ClearFlag
:清除标志位。主函数调用。I2C_GetITStatus
:读取中断标志位。中断函数调用。I2C_ClearITPendingBit
:清除中断标志位。中断函数调用。I2C_ITConfig
:使能或禁用I2C的中断功能。DMA配置:
I2C_DMACmd
:使能或禁用I2C外设的DMA传输,也就是DMA的硬件触发源。默认禁用。I2C_DMALastTransferCmd
:控制I2C外设在DMA传输结束后是否自动停止传输。广播通信模式/双地址模式:
I2C_OwnAddress2Config
:用于配置I2C外设的第二个从设备地址,该地址用于从设备模式中的广播通信。I2C_DualAddressCmd
:用于使能或禁用I2C外设的双地址模式。I2C_GeneralCallCmd
:使能或禁用I2C总线的广播通信模式。SMBus协议:
I2C_SMBusAlertConfig
:用于配置SMBus Alert功能。PEC校验:
I2C_TransmitPEC
:启用或禁用I2C协议中的PEC(Packet Error Checking)校验。I2C_PECPositionConfig
:配置PEC校验码在I2C通信帧中的位置。I2C_CalculatePEC
:用于计算给定数据块的PEC校验码。I2C_GetPEC
:用于获取接收到的I2C数据帧的PEC校验码。其他配置:
I2C_ReadRegister
:通用的读取寄存器函数,用于读取I2C外设的寄存器值。I2C_SoftwareResetCmd
:用于向I2C总线发送软件复位命令,将I2C外设复位到初始状态,以便重新开始通信。当I2C外设出现异常或通信故障时,可以通过软件复位命令将其恢复到正常状态。I2C_NACKPositionConfig
:用于配置I2C外设在接收数据时的非应答位位置,在数据字节的哪个位置发送NACK位。I2C_ARPCmd
:用于使能或禁用I2C的自动重试机制(Automatic Retry Mechanism)。自动重试机制的原理是当发送方无法收到接收方的应答信号时,会自动重新发送数据帧,直到接收方成功应答为止。自动重试机制的次数可以通过软件编程进行配置。I2C_StretchClockCmd
:用于使能或禁用I2C时钟延长功能(Clock Stretching)。I2C从设备可以通过拉低时钟线的方式来向主设备表示其未准备好接收数据,主设备需要等待从设备准备好之后再继续传输数据。