stm32 总结 - 各基本功能的库函数配置过程查询

1、配置步骤

GPIO

  • 头文件:stm32f4xx_gpio.h
  • 源文件:stm32f4xx_gpio.c
GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
  // GPIOF初始化设置
  .....
  // 初始化 
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10

NVIC

// 1. 系统运行后先设置中断优先级分组。调用函数:
/* 注:整个系统执行过程当中,只设置一次中断分组 */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
// 2. 针对每一个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
// 3. 若是须要挂起/解挂,查看中断当前激活状态,分别调用相关函数便可

UART 串口通讯

// 1. 串口和gpio时钟使能
RCC_APBxPeriphClockCmd();  // 串口时钟使能
RCC_AHB1PeriphClockCmd(); // GPIO时钟使能
// 2. 引脚复用映射:
GPIO_PinAFConfig();
// 3. GPIO端口模式设置:
GPIO_Init(); //模式设置为GPIO_Mode_AF
// 4. 串口参数初始化:
USART_Init();
// 5. 开启中断而且初始化NVIC(若是须要开启中断才须要这个步骤)
NVIC_Init();
USART_ITConfig();
// 6. 使能串口:
USART_Cmd();


// 1. 编写中断处理函数:
USARTx_IRQHandler();
// 2. 串口传输状态获取:
FlagStatus USART_GetFlagStatus();
void USART_ClearITPendingBit();
// 3. 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

EXTI

// 1. 使能SYSCFG时钟: 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
// 2. 初始化IO口为输入。
GPIO_Init();
// 3. 设置IO口与中断线的映射关系。
void SYSCFG_EXTILineConfig();
// 4. 初始化线上中断,设置触发条件等。
EXTI_Init();
// 5. 配置中断分组(NVIC),并使能中断。
NVIC_Init();
// 6. 编写中断服务函数。
EXTIx_IRQHandler();
// 7. 清除中断标志位
EXTI_ClearITPendingBit();

TIMx 定时器

  • 头文件:stm32f4xx_tim.h
  • 源文件:stm32f4xx_tim.c
// 1. 能定时器时钟。
RCC_APB1PeriphClockCmd();
// 2. 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
// 3. 开启定时器中断,配置NVIC。
NVIC_Init();
// 4. 使能定时器。
TIM_Cmd();
// 5. 编写中断服务函数。
TIMx_IRQHandler();

PWM输出

// 1. 使能定时器14和相关IO口时钟。
RCC_APB1PeriphClockCmd();    // 使能定时器14时钟:
RCC_AHB1PeriphClockCmd ();   // 使能GPIOF时钟:
// 2. 初始化IO口为复用功能输出。
GPIO_Init();    /* GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 引脚设为复用功能 */
// 3. GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); 	
// 4. 初始化定时器:ARR,PSC等:
TIM_TimeBaseInit();
// 5. 初始化输出比较参数:
TIM_OC1Init();
// 6. 使能预装载寄存器: 
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); 
// 7. 使能自动重装载的预装载寄存器容许位
TIM_ARRPreloadConfig(TIM14,ENABLE);
// 8. 使能定时器。
// 9. 不断改变比较值CCRx,达到不一样的占空比效果:
TIM_SetCompare1();

ADC

// 1. 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  
GPIO_Init();      
// 2. 复位ADC1,同时设置ADC1分频因子。
ADC_DeInit();
// 3. 初始化ADC_CCR寄存器。
ADC_CommonInit();
// 4. 初始化ADC1参数,设置ADC1的工做模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)// 5. 使能ADC。
ADC_Cmd(ADC1, ENABLE);


// 1. 配置规则通道参数:
ADC_RegularChannelConfig();
// 2. 开启软件转换:
ADC_SoftwareStartConvCmd(ADC1);
// 3. 等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);

2、经常使用函数

GPIO

  • 头文件:stm32f4xx_gpio.h
  • 源文件:stm32f4xx_gpio.c
// 1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

// 2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

// 2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

// 4个设置输出电平函数:
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);

RCC

  • 头文件:stm32f4xx_rcc.h
  • 源文件:stm32f4xx_rcc.c
// 1. 时钟使能配置:
RCC_HSICmd, RCC_LSICmd, RCC_PLLCmd, RCC_PLLI2SCmd, 
RCC_PLLSAICmd, RCC_RTCCLKCmd,RCC_AHBxPeriphClockCmd
RCC_APBxPeriphClockCmd

// 2. 时钟源和时钟相关配置:
RCC_HSEConfig, RCC_LSEConfig, RCC_PLLConfig, 
RCC_PLLI2SConfig, RCC_PLLSAIConfig, RCC_MCO1Config, 
RCC_MCO2Config, RCC_SYSCLKConfig, RCC_HCLKConfig,
RCC_PCLK1Config,RCC_PCLK2Config,RCC_RTCCLKConfig,
RCC_I2SCLKConfig

// 3. 外设复位函数
RCC_AHB1PeriphResetCmd,RCC_AHB2PeriphResetCmd,
RCC_AHB3PeriphResetCmd,RCC_APB1PeriphResetCmd,
RCC_APB2PeriphResetCmd

// 4. 状态参数获取参数:
RCC_GetSYSCLKSource,RCC_GetClocksFreq,
RCC_GetFlagStatus,RCC_ClearFlag

// 5. RCC中断相关函数 :
RCC_ITConfig,RCC_ClearITPendingBit,RCC_GetITStatus

NVIC

// 设置中断优先级
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
// 使能/失能 中断
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
// 挂起/解挂 中断
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)// 读取当前中断是哪个
static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)

UART 串口

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断

void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位

EXTI

//设置IO口与中断线的映射关系
void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
   exp: SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//区别M3

//初始化中断线:触发方式等
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

//判断中断线中断状态,是否发生
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

//清除中断线上的中断标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

//这个函数很是重要,在使用外部中断的时候必定要先使能SYSCFG时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

TIMx 定时器

  • 头文件:stm32f4xx_tim.h
  • 源文件:stm32f4xx_tim.c
// 定时器使能函数
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
// 定时器中断使能函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
// 状态标志位的获取与清除
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

ADC

// ADC通用初始化(配置ADC_CCR寄存器的相关参数)
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
// ADC初始化
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
// 复位ADC1
void ADC_DeInit(ADC_TypeDef* ADCx)
// ADC使能函数
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
// ADC中断
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
// ADC使能软件转换函数 
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
// ADC 规则通道配置函数
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
// ADC 获取转换结果函数
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);