一、本节内容
基本要求: 采用upmode例程
1. 修改程序,实现在定时器TIMEG0中断中2秒钟led翻转一次
2. 修改程序,增加实现定时TIMEG8的编程,要求0.5秒中断一次,实现RGB灯白灯翻转一次
进阶要求:
1. 引入串口,要求实现一个倒计时的提示器功能,要求串口输出如下计数器功能
秒秒:毫秒 //两个全局变量,一个代表秒,一个代表毫秒
10:00
09:50
09:00
08:500
08: 00
....
00:50
00:00
10:00
09:50
09:00 //定时中断到了,如何计算当前的倒计时时间,并且如何串口输出信息
2. MSPM0串口收到’R’字符后,重新开始计数
二、原理讲解
本节先使用syscfg配置GPIO口,UART串口,TIM定时器,然后使用直接生成的初始化代码,再将LED闪烁写入TIM中断中,将倒计时写入UART中断中。
三、库函数
部分库函数和寄存器:
本节所有库函数都在往期介绍过:
学习MSP432M0手册——第五节systick和UART接收
四、软件代码
#include "ti_msp_dl_config.h"
/* ((32KHz / (32+1)) * 0.5s) = 45 - 1 = 495 due to N+1 ticks */
#define TIMER_500_MILLISECONDS_TICKS (495)
/* ((32KHz / (32+1)) * 0.05s) = 50 - 1 = 49 due to N+1 ticks */
#define TIMER_50_MILLISECONDS_TICKS (49)
int a=0,b=0,c=0,d=0,i=0,count=10;//倒计时参数
volatile uint8_t rec;//数据记录
int main(void)
{
SYSCFG_DL_init();//初始化
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);//TIM0中断初始化
NVIC_EnableIRQ(TIMER_1_INST_INT_IRQN); //TIM1中断初始
NVIC_EnableIRQ(UART_0_INST_INT_IRQN); //UART中断初始化
DL_SYSCTL_enableSleepOnExit();//开启睡眠
DL_TimerG_startCounter(TIMER_0_INST);//TIM0时钟开启
DL_TimerG_startCounter(TIMER_1_INST); //TIM1时钟开启
//中断未进入等待
while (1) {
__WFI();
}
}
void TIMER_0_INST_IRQHandler(void)//TIM0中断函数
{
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {//检测TIM0中断接收
case DL_TIMER_IIDX_ZERO:
DL_GPIO_togglePins(GPIO_LEDS_PORT,(GPIO_LEDS_USER_LED_1_PIN)); //GPIO电平翻转
break;
default:
break;
}
}
void TIMER_1_INST_IRQHandler(void)//TIM1中断函数
{
switch (DL_TimerG_getPendingInterrupt(TIMER_1_INST)) {//检测TIM1中断接收
case DL_TIMER_IIDX_ZERO:
if(i<60&&i>=0)//倒计时数据处理
i--;
if(i<0)
{
i=59;
count--;
}
if(count<0){
count=10;
i=0;
}
a=count/10;
b=count%10;
c=i/10;
d=i%10;
DL_UART_transmitData(UART0,'0'+a);//串口发送数据
delay_cycles(20000);
DL_UART_transmitData(UART0,'0'+b);
delay_cycles(20000);
DL_UART_transmitData(UART0,':');
delay_cycles(20000);
DL_UART_transmitData(UART0,'0'+c);
delay_cycles(20000);
DL_UART_transmitData(UART0,'0'+d);
delay_cycles(20000);
DL_UART_transmitData(UART0,'\r');
delay_cycles(20000);
DL_UART_transmitData(UART0,'\n');
delay_cycles(20000);
break;
default:
break;
}
}
void UART_0_INST_IRQHandler (void)//UART串口中断
{
switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {/检测UART中断接收
case DL_UART_MAIN_IIDX_RX:
rec = DL_UART_Main_receiveData(UART_0_INST);//数据储存
switch (rec) //初始化倒计时
{ case 'R' :
i=0;
count=10;
break;
default:
break;
}
}
}
注意:UART串口记得初始化中断。。。