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);
    }
  }
}
相关推荐
Polanda。11 分钟前
ADC-定时器触发
单片机·嵌入式硬件
Polanda。17 分钟前
ADC-常规序列的单通道转换
stm32·单片机·嵌入式硬件
紫竹苑主19 分钟前
VS Cose + PlatformIO +ESP32-S3 + ESPIDF开发环境安装卡壳持续等待问题解决
vscode·python·嵌入式硬件·物联网·硬件架构
weixin_4568083830 分钟前
【沁恒蓝牙开发】 LDE(外设)输出互补的PWM
单片机·嵌入式硬件
悠哉悠哉愿意1 小时前
【物联网学习笔记】按键
笔记·单片机·嵌入式硬件·物联网·学习
DLGXY1 小时前
STM32——PWM驱动舵机和直流电机、测量PWM频率和占空比、旋转编码器测速(十二)
stm32·单片机·嵌入式硬件
VekiSon2 小时前
Linux内核驱动——Ubuntu 网络启动环境配置与操作
linux·arm开发·嵌入式硬件·ubuntu
范纹杉想快点毕业2 小时前
嵌入式实时系统架构设计:基于STM32与Zynq的中断、状态机与FIFO架构工程实战指南,基于Kimi设计
c语言·c++·单片机·嵌入式硬件·算法·架构·mfc
恒锐丰小吕2 小时前
屹晶微 EG2003 中压200V半桥驱动芯片技术解析
嵌入式硬件·硬件工程
神一样的老师2 小时前
【RT-Thread Titan Board 开发板】RGB LCD屏测试
单片机·嵌入式硬件