敲了一个程序,用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);
}
}
获取ds1302时间数据的通信过程被定时器打断了。在读取ds1302的时候关闭定时器,之后再打开。我想应该是这样