(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行,一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。
浮空输入:由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
GPIOGPIO_Init函数初始化{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟//GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10}2个读取输入电平函数:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);作用:读取某个GPIO的输入电平。
实际操作的是GPIOx_IDR寄存器。
例如:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);作用:读取某组GPIO的输入电平。
实际操作的是GPIOx_IDR寄存器。
例如:GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平2个读取输出电平函数:uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);作用:读取某个GPIO的输出电平。
实际操作的是GPIO_ODR寄存器。
例如:GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);作用:读取某组GPIO的输出电平。
实际操作的是GPIO_ODR寄存器。
例如:GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平4个设置输出电平函数:void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);作用:设置某个IO口输出为高电平(1)。
实际操作BSRRL寄存器void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);作用:设置某个IO口输出为低电平(0)。
实际操作的BSRRH寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);后两个函数不常用,也是用来设置IO口输出电平。
端口复用为复用功能配置过程-以PA9,PA10配置为串口1为例1、GPIO端口时钟使能。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);2、复用外设时钟使能。
比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);3、端口模式配置为复用功能。
GPIO_Init()函数。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能中断优先级设置步骤1、系统运行后先设置中断优先级分组。
调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整个系统执行过程中,只设置一次中断分组。
2、针对每个中断,设置对应的抢占优先级和响应优先级:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
独立看门狗操作步骤1、取消寄存器写保护:IWDG_WriteAccessCmd();2、设置独立看门狗的预分频系数,确定时钟:IWDG_SetPrescaler();3、设置看门狗重装载值,确定溢出时间:IWDG_SetReload();4、使能看门狗IWDG_Enable();5、应用程序喂狗:IWDG_ReloadCounter();溢出时间计算:Tout=((4×2^prer) ×rlr) /32 (M4)在主函数,要设置中断优先级分组NVIC_PriorityGroupConfig();delay_init(168); 配置时钟窗口看门狗配置过程void WWDG_Init(u8 tr,u8 wr,u32 fprer)1、使能看门狗时钟:RCC_APB1PeriphClockCmd();2、设置分频系数:WWDG_SetPrescaler();3、设置上窗口值:WWDG_SetWindowValue();4、开启提前唤醒中断并分组(可选):WWDG_EnableIT();NVIC_Init();WWDG_ClearFlag();//清除提前唤醒标志位5、使能看门狗:WWDG_Enable();;7、编写中断服务函数WWDG_IRQHandler();1)喂狗:WWDG_SetCounter();2)清除标志位WWDG_ClearFlag();在主函数,要设置中断优先级分组NVIC_PriorityGroupConfig();delay_init(168); 配置时钟外部中断STM32F4的每个IO都可以作为外部中断输入。
STM32F4的中断控制器支持22个外部中断/事件请求EXTI线0~15:对应外部IO口的输入中断。
EXTI线16:连接到PVD输出。
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB OTG FS唤醒事件。
EXTI线19:连接到以太网唤醒事件。
EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
EXTI线21:连接到RTC入侵和时间戳事件。
EXTI线22:连接到RTC唤醒事件。
外部中断的一般配置步骤: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();1)清除中断标志位EXTI_ClearITPendingBit();在主函数,要设置中断优先级分组NVIC_PriorityGroupConfig();delay_init(168); 配置时钟串口配置的一般步骤1、串口时钟使能:RCC_APBxPeriphClockCmd();GPIO时钟使能:RCC_AHB1PeriphClockCmd();2、引脚复用映射:GPIO_PinAFConfig();3、GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF4、串口参数初始化:USART_Init();5、开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)NVIC_Init();USART_ITConfig();6、使能串口:USART_Cmd();7、编写中断处理函数:USARTx_IRQHandler();8、串口数据收发:void USART_SendData();//发送数据到串口,DRuint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据9、串口传输状态获取:FlagStatus USART_GetFlagStatus();void USART_ClearITPendingBit();串口中断服务函数不用清除中断在主函数,要设置中断优先级分组NVIC_PriorityGroupConfig();定时器中断实现步骤void Timx_init(u8 arr,psc);1、能定时器时钟。
RCC_APB1PeriphClockCmd();2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();TIM_TIConfig();//使能更新中断3、开启定时器中断,配置NVIC。
NVIC_Init();4、使能定时器。
TIM_Cmd();5、编写中断服务函数。
TIMx_IRQHandler();1)判断中断模式TIM_GetTIStatus(TIMx,中断模式);2)清除标志TIM_ClearITPendingBit();在主函数,要设置中断优先级分组NVIC_PriorityGroupConfig();delay_init(168); 配置时钟PWM输出配置步骤:void TIM14_PWM_Init(u32 arr,u32 psc);1、使能定时器14和相关IO口时钟。