#申请原创#
中断实验主要是测试定时器中断、串口接收中断和外部中断等三种类型。通过测试,了解到中断发生后,主处理函数是INTERRUPT_InterruptManager (),在这个函数中对中断源进行判断,然后调用相应的处理函数,详见下图:
一、定时器中断
定时器中断是在开箱测试时就完成了的,当时控制LED闪烁是通过定时器对一个变量进行计数,然后在主循环中对这个变量进行检测,从而完成控制LED的亮灭。我将定时器0配置为10毫秒触发:
然后在定时器中断处理函数中对计时变量进行加1运算:
最后在主循环中对变量进行判断和清零处理:
这样做的好处是中断函数中代码很少,不会出现重入现象。
二、串口接收中断
要使用串口中断,必须在配置串口时注意选择:
生成代码后,还需要根据具体情况作些修改,首先将缓存区的长度修改为32字节,并将宏定义从c文件移到h文件去,以便在main.c文件中使用:
然后在main.c文件中定义好外部变量:
再对接收中断处理函数作少量修改,将原来循环使用的缓存区改为从头使用:
这样就可以在主循环中对接收字符长度的变量进行判断,若大于零则表示串口接收到了数据,处理之后再将长度变量清零,代码如下:
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(); //校对日期时间
}
}
这是通过串口调试助手测试的截屏,单片机每秒发送一次数据,当接收到数据时立即原样发回:
这是将接收到的数据显示在屏幕中:
三、外部中断
我测试用的DS1307日历模块是带有秒信号输出的,我将这个信号连接在RA5引脚,作为外部中断源。在MCC中将RA5引脚配置为下降沿触发:
然后在RA5中断处理函数中进行秒计数并设置标志:
在主循环中的处理代码如下:
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)
|