stm8s单片机(二)外部中断实验

中断优先级

stm8的中断优先级不是固定不变的,stm8的中断分为硬件优先级与软件优先级;当多个中断发生时,cpu会先响应软件优先级高的中断,若软件优先级相同会先响应硬件优先级高的;

其中软件优先级有四个

c 复制代码
/**
  * @brief  ITC Priority Levels selection
  */
typedef enum {
  ITC_PRIORITYLEVEL_0 = (uint8_t)0x02, /*!< Software priority level 0 (cannot be written) */
  ITC_PRIORITYLEVEL_1 = (uint8_t)0x01, /*!< Software priority level 1 */
  ITC_PRIORITYLEVEL_2 = (uint8_t)0x00, /*!< Software priority level 2 */
  ITC_PRIORITYLEVEL_3 = (uint8_t)0x03  /*!< Software priority level 3 */
} ITC_PriorityLevel_TypeDef;

例子:

c 复制代码
ITC_SetSoftwarePriority(ITC_IRQ_PORTE,ITC_PRIORITYLEVEL_2 );

外部中断

stm8的所有io引脚都有外部中断能力;

IAR的中断处理声明

在固件库stm8s.h中可以找到这样一段代码

c 复制代码
#ifdef _IAR_
 #define STRINGVECTOR(x) #x
 #define VECTOR_ID(x) STRINGVECTOR( vector = (x) )
 #define INTERRUPT_HANDLER( a, b )  \
 _Pragma( VECTOR_ID( (b)+2 ) )        \
 __interrupt void (a)( void )
 #define INTERRUPT_HANDLER_TRAP(a) \
 _Pragma( VECTOR_ID( 1 ) ) \
 __interrupt void (a) (void)  
#endif /* _IAR_ */

例子:

c 复制代码
INTERRUPT void EXTI_PORTE_IRQHandler(void);

INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7)
{
	if(KEY1==0)
	{
		delay_ms(20);
		while(KEY1==0);
		LED1_TOGGLE;
	}
	if(KEY2==0)
	{
		delay_ms(20);
		while(KEY2==0);
		LED2_TOGGLE;	
	}
}

外部中断灵敏性(触发方式)

c 复制代码
/**
  * @brief  EXTI Sensitivity values for PORTA to PORTE
  */
typedef enum {
  EXTI_SENSITIVITY_FALL_LOW  = (uint8_t)0x00, /*!< Interrupt on Falling edge and Low level */
  EXTI_SENSITIVITY_RISE_ONLY = (uint8_t)0x01, /*!< Interrupt on Rising edge only */
  EXTI_SENSITIVITY_FALL_ONLY = (uint8_t)0x02, /*!< Interrupt on Falling edge only */
  EXTI_SENSITIVITY_RISE_FALL = (uint8_t)0x03  /*!< Interrupt on Rising and Falling edges */
} EXTI_Sensitivity_TypeDef;

Falling edge 是下降沿

Rising edge 是上升沿

使用例子:

c 复制代码
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);

实验程序

使用一个GPIO来作外部中断有这几个步骤

  1. GPIO_Init
  2. EXTI_SetExtIntSensitivity
  3. ITC_SetSoftwarePriority
  4. INTERRUPT_HANDLER 定义中断处理
  5. enableInterrupts
c 复制代码
#include "stm8s_gpio.h"
#include "stm8s_itc.h"
#include "stm8s_exti.h"

bool pinn = FALSE;
void delay(uint32_t delayTime);

int main(void)
{
  disableInterrupts();
  GPIO_Init(GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_PU_IT);
  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);
  ITC_SetSoftwarePriority(ITC_IRQ_PORTE, ITC_PRIORITYLEVEL_3);

  if (pinn == TRUE)
  {
    GPIO_WriteLow(GPIOA, GPIO_PIN_4);
  }
  else
  {
    GPIO_WriteHigh(GPIOA, GPIO_PIN_4);
  }
  enableInterrupts();
  while (1)
  {
  }
}

void delay(uint32_t delayTime)
{
  while (delayTime--)
    ;
}

INTERRUPT void EXTI_PORTE_IRQHandler(void);

INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7)
{
  BitStatus status;
  status = GPIO_ReadInputPin(GPIOE, GPIO_PIN_6);
  if (status == RESET)
  {
    pinn = !pinn;
    if (pinn == TRUE)
    {
      GPIO_WriteLow(GPIOA, GPIO_PIN_4);
    }
    else
    {
      GPIO_WriteHigh(GPIOA, GPIO_PIN_4);
    }
  }
}
相关推荐
Flag- L27 分钟前
STM32标准库-TIM定时器
stm32·单片机·嵌入式硬件
2301_775602381 小时前
STM32什么是寄存器
stm32·单片机·嵌入式硬件
国科安芯3 小时前
抗辐照MCU在卫星载荷电机控制器中的实践探索
网络·嵌入式硬件·硬件工程·智能硬件·空间计算
双古4 小时前
步进电机调试记录(先让我的步进电机转起来)
单片机·嵌入式硬件
lixzest4 小时前
STM32开发中,线程启动异常问题排查简述
stm32·嵌入式硬件
程序员JerrySUN5 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
学习噢学个屁5 小时前
基于STM32语音识别柔光台灯
c语言·stm32·单片机·嵌入式硬件·语音识别
欢乐熊嵌入式编程7 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川8 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
SY师弟10 小时前
51单片机基础部分——矩阵按键检测
嵌入式硬件·矩阵·51单片机