[原创] 【连载】STM8L051F3_02_EXTI应用
1660 查看
5 回复
 楼主 | 发布于 2018-05-08 | 只看楼主
分享到:

本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分:

  • EXTI简介
  • KEY外部中断检测

1、EXTI简介

EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。

可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。

2、KEY外部中断检测

2.1 KEY的外部中断配置

本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个外部中断信号,然后产生中断,然后控制LED1的状态。使用的例程:STM8L051F3_02_EXTI。实现步骤:

1)初始化LED1为推挽输出模式(初始电平高)
2)初始化KEY为上拉输入&中断模式,并配置为下降沿触发

2.2 例程介绍

EXTI的初始化在exti.c文件中实现:

void EXTI_Init(void)

{

  // 配置KEY IO口为上拉输入&中断模式

  GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_Mode_In_PU_IT);

  //KEY引脚配置,下降沿触发;

  EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);

}

EXTI(KEY)的端口定义在exti.h文件下:

#define KEY_GPIO_PORT  (GPIOC)

#define KEY_GPIO_PINS  (GPIO_Pin_4)

主函数中对LED于EXTI进行初始化后开启总中断:

void main(void)

{

  LED_Init();   //初始化LED1

  EXTI_Init();  //初始化KEY

  enableInterrupts();   //开总中断

while(1)

{

;

}

}

中断处理函数在stm8l15x_it.c文件下(该文件下还定义了delay_ms()函数):

INTERRUPT_HANDLER(EXTI4_IRQHandler,12)

{

    /* In order to detect unexpected events during development,

       it is recommended to set a breakpoint on the following instruction.

    */

   //延迟消抖

  delay_ms(10);

  //松手检测

while(GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PINS)== 0);

  //切换LED1的状态

  GPIO_ToggleBits(LED1_GPIO_PORT, LED1_GPIO_PINS);

  //清除中断标志位

  EXTI_ClearITPendingBit(EXTI_IT_Pin4);

}

使用ST-LINK把程序下载到开发板中,按下KEY可以改变LED1的状态。



(0 ) (0 )

arm 嵌入式移植 嵌入式学习

回复 举报

回复于 2018-05-08 沙发

感谢分享;
(0 )
评论 (0) 举报

回复于 2018-05-09 2#

把延时放在中断中,不好吧。
(0 )
评论 (1) 举报

回复于 2018-05-09 3#

多谢分享!!!
(0 )
评论 (0) 举报

楼主 | 回复于 2018-05-09 4#

stm8的开发可以使用代码生成工具,超级方便的
(0 )
评论 (0) 举报

回复于 2018-05-10 5#

谢谢分享
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部