应广单片机定时器中断配置

        应广单片机主要应用于消费电子,资源有限,只有一个16bit定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置

不说那么多了,直接上代码.

BIT     LED_G           :        PA.3;

#define GRE_LED_FLASH  {if(LED_G){LED_G=0;}else{ LED_G=1;}}


/*****************LED*******************/
word ucFlashTmrCnt;
BIT ubMsFlag; 

/****************系统时钟*********************/
bit     FLAG_NMS;
byte    count;
word    usTmrCnt;

/**************T16*************************/
void    TIME16_Init(void)
{

  /*设置计数值*/
    usTmrCnt=488;

    ubMsFlag=0;
    /*定时器配置*/
    $    T16M    IHRC,/1,BIT11;   
    INTEN.T16 =1;/*开启定时中断*/
    
    Intrq.T16 =0;/*清除中断请求*/
}

void UpdateLedTmr(void)
{
     
     /*1ms进行一次计数*/
    ucFlashTmrCnt++;
    if(ucFlashTmrCnt>250)
    {
        ucFlashTmrCnt=0;
        /*闪灯*/
        GRE_LED_FLASH;
    }
  

}

void    FPPA0 (void)
{
    .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V;
    $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;

   /*上电延时*/
    .delay 40000;
    /*端口配置*/
    $  LED_G     OUT,HIGH;          
 
    /*定时器配置*/
    TIME16_Init();
    
       ENGINT //全局中断开启

    while (1)
    {
            wdreset;
         /*1ms定时时间到*/
         if ( FLAG_NMS )
         {
          
             UpdateLedTmr();

            /*清除标记*/
            FLAG_NMS=0;
        }

    }
}

void    Interrupt ( void )
{
    pushaf;

    if ( Intrq.T16 )  
    {

        Intrq.T16    =    0;
        /*重新设置计数值*/
        STT16 usTmrCnt;

        
        
        if ( count>0 )
        {
            count--;
        }
        else
        {
            count   =   9;
            /*1ms*/
            FLAG_NMS=   1;      
        }

    }

    popaf;
}
 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
华大单片机定时器中断可以通过以下步骤进行配置: 1. 首先选择使用哪一个定时器作为中断源。华大常用的定时器有TIM1、TIM2、TIM3等。 2. 配置定时器时钟源。可以选择内部时钟或外部时钟源,并设置定时器的预分频器和计数器周期,以确定定时器中断的时间间隔。 3. 使能定时器中断。在定时器的控制寄存器中,将中断使能位设为1,表示当定时器计数器溢出时,会触发定时器中断。 4. 编写定时器中断服务程序。当定时器中断被触发时,控制权会转移到定时器中断服务程序中,程序可以在其中执行一些定时操作。 下面是一个简单的例子,展示了如何配置TIM2定时器,并在定时器中断服务程序中更新LED灯的状态: ``` #include "stm32f10x.h" void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查中断标志 { GPIO_ToggleBits(GPIOC, GPIO_Pin_8); // 翻转LED灯状态 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志 } } void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟 TIM_TimeBaseStructure.TIM_Period = 999; // 计数器周期为1000 TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器为7200-1 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化TIM2 TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除中断标志 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能TIM2中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置中断优先级 TIM_Cmd(TIM2, ENABLE); // 启动TIM2 } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化LED灯 TIM2_Configuration(); // 配置定时器 while (1) { } } ``` 在上面的代码中,TIM2定时器的时钟源为内部时钟,预分频器为7199,计数器周期为999,即定时时间为1秒。定时器中断服务程序中,使用GPIO_ToggleBits函数翻转LED灯的状态,并清除中断标志位。在主函数中,调用TIM2_Configuration函数进行定时器的配置,并在死循环中等待定时器中断的触发。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值