微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 调试 ARM STM32 外部中断 遇到的一个问题

调试 ARM STM32 外部中断 遇到的一个问题

时间:11-20 来源:互联网 点击:
问题背景: STM32f103zet6的PB9和PE0脚分别外接一个按键,希望通过这两个按键可以产生外部中断,点亮该按键对应的LED。使用EXTI[9:5]通道。

首先配置RCC:

void RCC_Configuration() {     ErrorStatus HSEStartUpStatus;     RCC_DeInit(); //将外设RCC寄存器设为缺省值     RCC_HSEConfig(RCC_HSE_ON); //使能HSE     HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE就绪     if(HSEStartUpStatus == SUCCESS) //判断HSE是否起振成功     {                                          RCC_HCLKConfig(RCC_SYSCLK_Div1);  //设置AHB时钟(HCLK) = 系统时钟         RCC_PCLK2Config(RCC_HCLK_Div2);  //设置高速APB2时钟(PCLK2)= 系统时钟          RCC_PCLK1Config(RCC_HCLK_Div2);  //设置低速APB1时钟(PCLK1)= 系统时钟/2           /*****保证在将PLL切换时钟源之前使能Flash预取缓存*****/         FLASH_SetLatency(FLASH_Latency_2); //设置等待时间 = 2个周期         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存                             /*                     这里插入设置需要开启的外设的时钟,比如                     RCC_ADCCLKConfig(RCC_PCLK2_Div4); //设置ADC时钟=PCLK/4 =9MHz                     */          //设置PLL的输入时钟 = HSE时钟频率;倍频系数 = PLL输入时钟×9         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);          RCC_PLLCmd(ENABLE); //使能PLL          //检查指定的RCC标志位(PLL就绪位)设置与否,若为否, 则等待         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)         {/*NULL*/ }          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK)为PLL          //0x00:HSI作为系统时钟; 0x04:HSE作为系统时钟;0x08:PLL作为系统时钟         while(RCC_GetSYSCLKSource() != 0x08) //等待直到PLL作为系统时钟源         {/*NULL*/ }           }            /*****这里根据具体需要开启相应的时钟*****/           // PB9: WORK PE0: ALARM           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //开启功能复用I/O时钟            }


然后配置GPIO:

void GPIO_Configuration(void) //设置GPIO {           GPIO_InitTypeDef GPIO_InitStructure;                      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_Init(GPIOB, &GPIO_InitStructure);                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_Init(GPIOE, &GPIO_InitStructure);                      }

再然后配置NVIC:

void NVIC_Configuration(void) {           NVIC_InitTypeDef NVIC_InitStructure; //定义中断参数结构体变量 #ifdef  VECT_TAB_RAM             NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);//设置向量表的位置和偏移(0x20000000)  #else             NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//设置向量表的位置和偏移(0x20000000)    #endif            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择使用优先级分组第0组                     /*使能EXTI[9:5]通道,0级先占优先级,0级次占优先级*/     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     NVIC_Init(&NVIC_InitStructure);      } 

最后配置EXTI:

void EXTI_Configuration(void) //配置外部中断/事件控制器 {     EXTI_InitTypeDef EXTI_InitStructure;      GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5|GPIO_PinSource6);           EXTI_InitStructure.EXTI_Line = EXTI_Line5|EXTI_Line6;     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     EXTI_InitStructure.EXTI_LineCmd = ENABLE;     EXTI_Init(&EXTI_InitStructure);  } 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top