姓名:祝俊宝 日期:2018.07.27函数
今日学习任务 | 一、复习昨天内容学习 二、实现4个按键分别控制4个彩灯亮灭spa |
今日任务完成状况 | 均完成 |
今日开发问题汇总 | 无code |
今日未解决问题 | 无ip |
今日开发收获 | 经过自主学习,消化了前两天的学习内容,对stm32单片机的理解加深了 |
自我评价 | 良好 |
部分代码 | #include "bsp_key.h" /**********按键与中断线对应关系****** | | key1 = PA0 | LED1 = PC1 | key2 = PC13 | LED2 = PC2 | key3 = PA2 | LED3 = PC3 | key4 = PB5 | LED4 = PC4 | | | ************************************/ void Key_Exit_Config(void) { //结构体变量声明 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /******************************************** 使能I/O口时钟,选择GPIOA,GPIOB,GPIOC三个口 开启SYSCFG时钟 ********************************************/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /***************************** 初始化I/O口为输入浮空模式, 根据指定的参数初始化GPIOX外设 *****************************/ //浮空模式 GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13); //PC13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //根据指定的参数初始化GPIOX外设 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_5); //PB5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_2); //PA0和PA2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /*************************** 配置GPIO口与中断线的映射关系 至关于把GPIOx口与中断线连起来 ***************************/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); /************************** 初始化中断线 配置触发条件,模式等参数 **************************/ EXTI_InitStructure.EXTI_Line = (EXTI_Line13 | EXTI_Line5 | EXTI_Line0 | EXTI_Line2); //选择须要用到的中断线 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /* 上升沿触发 */ EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /************************* 配置中断分组,并使能中断 配置中断通道,中断优先级等参数 **************************/ //PC13 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; //抢占优先级0x0e NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; //相应优先级0x0e NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化 //PB5 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //IRQ指的是中断请求 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //PA0 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //IRQ指的是中断请求 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //PA2 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //IRQ指的是中断请求 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /***********中断服务函数********************* 不一样中断线对应不一样中断函数,可根据须要写多个 中断函数 ********************************************/ void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { //PA0,KEY1按下 GPIO_ToggleBits(GPIOC,GPIO_Pin_1); EXTI_ClearITPendingBit(EXTI_Line0); printf("PA0 中断\r\n"); } } void EXTI15_10_IRQHandler(void) { /* PC13, K2按下*/ if (EXTI_GetITStatus(EXTI_Line13) != RESET) { GPIO_ToggleBits(GPIOC,GPIO_Pin_2); EXTI_ClearITPendingBit(EXTI_Line13); printf("PC13 中断\r\n"); } } void EXTI2_IRQHandler(void) { //PA2,K3按下 if (EXTI_GetITStatus(EXTI_Line2) != RESET) { GPIO_ToggleBits(GPIOC,GPIO_Pin_3); EXTI_ClearITPendingBit(EXTI_Line2); printf("PA2 中断\r\n"); } } void EXTI9_5_IRQHandler(void) { //PB5,K4按下 if (EXTI_GetITStatus(EXTI_Line5) != RESET) { GPIO_ToggleBits(GPIOC,GPIO_Pin_4); EXTI_ClearITPendingBit(EXTI_Line5); printf("PB5中断\r\n"); } } |