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);
    }
  }
}
相关推荐
总结所学5 分钟前
labview官网离线下载
嵌入式硬件
zcmodeltech5 分钟前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
szxinmai主板定制专家1 小时前
驱控一体新范式:RK3576+FPGA+CODESYS工业实时AI控制架构全解
人工智能·嵌入式硬件·计算机视觉·fpga开发·架构·工业ai·驱控一体
国科安芯3 小时前
ASC0101S自动双向电平转换原理深剖
单片机·嵌入式硬件·fpga开发·云计算·信息与通信
李永奉3 小时前
中科蓝讯SDK开发-开启串口Debug打印调试教程
单片机·嵌入式硬件·mcu·物联网·电脑
LCG元3 小时前
STM32硬件SPI驱动OLED SSD1306显示屏全流程实战:从CubeMX配置到中英文显示
stm32·单片机·嵌入式硬件
飞凌嵌入式3 小时前
性能翻倍·功耗减半!RK3572八核核心板,重构嵌入式计算新标杆
人工智能·嵌入式硬件·飞凌嵌入式
zcmodeltech4 小时前
智慧农业沙盘模型物联网控制系统设计:基于STM32与Modbus RTU的传感器-执行器闭环方案
服务器·分布式·stm32·嵌入式硬件·物联网·能源
WD1372980155714 小时前
WD5030L,超高集成度、大电流输出、高效率低发热,限流24V转12V,6A
stm32·单片机·嵌入式硬件·51单片机
~光~~16 小时前
【xv6学习】L0_环境配置
单片机·嵌入式硬件·学习