【联盛德W806上手笔记】五、TIM定时器
生活随笔
收集整理的這篇文章主要介紹了
【联盛德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); }實驗現象
總結
以上是生活随笔為你收集整理的【联盛德W806上手笔记】五、TIM定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 CloudFlare CDN 自定
- 下一篇: 如何登录新浪微博html5,新浪微博怎么