STM32:STM32学习记录5: 外部中断
2016-03-12 15:32
281 查看
配置流程:
1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。
2:IO口初始化,包括引脚,速率,输入输出模式等。
3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。
4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。
说明:
1:主函数写在main.c中,中断函数写在stm32f10x_it.c
中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。
2:中断函数名在startup_stm32f10x_xx.s中查阅
3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中
3:NVIC一般配置流程:(需要中断就要配置)
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位
//使能KEY0,KEY1中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
4:EXIT中断、事件控制器配置流程
// EXTI_InitTypeDef EXTI_InitStructure;
// EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0
// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
// EXTI_InitStructure.EXTI_LineCmd=ENABLE;
// EXTI_Init(&EXTI_InitStructure);
1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。
2:IO口初始化,包括引脚,速率,输入输出模式等。
3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。
4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。
说明:
1:主函数写在main.c中,中断函数写在stm32f10x_it.c
中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。
2:中断函数名在startup_stm32f10x_xx.s中查阅
3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中
3:NVIC一般配置流程:(需要中断就要配置)
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位
//使能KEY0,KEY1中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
4:EXIT中断、事件控制器配置流程
// EXTI_InitTypeDef EXTI_InitStructure;
// EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0
// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
// EXTI_InitStructure.EXTI_LineCmd=ENABLE;
// EXTI_Init(&EXTI_InitStructure);
main.c文件为: #include"stm32f10x.h" #define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0开 #define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关 #define LED1_ON GPIO_SetBits(GPIOD,GPIO_Pin_2) //LED1开 #define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关 //初始化IO端口 void IO_Configuart(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为 GPIO_InitTypeDef结构体类型 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 //配置GPIOD_2 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化 //配置GPIOA_13 KEY0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//引脚选择 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;//上拉输入 由于按键按下为低电平 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 // //配置GPIOA_15 KEY1 // GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择 // GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 // GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入 由于按键按下为低电平 // GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 // //配置GPIOA_0 WK_UP // GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择 // GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 // GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入 由于按键按下为高电平 // GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟 } //复位和系统时钟控制 void RCC_Configuare(void) { SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率 RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统 //使能GPIOA,GPIOD端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟 /* 也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); 更加简洁*/ } //NVIC设置 void NVIC_Configuare(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位 //使能KEY0,KEY1中断 NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); // //使能WK_UP中断 // NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//外部中断线0中断 WK_UP按键 接PA0 // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //先占优先级0位,从优先级4位 // NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; // // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; // NVIC_Init(&NVIC_InitStructure); } void Delay(u16 speed) { u16 i=0; while(speed!=0) { speed--; for(i=0;i<400;i++); } } int main(void) { EXTI_InitTypeDef EXTI_InitStructure; // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //JTAG-DP 失能 + SW-DP使能 // GPIO_AFIODeInit(); //将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值 // GPIO_DeInit(GPIOA); // GPIO_DeInit(GPIOD); RCC_Configuare(); IO_Configuart(); NVIC_Configuare(); LED1_OFF; // EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0 // EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 // EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求 // EXTI_InitStructure.EXTI_LineCmd=ENABLE; // EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line13;//外部中断线 13 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求 EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); // EXTI_InitStructure.EXTI_Line=EXTI_Line15;//外部中断线 15 // EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 // EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求 // EXTI_InitStructure.EXTI_LineCmd=ENABLE; // EXTI_Init(&EXTI_InitStructure); while(1) { LED0_ON; // LED1_OFF; Delay(2000); LED0_OFF; // LED1_ON; Delay(2000); } } // void EXTI15_10_IRQHandler(void) //{ // if(EXTI_GetITStatus(EXTI_Line13)!=RESET) //按键1按下 // { // LED0_ON; // } // else // { // LED0_OFF; // } // if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键2按下 // { // LED1_ON; // } // else // { // LED1_OFF; // } // // // // EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位 // EXTI_ClearITPendingBit(EXTI_Line15); //} // //void EXTI0_IRQHandler(void) //{ // if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键WK_UP按下 // { // LED1_ON; // LED0_ON; // } // else // { // LED1_OFF; // LED0_OFF; // } // EXTI_ClearITPendingBit(EXTI_Line0); //待清除 EXTI 线路的挂起位 //} stm32f10x_it.c 文件为: /** ****************************************************************************** * @file GPIO/IOToggle/stm32f10x_it.c * @author MCD Application Team * @version V3.4.0 * @date 10/15/2010 * @brief Main Interrupt Service Routines. * This file provides template for all exceptions handler and peripherals * interrupt service routine. ****************************************************************************** * @copy * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>© COPYRIGHT 2010 STMicroelectronics</center></h2> */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_it.h" #define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0开 #define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关 #define LED1_ON GPIO_SetBits(GPIOD,GPIO_Pin_2) //LED1开 #define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关 /** @addtogroup STM32F10x_StdPeriph_Examples * @{ */ /** @addtogroup GPIO_IOToggle * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /******************************************************************************/ /* Cortex-M3 Processor Exceptions Handlers */ /******************************************************************************/ /** * @brief This function handles NMI exception. * @param None * @retval None */ void NMI_Handler(void) { } /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } /** * @brief This function handles Memory Manage exception. * @param None * @retval None */ void MemManage_Handler(void) { /* Go to infinite loop when Memory Manage exception occurs */ while (1) { } } /** * @brief This function handles Bus Fault exception. * @param None * @retval None */ void BusFault_Handler(void) { /* Go to infinite loop when Bus Fault exception occurs */ while (1) { } } /** * @brief This function handles Usage Fault exception. * @param None * @retval None */ void UsageFault_Handler(void) { /* Go to infinite loop when Usage Fault exception occurs */ while (1) { } } /** * @brief This function handles SVCall exception. * @param None * @retval None */ void SVC_Handler(void) { } /** * @brief This function handles Debug Monitor exception. * @param None * @retval None */ void DebugMon_Handler(void) { } /** * @brief This function handles PendSV_Handler exception. * @param None * @retval None */ void PendSV_Handler(void) { } /** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { } /******************************************************************************/ /* STM32F10x Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ /* available peripheral interrupt handler's name please refer to the startup */ /* file (startup_stm32f10x_xx.s). */ /******************************************************************************/ //中断处理函数 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13)!=RESET) //按键0按下 { LED1_ON; } else { LED1_OFF; } // if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键1按下 // { // LED1_ON; // } // else // { // LED1_OFF; // } EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位 注意此处一定要清除 // EXTI_ClearITPendingBit(EXTI_Line15); } //void EXTI0_IRQHandler(void) //{ // if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键WK_UP按下 // { // LED1_ON; // LED0_ON; // } // else // { // LED1_OFF; // LED0_OFF; // } // EXTI_ClearITPendingBit(EXTI_Line0); //待清除 EXTI 线路的挂起位 //} /** * @brief This function handles PPP interrupt request. * @param None * @retval None */ /*void PPP_IRQHandler(void) { }*/ /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
相关文章推荐
- 关于一个音频播放器在工作时,打开另一个播放器或者进来电话之类的处理
- Html5 手机wap开发、微信开发、APP开发的优缺点-创业者必知
- Java WebService 简单实例
- 编程的学习方法,轻松化,以及短期的学习编程经验总结
- stl部分容器学习及实现
- 6-1、Spark RDD
- 程序的命名规则
- PHPStrom使用SASS,SCSS和Compass
- C++ Primer 5th - 1.1 编写一个简单的C++程序
- 在Mac下配置Gradle命令
- 7. memcache 细节
- 谷歌浏览器debug工具
- STM32:STM32学习记录4:串口
- Scrollview嵌套EditText,使其滑动
- Redis批量删除key
- Redis批量删除key
- SRTM数据介绍与说明
- CodeForces 630G:Challenge Pennants【排列组合】
- Mac开发Group Containers前缀问题
- Android获取App的版本名称和版本号