本文來源電子發燒友社區,作者:Michael, 帖子地址:https://bbs.elecfans.com/jishu_2287621_1_1.html
Air105 的timer
定時器
PWM
定時器相關代碼
以下代碼基于 air105_projecthttps://gitee.com/iosetting/air105_project的庫函數
定時器模塊結構
在Air105中, 全局只有一個定時器模塊, TIMM0
復制代碼
這個 TIMM0 的地址定義在 air105.h 中
復制代碼
地址 = 0x40000000UL + 0x10000 + 0x3000 = 0x4001 3000
范圍 [0x4001_3000, 0x4001_3FFF]
定時器初始化
定時器的初始化只需要兩個參數: TIMx, 周期(時鐘數), 為配合定時器使用, 還需要定義中斷
復制代碼
定時器中斷處理
Air105對應每個定時器, 各有一個中斷處理函數, 可以查看 startup.air105.s 中的中斷向量定義
復制代碼
對應 Timer0 的中斷處理, 寫在 air105_it.c. TIM_ClearITPendingBit 和 NVIC_ClearPendingIRQ 是必須調用的, 用于清除中斷
復制代碼
下面加入處理邏輯的例子, 每秒調用一次 timer_handler(), 注意不要在中斷處理中使用耗時的工作
復制代碼
定時器示例代碼
使用Timer0控制板載LED每隔一秒閃爍
https://gitee.com/iosetting/air105_project/tree/master/Demos/Timer/Timer_Blink
Air105 的 PWM
Air105 的8個獨立定時器均可編程產生PWM信號. 當用戶設定TimerNControlReg中PWM比特位為1后,定時器進入PWM工作模式. 此時 PWM 由 TimerNLoadCount2 和 TimerNLoadCount 寄存器分別控制高電平及低電平周期翻轉輸出.
頻率和占空比設置
高電平周期 = (TimerNLoadCount2 + 1) * PCLK_Period
低電平周期 = (TimerNLoadCount + 1) * PCLK_Period
PWM 相關代碼
PWM初始化也只需要三個參數 TIMx 和高低電平兩個周期, 兩者之和就是一個PWM周期
復制代碼
用Timer5初始化
復制代碼
將 PB5 功能復用為 PWM5
復制代碼
實時調節占空比, 后兩個參數代表PCLK時鐘周期個數
復制代碼
PWM示例代碼
使用PWM5(Timer5)控制LED產生呼吸燈效果
https://gitee.com/iosetting/air105_project/tree/master/Demos/PWM/PWM_FadeLED
示例接線:
根據開發板的BOMPCB查看https://wiki.luatos.com/_static/bom/Air105.html
Timer5對應的PWM5輸出, 對應開發板的SP2_MI, 開發板上的PWM5對應的是PC7, 要注意, 別接錯了.
運行示例, 將一個LED串接一個1-5K的電阻, 接在SP2_MI和GND之間, 就能看到呼吸燈的效果了。
Air105 的timer
定時器
- 1 個 Timer 單元,包含 8 個獨立定時器: Timer0,Timer1,Timer2,Timer3,Timer4,Timer5,Timer6,Time7
- 8 個定時器中斷源獨立,每個定時器單獨占 1 個中斷源
- 使用 PCLK 時鐘頻率作為定時器計時鐘源
- 定時器采用向下計數方式
PWM
- 每個 Timer 單元定時器都支持 PWM 模式
- PWM 模式最高頻率 PCLK/2
- PWM 單次觸發(one shot)功能
定時器相關代碼
以下代碼基于 air105_projecthttps://gitee.com/iosetting/air105_project的庫函數
定時器模塊結構
在Air105中, 全局只有一個定時器模塊, TIMM0
- typedef struct
- {
- TIM_TypeDef TIM[TIM_NUM];
- __Iuint32_t TIM_IntStatus;
- __Iuint32_t TIM_EOI;
- __Iuint32_t TIM_RawIntStatus;
- __Iuint32_t TIM_Comp;
- __IO uint32_t TIM_ReloadCount[TIM_NUM];
- } TIM_Module_TypeDef;
這個 TIMM0 的地址定義在 air105.h 中
- #define TIMM0 ((TIM_Module_TypeDef *)TIMM0_BASE)
- #define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */
- #define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000)
- #define TIMM0_BASE (AIR105_APB0_BASE + 0x3000)
地址 = 0x40000000UL + 0x10000 + 0x3000 = 0x4001 3000
范圍 [0x4001_3000, 0x4001_3FFF]
定時器初始化
定時器的初始化只需要兩個參數: TIMx, 周期(時鐘數), 為配合定時器使用, 還需要定義中斷
- void Timer_Init(void)
- {
- TIM_InitTypeDef TIM_InitStruct;
- NVIC_InitTypeDef NVIC_InitStructure;
- // 開啟定時器的外設時鐘
- SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
- SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
- // 定時器的時鐘是 PCLK, 計數間隔為 1ms 對應的時鐘數
- TIM_InitStruct.TIM_Period = SYSCTRL->PCLK_1MS_VAL;
- // 使用 定時器0
- TIM_InitStruct.TIMx = TIM_0;
- // 初始化
- TIM_Init(TIMM0, &TIM_InitStruct);
- // 開啟定時器0的中斷
- TIM_ITConfig(TIMM0, TIM_InitStruct.TIMx, ENABLE);
- //NVIC
- NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStructure.NVIC_IRQChannel = TIM0_0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_Init(&NVIC_InitStructure);
- // 啟動定時器0
- TIM_Cmd(TIMM0, (TIM_NumTypeDef)TIM_0, ENABLE);
- }
定時器中斷處理
Air105對應每個定時器, 各有一個中斷處理函數, 可以查看 startup.air105.s 中的中斷向量定義
- TIM0_0_IRQHandler
- TIM0_1_IRQHandler
- TIM0_2_IRQHandler
- TIM0_3_IRQHandler
- TIM0_4_IRQHandler
- TIM0_5_IRQHandler
- TIM0_6_IRQHandler
- TIM0_7_IRQHandler
對應 Timer0 的中斷處理, 寫在 air105_it.c. TIM_ClearITPendingBit 和 NVIC_ClearPendingIRQ 是必須調用的, 用于清除中斷
- void TIM0_0_IRQHandler(void)
- {
- TIM_ClearITPendingBit(TIMM0, TIM_0);
- NVIC_ClearPendingIRQ(TIM0_0_IRQn);
- }
下面加入處理邏輯的例子, 每秒調用一次 timer_handler(), 注意不要在中斷處理中使用耗時的工作
- extern uint32_t timer_count;
- extern void timer_handler(void);
- void TIM0_0_IRQHandler(void)
- {
- timer_count++;
- if (timer_count >= 1000)
- {
- timer_count = 0;
- timer_handler();
- }
- TIM_ClearITPendingBit(TIMM0, TIM_0);
- NVIC_ClearPendingIRQ(TIM0_0_IRQn);
- }
定時器示例代碼
使用Timer0控制板載LED每隔一秒閃爍
https://gitee.com/iosetting/air105_project/tree/master/Demos/Timer/Timer_Blink
Air105 的 PWM
Air105 的8個獨立定時器均可編程產生PWM信號. 當用戶設定TimerNControlReg中PWM比特位為1后,定時器進入PWM工作模式. 此時 PWM 由 TimerNLoadCount2 和 TimerNLoadCount 寄存器分別控制高電平及低電平周期翻轉輸出.
頻率和占空比設置
高電平周期 = (TimerNLoadCount2 + 1) * PCLK_Period
低電平周期 = (TimerNLoadCount + 1) * PCLK_Period
PWM 相關代碼
PWM初始化也只需要三個參數 TIMx 和高低電平兩個周期, 兩者之和就是一個PWM周期
- typedef struct
- {
- TIM_NumTypeDef TIMx;
- uint32_t TIM_LowLevelPeriod;
- uint32_t TIM_HighLevelPeriod;
- }TIM_PWMInitTypeDef;
用Timer5初始化
- void TimerPWM_Init(void)
- {
- TIM_PWMInitTypeDef TIM_PWMInitStruct;
- SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
- SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
- //Timer5 -> PWM5
- TIM_PWMInitStruct.TIM_HighLevelPeriod = SYSCTRL->PCLK_1MS_VAL;
- TIM_PWMInitStruct.TIM_HighLevelPeriod = 0;
- TIM_PWMInitStruct.TIMx = TIM_5;
- TIM_PWMInit(TIMM0, &TIM_PWMInitStruct);
- TIM_Cmd(TIMM0, TIM_5, ENABLE);
- }
將 PB5 功能復用為 PWM5
- GPIO_InitTypeDef gpio;
- gpio.GPIO_Pin = GPIO_Pin_5;
- gpio.GPIO_Mode = GPIO_Mode_Out_PP;
- gpio.GPIO_Remap = GPIO_Remap_2;
- GPIO_Init(GPIOB, &gpio);
實時調節占空比, 后兩個參數代表PCLK時鐘周期個數
- TIM_SetPWMPeriod(TIMM0, TIM_5, period - high_period, high_period);
PWM示例代碼
使用PWM5(Timer5)控制LED產生呼吸燈效果
https://gitee.com/iosetting/air105_project/tree/master/Demos/PWM/PWM_FadeLED
示例接線:
根據開發板的BOMPCB查看https://wiki.luatos.com/_static/bom/Air105.html
Timer5對應的PWM5輸出, 對應開發板的SP2_MI, 開發板上的PWM5對應的是PC7, 要注意, 別接錯了.
運行示例, 將一個LED串接一個1-5K的電阻, 接在SP2_MI和GND之間, 就能看到呼吸燈的效果了。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
合宙通信
+關注
關注
0文章
160瀏覽量
2471 -
Air105
+關注
關注
0文章
48瀏覽量
441
發布評論請先 登錄
相關推薦
熱點推薦
LAT1173高精度定時器的同步功能應用筆記
STM32G474 所含的高精度定時器(HRTIMER)其實包含了多個定時器,多個定時器之間可以單獨工作,也可以進行同步,且高精度定時器還能與片上的其他
發表于 01-11 17:32
?0次下載
【乾芯QXS320F開發板試用】定時器中斷
CPUTimer_enableInterrupt(CPUTIMER0_BASE);// 設置定時器的中斷
CPUTimer_startTimer(CPUTIMER0_BASE); // 開啟定時器
發表于 12-09 16:56
CW32L010+定時器介紹
:一組,專為低功耗應用而設計,能夠在保持低功耗的同時實現定時功能。
高級控制PWM定時器:一組,支持PWM輸出和高級控制功能,適用于需要精確
發表于 12-01 07:53
CW32L0開發板學習記錄四,高級定時器ATIM學習
通道,可以測量輸入信號的脈沖寬度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)。
低功耗定時器(LPTIM):
內部集成1個 16 位低功耗定時
發表于 12-01 07:35
SysTick系統滴答定時器簡介
SysTick—系統定時器是屬于CM33內核中的一個外設,內嵌在NVIC中。系統定時器是一個24bit的向下遞減的計數器,計數器每計數一次的時間為 1/SYSCLK,一般我們設置系統時
【沁恒CH585開發板免費試用體驗】定時器操作
與GPIO有掛鉤使得它可以發揮強大的作用,比如可以輸出不同頻率、不同占空比的方波信號、PWM信號,同時做為輸入捕獲功能時,可以測量脈沖寬度、實現電容按鍵檢測等等。
CH585有4 個 26 位定時器
發表于 07-05 23:06
揭秘Air780EPM開發陷阱:20個避坑指南與最佳解決方案
:www.air780epm.cn 問題01: Air780EPM在PSM+模式下,dtimer定時器可以開幾個? ? 答案: 同一時間只能有64個定時器的任務;如果要支持超過64個
MCU定時器/計數器
架構與功能特性? 定時器類型與配置? 高級控制定時器?:支持互補PWM輸出與剎車功能,適用于電機驅動等高精度控制場景。通用定時器?:集成輸入
【合宙Air105開發板試用體驗】Air105的定時器, 定時器中斷和PWM輸出
評論