四 STM32F4 实现外部中断以及串口打印

参考文章: 中断-NVIC 以及EXTI外设详解

这里使用STM32F411U6 微控制器 , 这里使用PC15产生脉冲信号, 并利用PA1 引脚输入信息来触发外部中断 .

1. 初始化外部中断 EXIT_init()

  • 对用到的外设进行时钟使能
  • 配置引脚PC15 为输出 , 推挽 , 上拉 , 100MHZ 模式
  • 配置引脚PA1 为输入 上拉
  • 通过 SYSCFG_EXTILineConfig() 函数 将PA1 于中断线 EXTI_Line1 进行连接
  • 配置 外部中断线 1 配置为上升沿触发模式
void  EXIT_init(void)
{
    //使能外设时钟 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


    //初始化GPIOC引脚15 
    GPIO_InitTypeDef GPIO_InitStruct ; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT ; 
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ; 
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 ; 
    GPIO_Init( GPIOC, & GPIO_InitStruct);

    //初始化GPIOA引脚1 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN ; 
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ; 
    GPIO_Init( GPIOA, & GPIO_InitStruct);

    /* 将引脚和中断线进行连接*/
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource1 );

    EXTI_InitTypeDef    EXTI_InitStruct ;
    EXTI_InitStruct.EXTI_Line = EXTI_Line1 ;//PA1 对应EXTI_Line1 
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt ; 
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising ; 
    EXTI_InitStruct.EXTI_LineCmd = ENABLE ; 
    EXTI_Init(&  EXTI_InitStruct) ; 

}

2. 配置NVIC 中断服务 NVIC_config()

使能外设中断后, 再送入NVIC再使能
四 STM32F4 实现外部中断以及串口打印_第1张图片

  • 配置中断优先级分组
  • 配置外部中断 EXTI1 , 设置抢占优先级 以及响应优先级 , 使能外部中断
void NVIC_config(void)
{
    /* 优先级分组 */
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); 

    /*配置对应外设中断*/
    NVIC_InitTypeDef NVIC_InitStruct ; 
    NVIC_InitStruct.NVIC_IRQChannel =  EXTI1_IRQn  ;  //外部中断1 通道  IRQn 位于stm32f4xx.h 中196行处 
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2 ; //抢占优先级 2
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2  ; //响应优先级 2
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; //使能中断 

    NVIC_Init(& NVIC_InitStruct);
}

3. 编写中断服务函数

中断服务的函数已经写好 位于 启动文件 startup_stm32f411xe.s 下 102 行

                DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             

模仿别人将其放在专门一个文件 stm32f4xx_it.c 下

void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) == 1) //检查EXTI_Line1中断标志位
  {
    printf("EXTI1_IRQHandler\r\n") ; // 包含头文件 stdio.h
    EXTI_ClearITPendingBit(EXTI_Line1) ; //及时清除  EXTI_Line1 的标志位
  }
}

4. 主函数


#include "stm32f4xx.h"
# include "USART.h" 
#include "EXIT.h" 


/*使用 PC15 产下下降沿脉冲 传入到 PA1 使用 用EXTI_Line1 检测下降沿
出发中断 , 然后用到串口打印触发的信息 
*/

void delay_ms(uint32_t ms) ; 
int main()
{  
    /*串口初始化*/
    GPIO_init(); 
    USART_init(); 

    /*配置外设中断 以及NVIC 使能 */
   
    EXIT_init() ;
    NVIC_config() ;

  while(1)
  {
    Test() ;
    __NOP() ; 
    __NOP() ; 
  }

}

你可能感兴趣的:(STM32,stm32,单片机,嵌入式硬件)