小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【STM8教程-05】中断控制器与外部中断基础

项目案例:外部中断信号控制灯光开关

硬件资源:
1个LED灯,1个按键。
D3灯 <——– PC1
外部中断—–>PB0
硬件电路相关信息,详见:XMF06A开发的电路结构框图

功能要求:
1. 系统的主时钟采用默认的高速内部振荡器8分频,即2MHz。
2. 在主函数中,D3灯循环闪烁。
3. 将PB0引脚定义为外部中断输出,设置上拉电阻。
4. 将外部中断设置为仅下降沿信号触发。
5. 在外部中断服务函数中,翻转D6灯的开关状态。

案例的参考源码及注释

#include "iostm8s105k6.h"

#define D3      PC_ODR_ODR1
#define D6      PC_ODR_ODR4

/*=========================普通延时函数==========================*/
void Delay(unsigned int t)
{
  while(t--);
}

/*========================LED灯闪烁函数==========================*/
void LED_Flicker()
{
  D3 = 1;               //点亮D3灯
  Delay(60000);
  D3 = 0;               //熄灭D3灯
  Delay(60000);
}

/*========================GPIO端口初始化=========================*/
void Init_GPIO()
{
  //初始化D3灯和D6灯的引脚
  PC_DDR |= 0x12;       //PC1、PC4设置为输出模式
  PC_CR1|= 0x12;        //PC1、PC4设置为推挽输出
  PC_CR2&= ~0x12;       //PC1、PC4输出速度最大为2MHz
  //将PB0初始化为外部中断输入引脚
  PB_DDR &= ~0x01;      //PB0设置为输入模式              
  PB_CR1|= 0x01;        //PB0设置为带上拉电阻输入
  PB_CR2|= 0x01;        //PB0使能为外部中断
}

/*=========================外部中断初始化========================*/
void Init_INTP()
{
  asm("rim");           //打开总中断,CC寄存器为级别3
  //PB端口仅下降沿信号触发
  EXTI_CR1 = (EXTI_CR1 && 0xf3) | 0x08;
  asm("rim");           //打开总中断,CC寄存器为级别0
}

/*====================外部中断中断服务函数=======================*/
#pragma vector= EXTI1_vector
__interrupt void INTPB_IRQHandler()
{
  D6 = ~D6;             //D6灯的开关状态切换
}

void main()
{
  Init_GPIO();          //GPIO端口初始化
  Init_INTP();          //外部中断初始化
  while(1)
  {
    LED_Flicker();      //D3灯循环闪烁
  }
}
赞(1)
未经允许不得转载:小蜜蜂笔记 » 【STM8教程-05】中断控制器与外部中断基础

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店