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

[复制链接]
26684|0
手机看帖
扫描二维码
随时随地手机跟帖
hu9jj|  楼主 | 2021-8-31 12:37 | 显示全部楼层 |阅读模式
#申请原创#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    下面是本次实验的项目文件压缩包:
Text2.X.rar (1.88 MB)
NEW_14.jpg
NEW_12.jpg
Intrript_1.jpg

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则