打印
[ARM入门]

众拳【STM8入门】16讲 剑齿虎STM8外部中断实验

[复制链接]
1290|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 刘洋讲单片机 于 2017-1-11 15:44 编辑

第16讲.STM8外部中断实验.zip (393.65 KB)
众拳【剑齿虎STM8开发板】学习笔记分享
点击此处查看全部资料
第16讲   STM8外部中断实验

目 录
16.1键盘K1 控制LED        2
16.1.1  自定义键盘K1        2
16.1.2  中断配置        3
16.2程序文件设计        3
16.2.1  lib文件中内容分析        3
16.2.2  main.c文件中的程序        4
16.2.3  stm8s_it.c文件中的程序        6
16.2.4  key.c文件中的程序        6
16.2.5  key.h文件中的程序        8
16.2.6  led.h文件中的程序        9


16.1键盘K1 控制LED   
通过键盘K1产生外部中断。在中断中控制LED发光二极管,当键盘按下时发光二极管状态取反。
16.1.1  自定义键盘K1

图16.1按键K1原理图
    键盘K1输入到CPU的PE4管脚。在这个试验中当K1按下时,产生中断,CPU响应中断后转入中断处理子程序。
16.1.2  中断配置
    允许中断;
    允许中断优先级;
    中断入口和中断处理子程序建立关系;


16.2程序文件设计
16.2.1  lib文件中内容分析
我们建立一个“Lib”文件夹,把引用系统本身定义好的库函数添加在其中,我们使用到哪个外设功能,直接引用到此文件夹中即可。一般情况下下面这四个文件都得引用。   

图16.2  stm8s_conf.h头文件内部选择
本节实验及以后的实验我们都是用到库文件,其中 stm8s_conf.h头文件包含了所有外设的声明头文件,在本试验中我们使用到时钟外设和GPIO端口外设。所以#include "stm8s_clk.h"、#include "stm8s_exti.h"、#include "stm8s_itc.h"和#include "stm8s_gpio.h"需要“打开”(就是把语句前面的双斜线注释符号删除即可,参考图16.2)。Stm8s_gpio.c库函数包含了所有管脚初始化功能和具体的执行操作;Stm8s_clk.c库函数主要包含了内部时钟和外部时钟设置,在主函数中规定了具体的执行方法,在这个函数中就有具体相关的执行步骤;Stm8s_exti.c库函数主要包含了中断寄存器设置;Stm8s_itc.c库函数主要包含了中断优先级设置。
16.2.2  main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。详情请大家参考光盘(网盘)中程序及程序注释。
/***********************************************************************
*   说    明: STM8外部中断实验
*   开发平台: 剑齿虎STM8开发板        

*   关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。
*   STM8技术交流QQ群【335123291】
*   哈尔滨卓恩科技开发有限公司
*
*   作    者: 刘洋 张殿东
*   版    本: V1.0
*   日    期: 2016-05-03   
*
*   IAR开发环境    版本 V2.20.1
*   ST库函数       版本 V2.2.0
***********************************************************************/
#include "pbdata.h"//引入自定义公共头文件
void BSP_Configuration(void);//硬件初始化函数声明
/***********************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
***********************************************************************/
int main(void)
{
  BSP_Configuration();//硬件驱动初始化函数
    while(1)//主程序循环,反复执行循环体里的语句
  {
   }
}
/***********************************************************************
*   函 数 名: BSP_Configuration
*   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*   形    参:无
*   返 回 值: 无
***********************************************************************/
void BSP_Configuration(void)
{  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
  LED_Init();//调用LED初始化函数
  JDQ_Init();//调用继电器初始化函数
  KEY_Init();//调用KEY键盘初始化函数
  rim();//总中断使能
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
#endif
16.2.3  stm8s_it.c文件中的程序
中断和中断处理子程序建立关系必须在stm8s_it.c文件中对应位置中建立。因为键盘K1物理连接到PE4管脚,所以中断处理子程序入口地址必须放在PE端口中断处理中,请看下面程序语句。
INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7) //PE端口的中断处理入口
{
    KEY_Demo();//调用键盘检测函数
}
16.2.4  key.c文件中的程序
#include "pbdata.h"
/***************************************************************************
*   函 数 名: KEY_Init
*   功能说明: KEY的GPIO管脚初始化
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void KEY_Init(void)
{
  //GPIO_Init(K1_PORT, K1_PIN, GPIO_MODE_IN_FL_NO_IT);//初始化K1键盘管脚为浮动输入无中断功能
  //GPIO_Init(TOUCH_PORT, TOUCH_PIN, GPIO_MODE_IN_PU_NO_IT);//初始化触摸键盘管脚上拉输入无中断功能
  GPIO_Init(K1_PORT, K1_PIN, GPIO_MODE_IN_FL_IT);//初始化K1键盘管脚为浮动输入有中断功能
  EXTI_SetExtIntSensitivity(K1_EXTI_PORT, EXTI_SENSITIVITY_FALL_ONLY);//配置中断触发方式为仅下降沿触发
  GPIO_Init(TOUCH_PORT, TOUCH_PIN, GPIO_MODE_IN_PU_IT);//初始化触摸键盘管脚上拉输入有中断功能
  EXTI_SetExtIntSensitivity(TOUCH_EXTI_PORT, EXTI_SENSITIVITY_FALL_ONLY);//配置中断触发方式为仅下降沿触发
  ITC_SetSoftwarePriority(ITC_IRQ_PORTE,ITC_PRIORITYLEVEL_2 );//配置软件优先级为 2
}
/***************************************************************************
*   函 数 名: KEY_Down
*   功能说明: 键盘检测消斗
*   形    参:GPIO_TypeDef* GPIOx  输入要检测的端口
*             GPIO_Pin_TypeDef GPIO_Pin  输入要检测的引脚
*   返 回 值: 布尔类型 (true 按下,flase 弹起)
***************************************************************************/
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
  //检测是否有按键按下
  if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//是否为低电平,低电平按下,高电平弹起
  {   
    delay_ms(20);//延时20毫秒消抖
    if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//再一次检测键盘是否有按下
    {
      //低电平为真(等待)   高电平为假(退出WHILE循环)
      while(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0);
      return true;//函数返回真
    }
  }
  return false;//函数返回假
}
/***************************************************************************
*   函 数 名: KEY_Demo
*   功能说明: 键盘输入检测
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void KEY_Demo(void)
{
    if(KEY_Down(K1_PORT,K1_PIN)==true)//判断K1键盘是否被按下,如果按下将执行下面的语句,否则退出函数。
    {   
        LED1_R;//PE0引脚电平取反,高电平时LED1发光二极管(熄灭),底电平时LED1发光二极管(发光)
        LED2_R;//PA3引脚电平取反,高电平时LED2发光二极管(熄灭),底电平时LED2发光二极管(发光)
        LED3_R;//PA6引脚电平取反,高电平时LED3发光二极管(熄灭),底电平时LED3发光二极管(发光)
    }
    if(KEY_Down(TOUCH_PORT, TOUCH_PIN)==true)//判断TOUCH触摸键盘是否被按下,如果按下将执行下面的语句,否则退出函数。
    {
        JDQ_R;//PG7引脚电平取反,高电平时继电器(断开),底电平时继电器(吸合)
    }
}
16.2.5  key.h文件中的程序
/***********************************************************************
*    剑齿虎STM8开发板硬件连接
*
*    K1引脚定义  K1-PE4         
*    TOUCH引脚定义  TOUCH-PE3         
************************************************************************/

#ifndef _KEY_H
#define _KEY_H
/*---------------------------头文件引用--------------------------------------*/
#include "stm8s.h"//引用STM8头文件
/*---------------------------宏定义声明--------------------------------------*/
#define K1_PIN  GPIO_PIN_4   //定义GPIO_PIN_4引脚为K1_PIN,相当于重新命名。
#define K1_PORT GPIOE        //定义GPIOE端口为K1_PORT,相当于重新命名。
#define K1_EXTI_PORT EXTI_PORT_GPIOE//定义EXTI_PORT_GPIOE端口为K1_EXTI_PORT,相当于重新命名。

#define TOUCH_PIN GPIO_PIN_3//定义GPIO_PIN_3引脚为TOUCH_PIN,相当于重新命名。
#define TOUCH_PORT GPIOE    //定义GPIOE端口为TOUCH_PORT,相当于重新命名。
#define TOUCH_EXTI_PORT EXTI_PORT_GPIOE//定义EXTI_PORT_GPIOE端口为TOUCH_EXTI_PORT,相当于重新命名。
//如果想用其他管脚检测KEY键盘,那么只需更改上面对应的端口与引脚编号即可
/*---------------------------函数声明--------------------------------------*/
void KEY_Init(void);//KEY初始化函数
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);//KEY键盘检测消斗函数
void KEY_Demo(void);//KEY键盘检测实验函数
#endif //定义文件名称结束
16.2.6  led.h文件中的程序
/***********************************************************************
*    剑齿虎STM8开发板硬件连接
*    LED1-PE0         
*    LED2-PA3         
*    LED3-PA6         
************************************************************************/
#ifndef _LED_H  //宏定义,定义文件名称
#define _LED_H
/*---------------------------头文件引用--------------------------------------*/
#include "stm8s.h"//引用STM8头文件
/*---------------------------宏定义声明--------------------------------------*/
#define LED1_PIN GPIO_PIN_0  //定义GPIO_PIN_0引脚为LED1_PIN,相当于重新命名。
#define LED2_PIN GPIO_PIN_3  //定义GPIO_PIN_3引脚为LED2_PIN,相当于重新命名。
#define LED3_PIN GPIO_PIN_6  //定义GPIO_PIN_6引脚为LED3_PIN,相当于重新命名。
#define LED1_PORT GPIOE  //定义GPIOE端口为LED1_PORT,相当于重新命名。
#define LED2_PORT GPIOA  //定义GPIOA端口为LED2_PORT,相当于重新命名。
#define LED3_PORT GPIOA  //定义GPIOA端口为LED3_PORT,相当于重新命名。
//如果想用其他管脚控制LED,那么只需更改上面对应的端口与引脚编号即可
#define LED1_L GPIO_WriteLow(LED1_PORT,LED1_PIN);       //定义LED1_L,调用LED1_L命令,PE0引脚输出低电平
#define LED1_H GPIO_WriteHigh(LED1_PORT,LED1_PIN);      //定义LED1_H,调用LED1_H命令,PE0引脚输出低高平
#define LED1_R GPIO_WriteReverse(LED1_PORT,LED1_PIN);   //定义LED1_R,调用LED1_R命令,PE0引脚输出电平状态取反
#define LED2_L GPIO_WriteLow(LED2_PORT,LED2_PIN);       //定义LED2_L,调用LED2_L命令,PA3引脚输出低电平
#define LED2_H GPIO_WriteHigh(LED2_PORT,LED2_PIN);      //定义LED2_H,调用LED2_H命令,PA3引脚输出低高平
#define LED2_R GPIO_WriteReverse(LED2_PORT,LED2_PIN);   //定义LED2_R,调用LED2_R命令,PA3引脚输出电平状态取反
#define LED3_L GPIO_WriteLow(LED3_PORT,LED3_PIN);       //定义LED3_L,调用LED2_L命令,PA6引脚输出低电平
#define LED3_H GPIO_WriteHigh(LED3_PORT,LED3_PIN);      //定义LED3_H,调用LED2_H命令,PA6引脚输出低高平
#define LED3_R GPIO_WriteReverse(LED3_PORT,LED3_PIN);   //定义LED3_R,调用LED2_R命令,PA6引脚输出电平状态取反

/*---------------------------函数声明--------------------------------------*/
void LED_Init(void);  //LED初始化函数
void LED_Demo1(void); //闪烁例程1,间隔时间为1秒
void LED_Demo2(void); //闪烁例程2,间隔时间为1秒
#endif //定义文件名称结束


在这里我们对程序的主要部分做了详细的说明,如果想了解全部程序,请使用IAR软件打开我们的第14讲触摸键盘检测程序(位置以光盘内容为主)。


本节内容录制了详细的视频教程,0基础入门,需要视频教程请联系我,企鹅群335123291


相关帖子

沙发
xyz549040622| | 2017-1-4 22:35 | 只看该作者
图片不能直接复制然后发帖,不然是挂掉的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

499

帖子

61

粉丝