一.常用函数
1.开启时钟函数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*打开APB2外设RCC的时钟*/
2.向GPIO口置0置1
GPIO_SetBits(GPIOA,GPIO_Pin_1);
/*向PA1口置1 */
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
/*向PA1口置0 */
3.读取GPIO电平
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
/*读取PA0的电平状态 */
二.配置中断优先级函数
void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
/*初始化NVIC结构体 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*设置优先级分组为组一,组的区别具体在教材P133 */
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
/*选择中断源为EXTI0(EXTI Line0的中断源) */
/*注意:*/
/*EXTI0 EXTI1 EXTI2 EXTI3 EXTI4 对应中断源分别为 EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn */
/*EXTI5 EXTI6 EXTI7 EXTI8 EXTI9 对应中断源分别为 EXTI9_5_IRQn */
/*EXTI10 EXTI11 EXTI12 EXTI13 EXTI14 EXTI15 对应中断源分别为 EXTI15_10_IRQn */
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
/* 主优先级(抢占优先级)设置为1 (优先级数字越小,优先级越高) */
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
/* 子优先级(响应优先级)设置成1 */
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/*使能NVIC总中断 */
NVIC_Init(&NVIC_InitStruct);
}
三.GPIO初始化函数(需要包含stm32f10x_gpio.h头文件)
1.GPIO初始化函数程序
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*初始化GPIO结构体 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
/*打开APB2外设GPIOx端口的时钟 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_标号|GPIO_Pin_标号;
/*管脚位置定义,标号可以是NONE、ALL、 0至15 */
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*最高输出速度为50MHz */
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*推挽输出*/
GPIO_Init(GPIOx,&GPIO_InitStructure); /*GPIOx初始化 */
/*注:以上四行代码为一组,每组GPIO属性必须相同,默认的GPIO参数为:ALL,2MHz,FLATING。如果其中任意一行与前一组相应设置相同,那么那一行可以省略,由此推论如果前面已经将此行参数设定为默认参数(包括使用GPIO_InitTypeDefGPIO_InitStructure代码),本组应用也是默认参数的话,那么也可以省略。以下重复这个过程直到所有应用的管脚全部被定义完毕。*/
}
2.GPIO_Mode的四种输入、四种输出模式:
(1)输入(GPIO调成输入后不用设置速度)
GPIO_Mode_IPU /*上拉输入 */
GPIO_Mode_IPD /*下拉输入 */
GPIO_Mode_AIN /*模拟输入 */
GPIO_Mode_IN_FLOATING /*浮空输入(GPIO的 默认电平由外部决定) */
(2)输出
GPIO_Mode_Out_PP /*普通推挽输出 */
GPIO_Mode_Out_OD /*普通开漏输出 */
GPIO_Mode_AF_PP /*复用推挽输出 */
GPIO_Mode_AF_OD /*复用开漏输出 */
四.EXTI初始化函数(需要包含stm32f10x_exti.h头文件)
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
/*初始化EXTI结构体*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*打开APB2外设AFIO的时钟*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
/*配置中断事件(输入线选择PA0作为中断标志位)*/
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
/*输入线选择EXTI_Line0(EXTI_Linex,当x属于0-15时,代表GPIOx_(0~15))*/
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
/*配置模式为中断模式*/
/*模式有两种:*/
/*中断模式 EXTI_Mode_Interrupt */
/*事件模式 EXTI_Mode_Event */
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
/*选择是上升沿还是下降沿触发中断*/
/*触发方式有三种:*/
/*上升沿 EXTI_Trigger_Rising */
/*下降沿 EXTI_Trigger_Falling */
/*上升沿和下降沿 EXTI_Trigger_Rising_Falling*/
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
/*使能中断屏蔽事件寄存器*/
EXTI_Init(&EXTI_InitStruct);
}
五.编写中断服务函数
void EXTI0_IRQHandler(void)
/*起名规律:因为使用的是EXTI0的中断,所以起名为EXTI0的中断服务函数*/
{
if(EXTI_GetITStatus(EXTI_Line0) == 1)
{
GPIOB->ODR ^= GPIO_Pin_0;
}
/*判断中断标志位有没有置位,如果产生中断(即条件为真),令PB0翻转*/
EXTI_ClearITPendingBit(EXTI_Line0);
/*清除中断标志位,防止一直在中断里面*/
}
六.主函数
int main(void)
{
EXTI_NVIC_Config(); /*配置中断优先级*/
GPIO_Configuration(); /*初始化GPIO*/
EXTI_Configuration(); /初始化EXTI*/
EXTI0_IRQHandler(); /*编写中断服务函数*/
}
注意!!
中断服务函数
void EXTI0_IRQHandler(void)
的函数名不能更改