历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2018年10月10日 | STM32学习笔记---基于UCOSII的EXTI外部按键中断实验

发布者:那是一条路都 来源: eefocus关键字:STM32  UCOSII  EXTI  外部按键  中断实验 手机看文章 扫描二维码
随时随地手机看文章

继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。

//EXTI按键任务----------------------------------------
static  void Task_EXTI(void* p_arg)
{
  
   (void) p_arg;
  
   while(1)
   {  //看门狗更新设置喂狗操作
   IWDGSET();

   TESTKEY();

      OSTimeDlyHMSM(0, 0, 0, 10); 
   }
       
}

unsigned char KEY=4;//外部中断标志
unsigned char EXTIFLAG=0;//外部中断标志

  EXTI_InitTypeDef EXTI_InitStructure; 
//EXTI口设置初始化
void EXTI_Config(void)
{
  //声明GPIO类型,EXTI类型
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 

  //启动GPIOB,GPIOD的时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE , ENABLE); 
  //初始化按键端口引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_3;   //COL1,2,3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;              //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;              //口线翻转速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   //COL4
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  //设置按键初始值为高电平
  GPIO_SetBits(GPIOC, GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_3);
  GPIO_SetBits(GPIOE, GPIO_Pin_6);     

  //初始化中断线
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   //下拉输入
  GPIO_Init(GPIOE, &GPIO_InitStructure);
 
 //初始化外部中断EXTI
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);   
   
  EXTI_InitStructure.EXTI_Line = EXTI_Line2;      //PE2 作为键盘的行线。检测状态
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    //中断
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;      //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  GPIO_SetBits(GPIOE, GPIO_Pin_2);    //起始值为高电平


 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
 
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}
void EXTI_KEY(void)
{
   if(EXTIFLAG==1)
   { 
   //判断是否是PC5按下  
      GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   GPIO_SetBits(GPIOC, GPIO_Pin_2);
   GPIO_SetBits(GPIOC, GPIO_Pin_3);
   GPIO_SetBits(GPIOE, GPIO_Pin_6);
   Delay(0XBF);
   if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
   {  
    Delay(0XBF);
  if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
  {
   while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
   KEY=0;
      goto out_exit;
  }
   }
   //判断是否是PC2按下
   GPIO_SetBits(GPIOC, GPIO_Pin_5);
   GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   GPIO_SetBits(GPIOC, GPIO_Pin_3);
   GPIO_SetBits(GPIOE, GPIO_Pin_6); 
   Delay(0XBF);
   if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
   {    
     Delay(0XBF);
  if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
  {
   while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
   KEY=1;
      goto out_exit;
  }
   }
   //判断是否是PC3按下
   GPIO_SetBits(GPIOC, GPIO_Pin_5);
   GPIO_SetBits(GPIOC, GPIO_Pin_2);
   GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   GPIO_SetBits(GPIOE, GPIO_Pin_6);
   Delay(0XBF);
   if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
   {   
     Delay(0XBF);
  if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
  {
   while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
   KEY=2;
      goto out_exit;
  }
   }
      //判断是否是PE6按下
   GPIO_SetBits(GPIOC, GPIO_Pin_5);
   GPIO_SetBits(GPIOC, GPIO_Pin_2);
   GPIO_SetBits(GPIOC, GPIO_Pin_3);
   GPIO_ResetBits(GPIOE, GPIO_Pin_6);
   Delay(0XBF);
   if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
   {   
     Delay(0XBF);
  if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
  {
   while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
   KEY=3;
      goto out_exit;
  }
   }

   out_exit:;
      EXTIFLAG=0;
      }

}

void TESTKEY(void)

    EXTI_KEY();

 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
 GPIO_ResetBits(GPIOE, GPIO_Pin_6); 
 
   switch(KEY)
   {
   case 0:          
      USART_OUT(USART1,"r***你按下了K1****n");
   KEY=4;
   break;
   case 1:          
      USART_OUT(USART1,"r***你按下了K2****n");
   KEY=4;
   break;
   case 2:          
      USART_OUT(USART1,"r***你按下了K3****n");
   KEY=4;
   break;
   default:break;
   }

}
////////////////键盘行线2中断
void EXTI2_IRQHandler(void)
{
    OS_CPU_SR  cpu_sr;


    OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
 //存放中断嵌套的层数(0~255)
    OSIntNesting++;       //OSSemPost(NMEA_MBOX);
    OS_EXIT_CRITICAL();   //恢复全局中断标志

  if(EXTI_GetITStatus(EXTI_Line2) != RESET)      //判别是否有键按下
  {
    
 EXTI_ClearITPendingBit(EXTI_Line2);
 EXTIFLAG=1;     //标志
  }

 //脱离中断函数
    OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
}

在此试验中修正了以前实验多任务下任务调度问题,比如ADC试验中优先级问题,TOUCH试验中优先级问题,还有在每个任务WHILE(1)中添加延时OSTimeDlyHMSM(0, 0, 0, 10); 此函数可以任务调度,还有就是在中断函数中,每个中断写成了

void XXXXX_IRQHandler(void)
{
    OS_CPU_SR  cpu_sr;


    OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
 //存放中断嵌套的层数(0~255)
    OSIntNesting++;       //OSSemPost(NMEA_MBOX);
    OS_EXIT_CRITICAL();   //恢复全局中断标志

    XXXXXX中断处理XXXXXXXXX

 //脱离中断函数
    OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
}

结果演示.....

[转载]STM32学习笔记---基于UCOSII的EXTI外部按键中断实验


关键字:STM32  UCOSII  EXTI  外部按键  中断实验 引用地址:STM32学习笔记---基于UCOSII的EXTI外部按键中断实验

上一篇:STM32与通常ARM的区别
下一篇:stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

推荐阅读

        10月10日下午消息,进入十月各大手机厂商开始新一轮“备战”,其中vivo官微公布了新机预告,疑似要发布一款Z系列新机。vivo官方公布新机海报        vivo官方公布的海报十分简洁,除了手机剪影,最抢眼的是“凭实力说话”几个大字,最上方同时标注了事件:10月17日。仔细看的话,我们还能发现海报上的手机剪影顶端有一颗水滴若隐...
LG化学、SK Innovation近期以泄露商业机密、侵犯专利为由提起诉讼,表面虽是争论技术外泄、抢夺人才,实质上是在争夺未来电池市场主导权。电动车是智能汽车的基石,这也代表着电池产业拥有很大的成长可能性,也成为了韩国企业LG化学、SK Innovation较劲的主因。据韩媒《ZDNet Korea》报道,市调公司SNE Research预估,2025年的电池市场规模将成长至167...
在其他厂商还在追求高像素的时候,vivo另辟蹊径,关注视频防抖的硬件改善。比如,为了解决小视频时代用户的痛点,vivo想办法将微云台放进了手机里。vivo X50 Pro是如何将微云台放进手机,又是怎样运转的呢?接下来集微拆评就为大家揭晓。vivo X50 Pro配置一览:SoC:高通骁龙765G处理器丨7nm工艺屏幕:6.56英寸 AMOLED双曲面挖孔屏丨分辨率 2376×108...
10月8日,赛微电子发布关于专项出口许可申请被瑞典战略产品检验局ISP否决的公告。据披露,赛微电子于2021年10月5日收到控股子公司Silex Microsystems AB(以下简称“瑞典Silex”)管理层的通知,瑞典Silex已收到瑞典战略产品检验局(the Swedish Inspectorate of Strategic Products,简称为ISP)的正式决定并经瑞典Silex管理层与ISP现场会议确认,...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved