6273|1

306

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

STM32定时器中断和延时函数 [复制链接]

敲了一个程序,用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);
                       
        }
}


此帖出自stm32/stm8论坛

最新回复

获取ds1302时间数据的通信过程被定时器打断了。在读取ds1302的时候关闭定时器,之后再打开。我想应该是这样  详情 回复 发表于 2018-10-5 20:35
点赞 关注(1)
 

回复
举报

862

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
获取ds1302时间数据的通信过程被定时器打断了。在读取ds1302的时候关闭定时器,之后再打开。我想应该是这样
此帖出自stm32/stm8论坛
 
个人签名水不撩不知深浅 人不拼怎知输赢
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表