STM32学习之:定时器程序设计探讨

发布者:平和思绪最新更新时间:2018-10-21 来源: eefocus关键字:STM32  定时器程序 手机看文章 扫描二维码
随时随地手机看文章

假设使用定时器3每1毫秒定时;保存至SD卡的函数是StartSave();
第一种情况:定时器快,主循环慢
1、代码设计1(错误的设计)
[cpp] view plain copy
int cnt = 0; //计数  
//TIM3中断处理函数  
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    
        cnt ++;     
    }  
}  
void main(void)  
{  
   代码段1  
   while(1)  
   {  
     代码段2  
     if(cnt %100 == 0)  
     {  
    StartSave();  
     }  
     代码段3  
   }  
}  
分析:第一种设计经测试发现并没有按照预期的100毫秒间隔保存;原因何在呢?
很明显后台程序运行较快,当cnt 变为100的倍数时,主循环可能到达“代码段3”,当主循环再次到达
“代码段2”时,定时器中断已经改变了cnt的值。


2、代码设计2(在这种情况下正确)
[cpp] view plain copy
int cnt = 0; //计数  
unsigned char isOK = 0;  
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    
        if(cnt++ % 100 == 0)  
             isOK = 1;  
    }  
}  
void main(void)  
{  
   代码段1  
   while(1)  
   {  
     代码段2  
     if(isOK == 1)  
     {  
    isOK = 0;  
        StartSave();  
     }  
     代码段3  
   }  
}  
设计2避免了1中所出现的问题。
第二种情况:定时器慢,主循环快
在这种情况下上面的代码设计2就出现问题了。出现保存多了的情况。
原因很明显,isOK这个变量的变化相对于主循环来说变化太慢了。会出现isOK一直为1 的情况。
假设定时器定时1ms,主循环0.5ms周期
1、代码设计1(错误的设计)
[cpp] view plain copy
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    
        cnt++;//该值理论保持时间仅1ms  
    }  
}  
void main(void)  
{  
   unsigned char saveFin = 0;  
   代码段1  
   while(1)  
   {  
     代码段2  
     if(cnt%100 )  
     {  
        StartSave();//明显出现100ms内多次保存的情况,因为主循环快  
     }  
     代码段3  
   }  
}  
2、代码设计2(正确的设计)
[cpp] view plain copy
unsigned char saveFin = 0;  
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    
        cnt++;//该值理论保持时间仅1ms  
    }  
}  
void main(void)  
{  
   unsigned char saveFin = 0;  
   代码段1  
   while(1)  
   {  
     代码段2  
     if(cnt%100 == 0 && saveFin == 0 )  
     {  
        saveFin = 1;  
        StartSave();  
     }  
     else  
     {  
        saveFin = 0;   
     }  
     代码段3  
   }  
}  
第三种情况:不能确定定时器和main循环周期哪个快的设计
当然主循环的周期不能大于保存周期100ms
[cpp] view plain copy
unsigned char isOK = 0;  
unsigned int clkCnt = 0;  
void TIM3_IRQHandler(void)  
{  
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)   
    {  
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );   
        if(clkCnt++ % 10 == 0)  
             cnt++;//该值理论保持时间10ms,需要在主循环中清零  
    }  
}  
void main(void)  
{  
   unsigned char saveFin = 1;//注意这里的初始值为1,与前面设计不同  
   代码段1  
   while(1) //循环周期不能大于10ms,否则丢失对cnt的判断  
   {  
     代码段2  
     if(cnt%10 == 0) //例如在100ms--110ms之间时将“保存标志”清零  
     {  
    saveFin = 0;   
     }  
     else  //例如在110ms--200ms之间时完成保存  
     {  
        if(saveFin == 0)//在110ms--200ms之间只能保存一次的代码设计  
        {  
           startSave();  
           saveFin = 1;  
        }  
     }  
     代码段3  
   }  
}

关键字:STM32  定时器程序 引用地址:STM32学习之:定时器程序设计探讨

上一篇:STM32学习之:事件标志组
下一篇:STM32学习之:Context—M3简介

推荐阅读最新更新时间:2024-03-16 16:17

STM32启动模式ISP下载
mcuisp flymcu 同一类型 DTR低电平复位,RTS高电平进BootLoader 一键下载电路: 先让RTS拉高BOOT0(设置BOOT0为1),然后再让DTR控制RST为低(STM32为低电平复位).然后再释放RTS为高(停止复位),然后再开始串口下载代码(此时BOOT0可以为高,也可以为低). RTS、DTR输出高,然后DTR输出高、RTS输出低,产生复位, 然后DTR输出低,复位结束,BootLoad启动 开始ISP下载,下载结束 RTS变高,DTR变高, 顺序不可变。 Boot1 Boot0 启动模式 说明 x
[单片机]
<font color='red'>STM32</font>启动模式ISP下载
STM32 | protobuf在STM32平台的移植使用
nanopb简介 同之前文章介绍的Protobuf-c类似,nanopb是也是一个轻量的、支持C语言的Protobuf。 nanopb下载地址: https://jpa.kapsi.fi/nanopb/download/ 我这里使用nanopb-0.3.8-windows-x86,目录: nanopb在STM32上的使用 首先,准备一个可进行串口打印的STM32工程,如: 在工程目录下新建一个Protobuf文件夹,并把nanopb-0.3.8-windows-x86目录下如下7个文件 pb.h pb_common.c pb_common.h pb_decode.c pb_decode.h pb_enco
[单片机]
<font color='red'>STM32</font> | protobuf在<font color='red'>STM32</font>平台的移植使用
STM32开发笔记82: 使用C++语言控制LED闪烁
单片机型号:STM32L053R8T6 本文介绍应用C++语言控制LED闪烁的方法。 先看电路图,单片机PB12引脚控制LED的亮灭,当PB12引脚给出低电平LED亮,当PB12引脚给出高电平LED灭。 步骤如下: 1、打开hal.h文件,建立CLed类,其从CIO_Output_OST_High类继承,CIO_Output_OST_High类为引脚输出类,OST是指其具有3个成员函数,分别为Open(打开操作),Shut(关闭操作)和Turn(翻转操作),High的意思是指其上电为高电平。 同样还有CIO_Output_OST_Low类,其上电为低电平。 class CLed:public CIO_Out
[单片机]
<font color='red'>STM32</font>开发笔记82: 使用C++语言控制LED闪烁
STM32通用同步异步收发器(USART)
通用同步异步收发器—–USART 通讯方式: 1、串行通讯 2、异步/同步 3、全双工 物理层 RS232标准 两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于 RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 标准”的电平信号,才能实现通讯。 协议层 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。
[单片机]
<font color='red'>STM32</font>通用同步异步收发器(USART)
关于STM32与SD卡通信的一些思考与总结
SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的.c
[单片机]
STM32开发工具荣登EE Times年度10大产品榜首
    意法半导体以创新的STM32 Primer2手持原型开发工具荣登EE Times 2009年度10大产品的榜首。STM32 Primer2手持原型开发工具让产品开发人员轻松使用意法半导体的基于ARM Cortex-M3的32位STM32微控制器的强大功能。STM32 Primer2和其它产品凭借在EETimes的 EE Product Center中所记录的点击量进入十大排名榜。     意法半导体的STM32 Primer2于2009年2月发布,大小如同手机,提供彩色触摸屏、强大的音频等多项功能,让开发人员能够快速设计外观时尚的演示产品。与传统的工程开发电路板不同,用户使用STM32 Primer2可以演示高品
[嵌入式]
STM32 串口的简单配置
配置串口包括三部分内容: 1. I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入 (GPIO_Mode_IN_FLOATING); 2. 串口配置:波特率等; 3. 中断向量配置:一般用中断方式接收数据。 注意事项: 1. USART1是挂在APB2,使能时钟命令为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE ); 其他几个则挂在APB1上,如2口: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE ); 2. 配置4口和5口的时候,中断名为UART4、UART
[单片机]
stm32单片机的基本组成是什么
stm32是一款高性能、低成本、低功耗、可裁剪的嵌入式单片机。那么stm32单片机的基本组成是什么呢?下面小编就为大家来介绍一下stm32单片机的基本组成。 大家都知道,单片机是由PC发展来的,优点有高可靠性、高抗干扰性、价格便宜,被广泛的应用在工业控制、医疗器械、信息通信等领域上。 STM32单片机内部由CPU、FLASH、RAM、总线、外设、电源、PLL锁相环和时钟管理器,只有电源不需要提供时钟输入,其他的外设和CPU的工作都需要提供时钟输入。 CPU cpu也叫中央处理器,有着备数据计算和指令执行的作用。 RAM RAM也叫数据存储器、随机存储器,能够可读可写。能够存储一些中间变量,数据丢失。 ROM rom也叫
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved