[8/16位单片机] 【8月晒板卡】+ 如何开启按键的中断方式和启用定时器?

[复制链接]
695|9
 楼主 | 2019-10-3 18:03 | 显示全部楼层 |阅读模式
一、如何启用按键的中断方式?
    按键的中断方式比轮询方式更合理高效,我查看了pin_manager.h中对引脚的宏定义,发现可以通过代码来定义中断,但不知道中断处理函数是哪个、在哪个位置?
    这是我写的配置代码,不知道正确否:
  1. int main(void)
  2. {
  3.     /* Initializes MCU, drivers and middleware */
  4.     SYSTEM_Initialize();
  5.    
  6.     /* 开启按键中断 */
  7.     IO_PF6_SetDigitalInput();                  //设置数字输入方式
  8.     IO_PF6_EnableInterruptForLowLevelSensing();//启用低电平感应中断
  9.    

  10.     /* Replace with your application code */
  11.     while (1){
  12.         if(IO_PF6_GetValue()==0){
  13.             DELAY_milliseconds(50);
  14.             if(IO_PF6_GetValue()==0){
  15.                 if(direction==1){
  16.                     delays = delays << 1;
  17.                     if(delays > 1000){
  18.                         direction = 0;
  19.                         delays = 800;
  20.                     }
  21.                 }
  22.                 else{
  23.                     delays = delays >> 1;
  24.                     if(delays < 100){
  25.                         direction = 1;
  26.                         delays = 100;
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.         IO_PF5_Toggle();
  32.         DELAY_milliseconds(delays);
  33.     }
  34. }
复制代码





二、如何启用定时器
    我想启用定时器的功能来控制LED的闪烁,免得使用低效的延时程序,但不清楚如何配置和启用定时器,在数据手册里也没有找到有关定时器的部分,在此请教大家该如何配置和启用定时器。

使用特权

评论回复
 楼主 | 2019-10-3 18:19 | 显示全部楼层
    在pin_manager.c文件中找到了中断处理函数(见下图),但定时器配置和启用仍不知道。
interrupted_03.jpg


使用特权

评论回复
 楼主 | 2019-10-3 18:29 | 显示全部楼层
    按键中断方式测试不成功,也许是还有哪里没有设置好。主函数中的代码如下:
  1. int main(void)
  2. {
  3.     /* Initializes MCU, drivers and middleware */
  4.     SYSTEM_Initialize();
  5.    
  6.     /* 开启按键中断 */
  7.     IO_PF6_SetDigitalInput();                  //设置数字输入方式
  8.     IO_PF6_EnableInterruptForLowLevelSensing();//启用低电平感应中断
  9.    

  10.     /* Replace with your application code */
  11.     while (1){
  12.         if(keys>0){
  13. //        if(IO_PF6_GetValue()==0){
  14.             keyok = 1;                        //锁定按键,此时不接收新按键
  15.             DELAY_milliseconds(50);           //延时防抖
  16.             if(IO_PF6_GetValue()==0){
  17.                 if(direction==1){
  18.                     delays = delays << 1;
  19.                     if(delays > 1000){
  20.                         direction = 0;
  21.                         delays = 800;
  22.                     }
  23.                 }
  24.                 else{
  25.                     delays = delays >> 1;
  26.                     if(delays < 100){
  27.                         direction = 1;
  28.                         delays = 100;
  29.                     }
  30.                 }
  31.             }
  32.             keyok = 0;                      //释放按键锁定
  33.         }
  34.         IO_PF5_Toggle();
  35.         DELAY_milliseconds(delays);
  36.     }
  37. }
复制代码




    中断处理函数中的代码如下:
  1. void PORTF_IO_PF6_DefaultInterruptHandler(void)
  2. {
  3.     // add your PORTF_IO_PF6 interrupt custom code
  4.     if(keyok==0)
  5.         keys++;
  6.     // or set custom function using PORTF_IO_PF6_SetInterruptHandler()
  7. }
复制代码


使用特权

评论回复
 楼主 | 2019-10-3 18:39 | 显示全部楼层
我启用下降沿中断也没反映。


    IO_PF6_SetDigitalInput();                  //设置数字输入方式
//    IO_PF6_EnableInterruptForLowLevelSensing();//启用低电平感应中断
    IO_PF6_EnableInterruptForFallingEdge();    //启用下降沿中断

使用特权

评论回复

评论

gjiang6789 2019-10-5 21:11 回复TA
晕晕乎乎的 
 楼主 | 2019-10-3 18:40 | 显示全部楼层
启用双边缘中断也无反映。

    /* 开启按键中断 */
//    PORTF_IO_PF6_SetInterruptHandler();        //此函数的参数未知
    IO_PF6_SetDigitalInput();                  //设置数字输入方式
//    IO_PF6_EnableInterruptForLowLevelSensing();//启用低电平感应中断
//    IO_PF6_EnableInterruptForFallingEdge();    //启用下降沿中断
    IO_PF6_EnableInterruptForBothEdges();      //启用双边缘中断

使用特权

评论回复
| 2019-10-4 12:01 | 显示全部楼层
放到月月送讨论区了

使用特权

评论回复
| 2019-10-5 12:03 | 显示全部楼层
为何我自己写的延时函数看不到效果

使用特权

评论回复
 楼主 | 2019-10-5 18:29 | 显示全部楼层
zhuomuniao110 发表于 2019-10-5 12:03
为何我自己写的延时函数看不到效果

我的也是,三重循环,分别循环20000次都看不到延时效果,与没有延时一样。

使用特权

评论回复
 楼主 | 2019-10-13 12:38 | 显示全部楼层
    通过网上浏览帖子,终于了解到TCA和TAB就是定时器。这也是原来观察不仔细,在MCC中这两个选项之前就是闹钟的图标,我尝试配置TCA,过程很简单,只需要填上要定时的时间就行,定时的时间可在600ns到19.661ms之间,然后在使能溢出中断打勾就行(参见下图)。

TCA_20191013094705.jpg


    不过目前我还未找到中断处理程序的入口。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表