学习MSP432M0手册——第七节timer定时器

一、本节内容

基本要求: 采用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手册——第二节GPIO输入和输出

学习MSP432M0手册——第三节GPIO中断

学习MSP432M0手册——第四节SDK和UART

学习MSP432M0手册——第五节systick和UART接收

学习MSP432M0手册——第六节ADC采样

四、软件代码 

#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串口记得初始化中断。。。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值