当前位置: 首页 > article >正文

STM8S自学笔记-005 延时函数的3种方式

STM8S自学笔记-005 精准延时

  • 精准延时
    • 延时功能的底层驱动
    • 延时功能的应用层

【修订记录】
1、20210807,第一版
2、20210813,错字修订
3、20230206,增加定时器硬件延时
4、20230207,硬件延时方式增加

精准延时

软件延时不必多说,CSDN上已经有很多开发者贡献了代码,我也是抄他们的。
硬件延时也是抄的,我的工作是把两者结合在了一起,用延时方式宏定义做了编译区分,并进行了模块化设计。

延时功能的底层驱动

延时方法的配置宏DELAY_METHOD ,位于delay_hal.h中。
目前有3种:软件延时,TIM2延时,TIM4延时。

/********************************************************************************* @file    delay_hal.c * @author  * @version V1.0.0* @date    DD-MM-YYYY* @brief   *******************************************************************************/ /* Includes ------------------------------------------------------------------*/
#include "delay_hal.h"/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Variables -----------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Functions -----------------------------------------------------------------*/
/*** @brief  Timer Init for Delay* @param  None* @retval None*/
void DELAY_HAL_TimerInit(void)
{
#if     DELAY_METHOD == DELAY_TIM2CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);       /*  */TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_1, 65535);     /* time_cnt_MAX = (65535 * DIV / 16)(us) */TIM2_Cmd(DISABLE);#elif   DELAY_METHOD == DELAY_TIM4CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);       /*  */TIM4_DeInit();TIM4_TimeBaseInit(TIM4_PRESCALER_64, 255);      /* time_cnt_MAX = (255 * DIV / 16)(us) */TIM4_Cmd(DISABLE);
#endif
}/*** @brief  * @param  None* @retval None*/
void DELAY_HAL_TimerCmd(FunctionalState NewState)
{
#if     DELAY_METHOD == DELAY_TIM2TIM2_Cmd(NewState);
#elif   DELAY_METHOD == DELAY_TIM4TIM4_Cmd(NewState);
#endif
}/******************************************************************************/

延时功能的应用层

在硬件延时的微秒级函数中,可考虑增加变量value的溢出防止对策。

/********************************************************************************* @file    delay_apl.c * @author  * @version V1.0.0* @date    DD-MM-YYYY* @brief   *******************************************************************************/ /* Includes ------------------------------------------------------------------*/
#include "delay_apl.h"/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Variables -----------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void DELAY_APL_Delay1us(void);/* Functions -----------------------------------------------------------------*/
/*** @brief  Delay 1 us* @param  None* @retval None*/
#pragma optimize = none
static void DELAY_APL_Delay1us(void)
{asm("nop");asm("nop");asm("nop");asm("nop");
}/*** @brief  Delay 1 us @ SYSCLK = 16MHz* @param  us: the time to wait* @retval None*/
#pragma optimize = none
void DELAY_APL_Delayus(uint32_t us)
{
#if     DELAY_METHOD == DELAY_SOFTwhile (us--){DELAY_APL_Delay1us();}#elif   DELAY_METHOD == DELAY_TIM2uint16_t value = us * 16 / 1;           /* DIV_1 */TIM2_SetCounter(0);                     /* Clear Counter REG */TIM2_Cmd(ENABLE);                       /* Start Countor */while (TIM2_GetCounter() < value);      /* Wait */TIM2_Cmd(DISABLE);                      /* Stop Countor */#elif   DELAY_METHOD == DELAY_TIM4uint8_t value = us * 16 / 64;           /* DIV_64 */TIM4_SetCounter(0);                     /* Clear Counter REG */TIM4_Cmd(ENABLE);                       /* Start Countor */while (TIM4_GetCounter() < value);      /* Wait */TIM4_Cmd(DISABLE);                      /* Stop Countor */
#endif
}/*** @brief  Delay 1 ms* @param  ms: the time to wait* @retval None*/
#pragma optimize = none
void DELAY_APL_Delayms(uint32_t ms)
{
#if     DELAY_METHOD == DELAY_SOFTuint16_t i;                             /* Type = u16 (Must) */while (ms--){for (i = 900;i > 0; i--){DELAY_APL_Delay1us();}}#elif   DELAY_METHOD == DELAY_TIM2while (ms--){DELAY_APL_Delayus(1000);}#elif   DELAY_METHOD == DELAY_TIM4while (ms--){DELAY_APL_Delayus(1000);}
#endif    
}/*** @brief  DELAY_APL_Delay* @param  n: the time to wait* @retval None*/
#pragma optimize = none
void DELAY_APL_Delay(uint32_t n)
{uint32_t m = n;while (m--);
}/******************************************************************************/
http://www.lryc.cn/news/2414362.html

相关文章:

  • 泰坦尼克号建模分析-你能活下来吗?
  • 高分一号PMS相机多光谱和全色数据预处理
  • VUE通用后台管理系统(一)登录
  • python入门教程(非常详细),从零基础入门到精通,看完这一篇就够了
  • LVM----扩展/缩小VG与扩展/缩小LV
  • 多目标优化算法平台PlatEMO的基本使用方法
  • Java 反射 java.lang.reflect包
  • Hive--数据抽样的常用三种方法(随机/数据块/分桶)
  • 【echarts】使用心得之ChinaMap
  • DL2-TensorFlow2.0编程基础
  • NetBeans配置Tomcat
  • 中国排名前100的IT公司
  • SVN入门教程
  • [转]Centos5 下安装/配置lvm使用reiserfs文件系统
  • 北京公安局出入境管理处地址
  • Spring配置文件applicationContext.xml中bean>>property>>name属性的含义
  • Android和JXTA协议模型的无线D2D通信技术
  • MFC控件(四)(图像列表控件CImageList)
  • 「Linux」- 平均负载(Load Average) @20210210
  • IOS 时区日期处理及定时 (NSDate,NSCalendar,NSTimer,NSTimeZone)
  • 树莓派5串口通信
  • java trimleft_js String.prototype.trim字符去前后空格的扩展
  • Python教程:老师傅带你爬取全网妹子图!
  • vbs格式编程教程基础
  • Struts2框架漏洞总结与复现(下)
  • gbk编码在线转换工具_免费在线PDF转换小工具,让你工作效率提高90%
  • 运维堡垒机Gate One-学习笔记
  • 从零开始学习Oracle之数据备份与还原
  • 常用时序逻辑电路模块:计数器
  • 新手如何学习c语言? 小马带你入门