STM32F10X系列GPIO外部中断

发布者:廿由人最新更新时间:2017-09-21 来源: eefocus关键字:STM32F10X  GPIO  外部中断 手机看文章 扫描二维码
随时随地手机看文章

先从最简单的问题开始,用STM32外部中断的方法实现PB.0按键控制PA.0LED灯:

先总的说下实现中断的步骤:

1,配置NVIC寄存器(函数),设置中断为第几组,占先优先级和次优先级;

      函数方法:

           void NVIC_Configuration()      
  {
        NVIC_InitTypeDef NVIC_InitStruct;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
      NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;            
      NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   
      NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;           
      NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;          
      NVIC_Init(&NVIC_InitStruct);
}

      以上为配置优先级的一般步骤:设置优先级分组,设置中断通道,分别设置先占优先级,次占优先级,使能等;

             



2,配置EXTI寄存器及(函数),设置中断线,中断方式,等;


  1. void EXTI_Configuration()  

  2. {  

  3.             EXTI_InitTypeDef EXTI_InitStructure;  

  4.                 EXTI_ClearITPendingBit(EXTI_Line0);  

  5.             GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);  

  6.         EXTI_InitStructure.EXTI_Line = EXTI_Line0;  

  7.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

  8.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;   

  9.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;   

  10.         EXTI_Init(&EXTI_InitStructure);   

  11. }  

   和配置NVIC一样,这也是EXTI配置的一般步骤:清除相应中断线标志位(这个很重要,刚开始一直没找到这个问题),联结端口与中断线(也可以在GPIO初始化时配置),选择中断线,设置中断模式,中断方式,使能等;


3,写中断服务函数

        中断服务程序一般写在STM32F10X_it.c文件里:


  1. void EXTI0_IRQHandler(void)  

  2. {  

  3.   if(EXTI_GetITStatus(EXTI_Line0)==SET)  

  4.   {  

  5.     EXTI_ClearITPendingBit(EXTI_Line0);  

  6.         if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)  

  7.         {  

  8.            GPIO_SetBits(GPIOA,GPIO_Pin_0);    

  9.         }  

  10.         else  

  11.         {  

  12.             GPIO_ResetBits(GPIOA,GPIO_Pin_0);  

  13.         }  

  14.   }   

  15. }  

     其中最重要的一点:需要注意进入服务程序后清除中断标志位;


说几点容易忽略的地方:

     1.中断服务程序一定要清除中断标志位;

     2.联结相应端口与中断线;

     3.按键端口设置成上拉输入;

     4.在配置EXTI时清除中断标志位;

按键部分的短路自己连的:

         

    



下面是直接操作寄存器的方法:

1.GPIO初始化:这里只要注意GPIOB.0设置成上拉输入(不光要设置GPIOB->CRL=0X08,还要设置GPIOB->ODR=0X01,为了和下拉区分)


  1. void GPIO_Config()  

  2. {  

  3.     GPIOA->CRL=0X03;  

  4.     GPIOA->ODR=0X01;  

  5.     GPIOB->CRL=0X08;  

  6.     GPIOB->ODR=0X01;  

  7. }  


2. NVIC 初始化:

    直接上代码:


  1. void NVIC_Configuration()        

  2.   {  

  3.         u32 temp;  

  4.         temp=SCB->AIRCR;  

  5.         temp &=0x0000f8ff;  

  6.         temp |=0x05fa0000;  

  7.         temp |=0x0700;  

  8.         SCB->AIRCR =temp;  

  9.         NVIC->ISER[0] =1<<6;  

  10.         NVIC->IP[1]=0;  

  11. }  

3. EXTI初始化

     和用函数方法差不多,设置几个寄存器;有点不明白的是这里好像可以不用清除标志位;


  1. void EXTI_Configuration()  

  2. {  

  3.     AFIO->EXTICR[0]=0X0001;  

  4.     EXTI->IMR =0X01;  

  5.     EXTI->RTSR =0X01;  

  6. }  


然后是中断服务程序:

   

  1. void EXTI0_IRQHandler(void)  

  2. {  

  3.   if(EXTI_GetITStatus(EXTI_Line0)==SET)  

  4.   {  

  5.   

  6.    EXTI->PR =0X01;  

  7.         if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)  

  8.         {  

  9.            GPIO_SetBits(GPIOA,GPIO_Pin_0);    

  10.         }  

  11.         else  

  12.         {  

  13.             GPIO_ResetBits(GPIOA,GPIO_Pin_0);  

  14.         }  

  15.   }   

  16. }  



下面是整个用函数代码:


  1. #include"stm32f10x.h"  

  2. void GPIO_Config();  

  3. void NVIC_Configuration();  

  4. void EXTI_Configuration();  

  5. void SysclkConfiguration();  

  6. int main()  

  7. {  

  8.     SysclkConfiguration();  

  9.     GPIO_Config();  

  10.     EXTI_Configuration();  

  11.     NVIC_Configuration();  

  12.     while(1);  

  13.      return 0;  

  14. }  

  15.   

  16. void SysclkConfiguration()          

  17.         {  

  18.        RCC_DeInit();  

  19.             RCC_HSEConfig(RCC_HSE_ON);  

  20.             if(RCC_WaitForHSEStartUp()==SUCCESS)  

  21.             {  

  22.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);  

  23.             RCC_PLLCmd(ENABLE);  

  24.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);  

  25.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  26.             while(RCC_GetSYSCLKSource()!=0X08);  

  27.           RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  28.                 RCC_PCLK1Config(RCC_HCLK_Div2);  

  29.                 RCC_PCLK2Config(RCC_HCLK_Div1);  

  30.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);       

  31.             }  

  32.         }  

  33.   

  34.  void GPIO_Config()  

  35. {  

  36.     GPIO_InitTypeDef GPIO_InitStructure;   

  37.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  

  38.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  

  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  40.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  41.     GPIO_ResetBits(GPIOA,GPIO_Pin_0);  

  42.       

  43.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  

  44.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  

  45.     GPIO_Init(GPIOB,&GPIO_InitStructure);  

  46. }  

  47.   

  48. void NVIC_Configuration()        

  49.   {  

  50.         NVIC_InitTypeDef NVIC_InitStruct;  

  51.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  

  52.             NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;  

  53.             NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;  

  54.             NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;  

  55.             NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;      

  56.             NVIC_Init(&NVIC_InitStruct);  

  57. }  

  58. void EXTI_Configuration()  

  59. {  

  60.     EXTI_InitTypeDef EXTI_InitStructure;  

  61.     EXTI_ClearITPendingBit(EXTI_Line0);  

  62.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);  

  63.         EXTI_InitStructure.EXTI_Line = EXTI_Line0;  

  64.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

  65.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;   

  66.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;   

  67.         EXTI_Init(&EXTI_InitStructure);   

  68.       

  69. }  

下面是用寄存器代码:

      

  1. #include"stm32f10x.h"  

  2. void GPIO_Config();  

  3. void NVIC_Configuration();  

  4. void EXTI_Configuration();  

  5. void SysclkConfiguration();  

  6. int main()  

  7. {  

  8.     SysclkConfiguration();  

  9.     GPIO_Config();  

  10.     EXTI_Configuration();  

  11.     NVIC_Configuration();  

  12.     while(1);  

  13.      return 0;  

  14. }  

  15.   

  16. void SysclkConfiguration()          

  17.         {  

  18.        RCC_DeInit();  

  19.             RCC_HSEConfig(RCC_HSE_ON);  

  20.             if(RCC_WaitForHSEStartUp()==SUCCESS)  

  21.             {  

  22.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);  

  23.             RCC_PLLCmd(ENABLE);  

  24.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);  

  25.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  26.             while(RCC_GetSYSCLKSource()!=0X08);  

  27.           RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  28.                 RCC_PCLK1Config(RCC_HCLK_Div2);  

  29.                 RCC_PCLK2Config(RCC_HCLK_Div1);  

  30.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);       

  31.             }  

  32.         }  

  33.   

  34.  void GPIO_Config()  

  35. {  

  36.     GPIOA->CRL=0X03;  

  37.     GPIOA->ODR=0X01;  

  38.     GPIOB->CRL=0X08;  

  39.     GPIOB->ODR=0X01;  

  40. }  

  41.   

  42. void NVIC_Configuration()        

  43.   {  

  44.         u32 temp;  

  45.         temp=SCB->AIRCR;  

  46.         temp &=0x0000f8ff;  

  47.         temp |=0x05fa0000;  

  48.         temp |=0x0700;  

  49.         SCB->AIRCR =temp;  

  50.         NVIC->ISER[0] =1<<6;  

  51.         NVIC->IP[1]=0;  

  52. }  

  53. void EXTI_Configuration()  

  54. {  

  55.     AFIO->EXTICR[0]=0X0001;  

  56.     EXTI->IMR =0X01;  

  57.     EXTI->RTSR =0X01;  

  58.     EXTI->PR =0X01;  

  59. }  

然后是一些用到的文章:

  http://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf

http://www.ichanging.org/stm32_NVIC.html


最后说下,第一次写笔记,感谢大家阅读,如果有什么不对的地方,欢迎大家留言指正 !


关键字:STM32F10X  GPIO  外部中断 引用地址:STM32F10X系列GPIO外部中断

上一篇:stm32串口中断接收一帧数据
下一篇:stm32中断函数改变全局变量值

推荐阅读最新更新时间:2024-03-16 15:37

再造STM32---第九部分:GPIO输出—使用固件库点亮LED
本章参考资料:《STM32F4xx 参考手册》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。 利用库建立好的工程模板,就可以方便地使用 STM32 标准库编写应用程序了,可以说从这一章我们才开始迈入 STM32 开发的大门。 LED 灯的控制使用到 GPIO 外设的基本输出功能,本章中不再赘述 GPIO 外设的概念,如您忘记了,可重读前面“GPIO 框图剖析”小节, STM32 标准库中 GPIO 初始化结构体GPIO_TypeDef 的定义与“定义引脚模式的枚举类型”小节中讲解的相同。 9.1 硬件设计: 本实验板连接了一个 RGB 彩灯, RGB 彩
[单片机]
再造STM32---第九部分:<font color='red'>GPIO</font>输出—使用固件库点亮LED
STM32F10x 学习笔记之基本定时器
大容量的STM32F101xx、STM32F103xx系列和互联型产品中包含了两个基本定时器,TIM6和TIM7。这两个定时器功能非常简单,基本上和SysTick 定时器相当。 但是我在使用的时候确是费了一番周折才调试通过,所以还是应该将这两个定时器的使用方法好好的写一写。 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。简单的说两个定时器是从0计数到N(由自动装载计数器来确定N的具体值),然后复位回0 重新计数。每次复位到0 的时候可以产生对应的中断信号,或者产生DMA 请求,还可以触发DAC 同步电路。不过这次笔记不讨论触发DAC 的问题,等写到DAC 的使用时在讲解如何用这两定时器
[单片机]
STM32_外部中断之按键控制点亮LED灯
/* 名称:STM32_外部中断之按键控制点亮LED灯 说明:对于STM32来说,其中断种类众多。(除了外部中断还有内部异常)其每个GPIO端口的引脚都可以作为外部中断的中断源。 对其的设置也比C51要复杂的多。对于具体的使用来说可以总结为以下步骤: 1.初始化作为外部中断源的GPIO口。和普通的GPIO的设置类似,不过由于是使用GPIO引脚作为中断源,所以还需要开启复用时钟。 2..配置中断控制器 NVIC。由于有很多的中断,所以STM32用NVIC来控制操作各种中断。配置NVIC主要是配置一些中断源,中断的优先级(包括抢占优先级和相应优先级)还有设置使能中断(类似于C51中开启总开关)。 3..配置中断线EXIT线,是
[单片机]
STM8L学习笔记-GPIO端口操作(一)
STM8与STM32一样提供了固件库函数, 不过没有STM32的库完善,给的说明文档是chm格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载. GPIO寄存器有: 输出寄存器(ODR), 输入寄存器(IDR), 方向寄存器(DDR), 控制寄存器1(CR1), 控制寄存器2(CR2); 后面三个寄存器组和可以配置为8种GPIO的模式. 而固件库函数给出了8种模式,在上面的基础上加入了输出高/输出低电平的状态。 GPIO_Mode_In_FL_No_IT浮空输入无中断 GPIO_Mode_In_PU_No_I上拉输入无中断 GPIO_Mode_In_FL_IT 浮空输入
[单片机]
单片机外部中断的电平触发和边沿触发程序
折腾了一上午,没有人带只能自己摸索了........ 接法:JP10接J12;JP8接JP16;P3^2接GND;P2^0接LED; 只有打开全局开关,其它各位的开关才可以开启。 所有开关赋值为1则开,赋值为0则关。 位序号 D0 D1 D2 D3 D4 D5 D6 D7 说明 外部中断0 定时/计数0 外部中断1 定时/计数1 串行口中断 定时/计数2 (52单片机) 无效位
[单片机]
单片机<font color='red'>外部中断</font>的电平触发和边沿触发程序
C51---17 红外遥控(外部中断
红外遥控简介 硬件电路 基本发送与接收 NEC编码❗ 遥控器编码 C51单片机的外部中断 外部中断寄存器 红外遥控 遥控控制Num自增自减 Num再LCD上显示 main.c #include REGX52.H #include Delay.h #include LCD1602.h #include IR.h unsigned char Num; unsigned char Address; unsigned char Command; void main() { LCD_Init(); LCD_ShowString(1,1, ADDR CMD NUM ); LCD
[单片机]
C51---17 红外遥控(<font color='red'>外部中断</font>)
STM32的GPIO输出编程实例之点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 GPIO可以配置成以下8种工作模式: 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。 上拉输入:上拉输入模式与浮空输入模式相
[单片机]
STM32的<font color='red'>GPIO</font>输出编程实例之点亮三色LED
AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题。TQ335x有六个用户按键,分别是上、下、左、右、Enter和ESC。开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题,但是浏览driver/input/keyboard目录时意外的发现了gpio-keys.c,大体上看下该驱动程序,其功能是实现了通用的gpio按键。再去看了下DTS,发现DTS中有对gpio-keys的引用,于是猜到,新的内核不需要自己编写输入子系统驱动,可以通过配置DTS直接解决按键问题。本人最终通过实验证实了这个猜想,下面是实验笔记及本人的一些理解。 (1)确定GPIO管脚 通过查看TQ335x的原理图可以看到,TQ335x的6
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved