【联盛德W806上手笔记】五、TIM定时器

目录

  • 定时器
  • 库函数
    • 函数
    • 参数
  • Demo中的测试程序
    • main.c
    • wm_hal_msp.c
    • wm_it.c
    • 实验现象

Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0


       摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》

定时器

       微秒与毫秒计时(据时钟频率配置计数个数),实现六个可配置的 32 位计数器,当相应计算器配置的计数完成时,产生相应中断。

库函数

函数

       打开wm_tim.h,有如下的函数声明:

HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
//初始化所用的定时器及其节拍所用时间单位和计数值等基本参数配置
HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim);
//将初始化之后的定时器恢复成默认的状态–各个寄存器复位时的值
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
//初始化定时器时钟、优先级和启用对应中断
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim);
//将对应定时器恢复成默认的状态
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
//定时器开始计数
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
//定时器停止计数
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
//定时器中断方式启动计数
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
//定时器停止中断方式计数
HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);
//获取定时器状态
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);
//定时器中断服务函数,用来响应定时器中断。函数实体里面有两个功能,一是清除中断标记位,二是调用下面的回调函数。
void HAL_TIM_Callback(TIM_HandleTypeDef *htim);
//中断回调函数,可以理解为中断函数具体要响应的动作。

参数

结构体和枚举类型

typedef enum
{HAL_TIM_STATE_RESET             = 0x00U,HAL_TIM_STATE_READY             = 0x01U,HAL_TIM_STATE_BUSY              = 0x02U,HAL_TIM_STATE_TIMEOUT           = 0x03U,HAL_TIM_STATE_ERROR             = 0x04U
} HAL_TIM_StateTypeDef;typedef struct
{uint32_t Unit;uint32_t AutoReload;uint32_t Period;} TIM_Base_InitTypeDef;typedef struct
{uint32_t                        Instance;TIM_Base_InitTypeDef            Init;HAL_LockTypeDef                 Lock;__IO HAL_TIM_StateTypeDef       State;} TIM_HandleTypeDef;

宏参数

#define TIM                ((TIM_TypeDef *)TIM_BASE)
#define TIM0				0
#define TIM1				1
#define TIM2				2
#define TIM3				3
#define TIM4				4
#define TIM5				5#define TIM_UNIT_US				0x00000000U
#define TIM_UNIT_MS				0x00000001U
//定时器节拍的时间单位#define TIM_AUTORELOAD_PRELOAD_DISABLE                0x00000001U
#define TIM_AUTORELOAD_PRELOAD_ENABLE                 0x00000000U

#define IS_TIM_INSTANCE(INSTANCE)\(((INSTANCE) == TIM0)    || \((INSTANCE) == TIM1)    || \((INSTANCE) == TIM2)    || \((INSTANCE) == TIM3)    || \((INSTANCE) == TIM4)    || \((INSTANCE) == TIM5))#define IS_TIM_UNIT(UNIT) (((UNIT) == TIM_UNIT_US) || \((UNIT) == TIM_UNIT_MS))#define IS_TIM_AUTORELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE))#define __HAL_TIM_ENABLE(__HANDLE__)				(TIM->CR |= TIM_CR_TIM_EN((__HANDLE__)->Instance - TIM0))#define __HAL_TIM_DISABLE(__HANDLE__)				(TIM->CR &= ~(TIM_CR_TIM_EN((__HANDLE__)->Instance - TIM0)))#define __HAL_TIM_ENABLE_IT(__HANDLE__)				(TIM->CR |= TIM_CR_TIM_TIE((__HANDLE__)->Instance - TIM0))#define __HAL_TIM_DISABLE_IT(__HANDLE__)			(TIM->CR &= ~(TIM_CR_TIM_TIE((__HANDLE__)->Instance - TIM0)))#define __HAL_TIM_GET_FLAG(__HANDLE__)          	((TIM->CR & TIM_CR_TIM_TIF((__HANDLE__)->Instance - TIM0)) == \TIM_CR_TIM_TIF((__HANDLE__)->Instance - TIM0))#define __HAL_TIM_CLEAR_IT(__HANDLE__)      		(TIM->CR |= TIM_CR_TIM_TIF((__HANDLE__)->Instance - TIM0))

Demo中的测试程序

main.c


#include <stdio.h>
#include "wm_hal.h"TIM_HandleTypeDef htim0;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim4;
TIM_HandleTypeDef htim5;void Error_Handler(void);
static void TIM0_Init(void);
static void TIM1_Init(void);
static void TIM2_Init(void);
static void TIM3_Init(void);
static void TIM4_Init(void);
static void TIM5_Init(void);int main(void)
{SystemClock_Config(CPU_CLK_160M);printf("enter main\r\n");TIM0_Init();HAL_TIM_Base_Start_IT(&htim0);TIM1_Init();HAL_TIM_Base_Start_IT(&htim1);TIM2_Init();HAL_TIM_Base_Start_IT(&htim2);TIM3_Init();HAL_TIM_Base_Start_IT(&htim3);TIM4_Init();HAL_TIM_Base_Start_IT(&htim4);TIM5_Init();HAL_TIM_Base_Start_IT(&htim5);while(1){HAL_Delay(1000);}
}static void TIM0_Init(void)
{htim0.Instance = TIM0;htim0.Init.Unit = TIM_UNIT_US;htim0.Init.Period = 1000000;htim0.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim0) != HAL_OK){Error_Handler();}
}static void TIM1_Init(void)
{htim1.Instance = TIM1;htim1.Init.Unit = TIM_UNIT_US;htim1.Init.Period = 1001000;htim1.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim1) != HAL_OK){Error_Handler();}
}static void TIM2_Init(void)
{htim2.Instance = TIM2;htim2.Init.Unit = TIM_UNIT_US;htim2.Init.Period = 1002000;htim2.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}
}static void TIM3_Init(void)
{htim3.Instance = TIM3;htim3.Init.Unit = TIM_UNIT_US;htim3.Init.Period = 1003000;htim3.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}
}static void TIM4_Init(void)
{htim4.Instance = TIM4;htim4.Init.Unit = TIM_UNIT_US;htim4.Init.Period = 1004000;htim4.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim4) != HAL_OK){Error_Handler();}
}static void TIM5_Init(void)
{htim5.Instance = TIM5;htim5.Init.Unit = TIM_UNIT_US;htim5.Init.Period = 1005000;htim5.Init.AutoReload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim5) != HAL_OK){Error_Handler();}
}void HAL_TIM_Callback(TIM_HandleTypeDef *htim)
{printf("%d ", htim->Instance);if (htim->Instance == TIM0){}if (htim->Instance == TIM1){}if (htim->Instance == TIM2){}if (htim->Instance == TIM3){}if (htim->Instance == TIM4){}if (htim->Instance == TIM5){}
}void Error_Handler(void)
{while (1){}
}void assert_failed(uint8_t *file, uint32_t line)
{printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}

wm_hal_msp.c

#include "wm_hal.h"void HAL_MspInit(void)
{}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{__HAL_RCC_TIM_CLK_ENABLE();HAL_NVIC_SetPriority(TIM_IRQn, 0);HAL_NVIC_EnableIRQ(TIM_IRQn);
}void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{// 由于所有的TIM共用一个时钟和中断,所以如果只用了一路TIM,在DeInit时可以关闭时钟和中断,但如果使用了多路TIM,在某一路DeInit时,如果// 关闭时钟和中断,会影响其他在运行的TIM
//	__HAL_RCC_TIM_CLK_DISABLE();
//	HAL_NVIC_DisableIRQ(TIM_IRQn);
}

wm_it.c


#include "wm_hal.h"extern TIM_HandleTypeDef htim0;
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim4;
extern TIM_HandleTypeDef htim5;#define readl(addr) ({unsigned int __v = (*(volatile unsigned int *) (addr)); __v;})
__attribute__((isr)) void CORET_IRQHandler(void)
{readl(0xE000E010);HAL_IncTick();
}__attribute__((isr)) void TIM0_5_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim0);HAL_TIM_IRQHandler(&htim1);HAL_TIM_IRQHandler(&htim2);HAL_TIM_IRQHandler(&htim3);HAL_TIM_IRQHandler(&htim4);HAL_TIM_IRQHandler(&htim5);
}

实验现象

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux驱动分离分层的概念

这个分离分层的概念和输入子系统有点像&#xff0c;但不是完全一样的。为什么会再弄一个这个模型出来我也没有搞懂&#xff0c;现在我的学习还停留在把知识学懂的层面上。至于为什么会产生这种知识&#xff0c;现在我还无从解释&#xff0c;还需时日成长。 这次先上代码在解释整…

IOS-企业开发人员账号amp;邓白氏码申请记录

Apple开发人员账号分三种&#xff0c;个人。公司&#xff0c;还有企业。个人和公司都称为标准账号。另一种是教育机构的账号。 账号介绍 个人和公司的就不说了。如今仅仅说企业账号 首先是申请企业账号的地址&#xff1a; https://developer.apple.com/programs/ios/enterpri…

wordpress置顶文章调用与设置

文章来源: https://www.xuewangzhan.net/wpbbs/15737.html wordpress网站后台允许我们设置一些置顶文章&#xff0c;然后通过调用置顶文章的代码把它调用到自己的网站前台。 下面是最常用的wordpress调用置顶文章代码&#xff0c;适用于所有模板使用。 <?php $sticky g…

【联盛德W806上手笔记】六、7816/UART 控制器

目录7816/UART 控制器串口功能7816 接口功能下载口库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.cfifo.cfifo.hWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 7816/UART 控制器 设备端…

数据库去重查询问题详解

预算2014年院线预算 影城&#xff08;多选&#xff09;北京CBD影城 查询 科目蚌埠万达广场店北京CBD影城  营业收入11 票房收入11 卖品收入00 逾期收入00 广告收入00 映前广告00 LCD广告00 阵地收入00 IMAX广告收入00 其他广告收入00 其…

MySQL5.7更改用户名密码

ALTER USER test% IDENTIFIED BY 123456; https://www.cnblogs.com/paul8339/p/9054497.html 更改用户名密码&#xff0c;官方推荐使用alter ALTER USER test% IDENTIFIED BY 123456; 还有一种 update mysql.user set authentication_stringpassword("新密码") …

python 装饰器 三 (带有参数的装饰器)

#接受装饰器的参数def deco_arg(deco_arg):#接受函数 此列为func1def deco_func(*argv,**kwag):#接受函数的方法 此列为 a bdef _deco_func(*argv,**kwarg):print "before -------执行函数前"print "%s -------打印装饰器的参数"% deco_argret deco_f…

jQuery、jQury UI、jQuery Mobile----读书笔记

<!DOCTYPE html> <html> <head><meta charset"utf-8"> <meta name keywords content""> <meta name descriptioon content“jQuery、jQury UI、jQuery Mobile”> <title>jQuery、jQury UI、jQuery …

【联盛德W806上手笔记】七、I2C

目录WM_SDK_W806_v0.6.0的库函数函数参数宏应用示例初始化使用测试I2C 控制器功能概述主要特性功能描述传输速率选择中断及启动停止可控快速输出及检测信号寄存器描述寄存器列表时钟分频寄存器_1时钟分频寄存器_2控制寄存器数据寄存器收发控制寄存器TXR 读出寄存器CR 读出寄存器…

WordPress如何获取文章所属分类ID、名称或别名?

https://boke112.com/bkwd/4269.html 在 wordpress 主题制作过程中&#xff0c;我们可能会经常用到当前分类 ID&#xff0c;如&#xff1a;在文章页获取该文章分类下的相关文章&#xff0c;这时就可能用到当前分类 ID&#xff0c;即当前文章所在的分类 ID。那么&#xff0c;wor…

【联盛德W806上手笔记】八、SPI及其DMA

目录高速 SPI 设备控制器库函数函数参数宏应用示例初始化引脚复用中断相关使用注意事项DataAlignmentDirection测试main.cwm_hal_msp.cwm_it.c其他改动实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书…

安装配置 radicale

为什么80%的码农都做不了架构师&#xff1f;>>> 可以直接pip安装,也可以下载源码安装,如果要存储到sql里面,则需要下载源码包,用里面的schema.sql 建表 默认安装后没有相应的配置文件,源码包里面也包含了 logging 和config,放到/etc/radicale 下 安装没什么说的,下…

散分,并如何判断时间段上有重叠冲突。

比如某个会议室的预订信息表 roomBookInfo(id,title,beginTime,endTime), 现在有一个新的预订请求 bTime, eTIme 分别 代表 开始、结束时间。请检查下表中的记录&#xff0c;查看是否有时间上的冲突。create table roomBookInfo (id int auto_increment primary key, title var…

wordpress 根据文章ID获取分类ID和标签ID

//wordpress 根据文章ID获取分类ID $categoryget_the_category( $post_ID ); $catid$category[0]->term_id; //wordpress 根据文章ID获取标签ID $tagswp_get_post_tags( $post_ID ); $tagid$tags[0]->term_id; 查看完整内容&#xff1a;http://web.zhaicool.net/366…

实现复选框的单选效果

<!DOCTYPE><html><head><title>实现复选框的单选效果</title></head><body><form methodpost action""><input type"checkbox" name"aa" οnclick"bb(this)"><input type&q…

【联盛德W806上手笔记】九、DMA

目录DMA 控制器功能概述功能描述DMA 通道DMA 数据流DMA 循环模式DMA 传输模式DMA 外设选择DMA 链表模式DMA 中断中断请求库函数函数参数宏应用Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》 DMA 控制…

MySql创建一个存储过程

MySQL 存储过程是从 MySQL 5.0 新功能。存储过程的长处有一箩筐。只是最基本的还是运行效率和SQL 代码封装。特别是 SQL 代码封装功能&#xff0c;假设没有存储过程&#xff0c;在外部程序訪问数据库时&#xff08;比如 PHP&#xff09;&#xff0c;要组织非常多 SQL 语句。特别…

attr与prop的区别

我们在获取checked属性值的时候&#xff0c;如果被选中则值为"checked"没选中获取值就是undefined. &#xff08;引述他人&#xff09;因为在有些浏览器中比如说只要写disabled&#xff0c;checked就可以了&#xff0c;而有的要写成disabled "disabled"&a…

定制化WordPress后台的6个技巧

WordPress后台并非千篇一律&#xff0c;你可以通过一些代码定制化一个你喜欢的后台&#xff0c;本文所述代码都应写在主题的functions.PHP中。 移除后台某些菜单 如果你不想客户因为点了错误的菜单选项而删除付费主题&#xff0c;或者搞乱后台的设置&#xff0c;那么把你不希望…

SNF快速开发平台MVC-自由排序组件

1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理&#xff0c;如民族数据&#xff0c;在北方实施的时候汉族比较多&#xff0c;希望把汉族放在第一位。在蒙古实施项目时&#xff0c;蒙古族人最多把蒙古族放在第一选择位。 1.1. 效果展示 图 1.1 1.2. …