[PIC®/AVR®/dsPIC®产品] CuriosityNano测评报告】04.定时器中断、串口中断及外部中断...

[复制链接]
27344|0
 楼主| hu9jj 发表于 2021-8-31 12:37 | 显示全部楼层 |阅读模式
#申请原创#

    中断实验主要是测试定时器中断、串口接收中断和外部中断等三种类型。通过测试,了解到中断发生后,主处理函数是INTERRUPT_InterruptManager (),在这个函数中对中断源进行判断,然后调用相应的处理函数,详见下图:


    一、定时器中断
    定时器中断是在开箱测试时就完成了的,当时控制LED闪烁是通过定时器对一个变量进行计数,然后在主循环中对这个变量进行检测,从而完成控制LED的亮灭。我将定时器0配置为10毫秒触发:


    然后在定时器中断处理函数中对计时变量进行加1运算:


    最后在主循环中对变量进行判断和清零处理:


    这样做的好处是中断函数中代码很少,不会出现重入现象。

    二、串口接收中断
    要使用串口中断,必须在配置串口时注意选择:


    生成代码后,还需要根据具体情况作些修改,首先将缓存区的长度修改为32字节,并将宏定义从c文件移到h文件去,以便在main.c文件中使用:


    然后在main.c文件中定义好外部变量:


    再对接收中断处理函数作少量修改,将原来循环使用的缓存区改为从头使用:


    这样就可以在主循环中对接收字符长度的变量进行判断,若大于零则表示串口接收到了数据,处理之后再将长度变量清零,代码如下:

  1. if(uart1RxCount>0){
  2.     DisplayString(0,54,16,uart1RxBuffer,0);                //在屏幕中显示接收到的字符
  3.     printf("接收到的数据:%s\r\n",&uart1RxBuffer);   //串口发送接收到的字符
  4.     uart1RxCount = 0;                                             //接收长度置零,准备下一次接收
  5.     if(uart1RxBuffer[0]=='D'){                                  //处理日期时间校准
  6.         year = (uart1RxBuffer[1]-48)*1000 + (uart1RxBuffer[2]-48)*100 + (uart1RxBuffer[3]-48)*10 + uart1RxBuffer[4]-48;
  7.         month = (uart1RxBuffer[5]-48)*10 + uart1RxBuffer[6]-48;
  8.         day = (uart1RxBuffer[7]-48)*10 + uart1RxBuffer[8]-48;
  9.         hour = (uart1RxBuffer[9]-48)*10 + uart1RxBuffer[10]-48;
  10.         minute = (uart1RxBuffer[11]-48)*10 + uart1RxBuffer[12]-48;
  11.         second = 0;
  12.         week = GetWeek(year,month,day);
  13.         DS1307_write_date();                                  //校对日期时间
  14.     }
  15.         }

    这是通过串口调试助手测试的截屏,单片机每秒发送一次数据,当接收到数据时立即原样发回:


    这是将接收到的数据显示在屏幕中:


    三、外部中断
    我测试用的DS1307日历模块是带有秒信号输出的,我将这个信号连接在RA5引脚,作为外部中断源。在MCC中将RA5引脚配置为下降沿触发:


    然后在RA5中断处理函数中进行秒计数并设置标志:


    在主循环中的处理代码如下:
  1. if(handler == 1){
  2.     handler = 0;
  3.     if(second>59){                                 //计数达到1分钟时,从日历芯片读一次时间数据
  4.         second = 0;
  5.         DS1307_read_date();
  6.         DisplayDate(year,month,day);               //刷新年月日显示
  7.     }
  8.     DisplayTime(hour,minute,second);               //每秒刷新时间显示
  9.     printf("串口通讯发送测试!\r\n");              //发送串口测试信息
  10.         }


    下面是本次实验的项目文件压缩包:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

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