stm32外部中断

来源:互联网 发布:servlet传json到ajax 编辑:程序博客网 时间:2024/06/02 08:13

外部中断程序配置流程

 

//RCC时钟配置

void RCC_Configuration(void)

{

/*时钟配置*/

/*

*/

//开启各路时钟

           RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

}// RCC_APB2Periph_AFIO为复用功能时钟开启,基本上都要开启,比如端口作为输入/AD/TxRx等均属于复用功能

//GPIO配置

void GPIO_Configuration(void)

{

         /*定义GPIO初始化结构体 GPIO_InitStructure */

       GPIO_InitTypeDef GPIO_InitStructure;

   

       /* 设置PA.0,PA.1,PA.2为上拉输入(EXTILine0)*/

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2;

       GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOA , &GPIO_InitStructure);

 

        

         /*设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

       GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;

       GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

       GPIO_Init(GPIOA , &GPIO_InitStructure);

   

       /* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

       GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOA , &GPIO_InitStructure);

}

外部中断配置

void EXIT_Configuration(void)

{

//总结:从外到内

1要确定哪个引脚作为外部中断输入egGPIOA的第0个引脚

             2确定了引脚之后,对应打开中断线。让引脚和中断线连接上

                   3设置上升沿、下降沿、还是上下升沿触发

                   4设置中断模式:为事件还是中断挂起

                   5使能该中断

                   6初始化上述配置

// 定义EXIT初始化结构体EXTI_InitStructure

         EXTI_InitTypeDefEXTI_InitStructure;

// 定义PA.0为外部中断0输入通道(EXIT0)

         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

// 定义PA.1为外部中断1输入通道(EXIT1)

         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);

// 定义PA.2为外部中断2输入通道(EXIT2)

         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2);

//选择外部中断的通道 共有EXTI_Line0到EXTI_Line18(0-15 16RTC17PVD 18USB)

//比如:这里选择了3个通道

       EXTI_InitStructure.EXTI_Line = EXTI_Line0 |EXTI_Line1 | EXTI_Line2;

///这里设置EXTI中断模式 :2种---事件中断和中断挂起

       EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;

//选择中断触发方式3种:下降沿触发、上升沿触发、上下升沿都触发

//这里选择下降沿触发

       EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;

//使能中断

       EXTI_InitStructure.EXTI_LineCmd = ENABLE;

//初始化上述中断配置

       EXTI_Init(&EXTI_InitStructure);

}

//外部中断处理函数

void EXTI_IRQHandler(void)

{

   if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确保是否产生了EXTILine0中断

         {

         EXTI_ClearITPendingBit(EXTI_Line0);     //清除中断标志位

         }

if(EXTI_GetITStatus(EXTI_Line1) != RESET)//确保是否产生了EXTI Line1中断

         {

         EXTI_ClearITPendingBit(EXTI_Line1);     //清除中断标志位

         }

if(EXTI_GetITStatus(EXTI_Line2) != RESET)//确保是否产生了EXTI Line2中断

         {

         EXTI_ClearITPendingBit(EXTI_Line2);     //清除中断标志位

         }

}

 

 

 

 

 

如下图:这里PA0连接到EXTI0

这里PA1连接到EXTI1

这里PA2连接到EXTI2




0 0
原创粉丝点击