[求助] STM32定时器中断和延时函数

燕园技术宅   2018-10-5 19:02 楼主
敲了一个程序,用STM32F103RCT6单片机得TIM3定时器中断 1s刷新依次OLED显示屏显示DS1302得时间,然后主函数里面得延时函数就失效了,关掉定时器中断延时函数就可以用,这是为什么? 下面是我得延时函数。定时器中断里面没有用到延时函数。#include "delay.h"

static u8  fac_us=0;                                                                                        //us延时倍乘数                          
static u16 fac_ms=0;                                                                                        //ms延时倍乘数,在ucos下,代表每个节拍的ms数

/*
*函数名:延时初始化函数
*参         数:无
*返回值:无
*作  者:程晓强
*/
void delay_Init(void)
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);                //选择外部时钟  HCLK/8
        fac_us=SystemCoreClock/8000000;                                                                //为系统时钟的1/8  
        fac_ms=(u16)fac_us*1000;       
}
/*
*函数名:ms延时函数
*参         数:u16 nms
*返回值:无
*作  者:程晓强
*/
void delay_ms(u16 nms)
{
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                                                //时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;                                                                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;                                        //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                                                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;                                        //关闭计数器
        SysTick->VAL =0X00;     
}
/*
*函数名:ns延时函数
*参         数:u16 nus
*返回值:无
*作  者:程晓强
*/
void delay_us(u32 nus)
{
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;                                                                         //时间加载                           
        SysTick->VAL=0x00;                                                                                //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;                                        //开始倒数          
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                                                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;                                        //关闭计数器
        SysTick->VAL =0X00;                     
}


void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {
                  TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
            DS1302_Get_Time(time);
                        OLED_ShowString(16,0,".");  
                        OLED_ShowString(66,0,":");
                        OLED_ShowString(90,0,":");
                        OLED_ShowNum(0,0,time[4],1,16);
                        OLED_ShowNum(8,0,time[5],1,16);
                        OLED_ShowNum(24,0,time[6],1,16);
                        OLED_ShowNum(32,0,time[7],1,16);       
                        OLED_ShowNum(50,0,time[9],1,16);
                        OLED_ShowNum(58,0,time[10],1,16);
                        OLED_ShowNum(74,0,time[11],1,16);
                        OLED_ShowNum(82,0,time[12],1,16);
                        OLED_ShowNum(98,0,time[13],1,16);
                        OLED_ShowNum(106,0,time[14],1,16);
                       
        }
}


回复评论 (1)

获取ds1302时间数据的通信过程被定时器打断了。在读取ds1302的时候关闭定时器,之后再打开。我想应该是这样
水不撩不知深浅 人不拼怎知输赢
点赞  2018-10-5 20:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复