一、配置步骤
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);
二、常用函数
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);
版权声明:本文为CChoro原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。