0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【合宙Air105開(kāi)發(fā)板試用體驗(yàn)】Air105的定時(shí)器, 定時(shí)器中斷和PWM輸出

開(kāi)發(fā)板試用精選 ? 來(lái)源:開(kāi)發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-12-02 11:23 ? 次閱讀
本文來(lái)源電子發(fā)燒友社區(qū),作者:Michael, 帖子地址:https://bbs.elecfans.com/jishu_2287621_1_1.html

Air105 的timer


定時(shí)器

  • 1 個(gè) Timer 單元,包含 8 個(gè)獨(dú)立定時(shí)器: Timer0,Timer1,Timer2,Timer3,Timer4,Timer5,Timer6,Time7
  • 8 個(gè)定時(shí)器中斷源獨(dú)立,每個(gè)定時(shí)器單獨(dú)占 1 個(gè)中斷源
  • 使用 PCLK 時(shí)鐘頻率作為定時(shí)器計(jì)時(shí)鐘源
  • 定時(shí)器采用向下計(jì)數(shù)方式


PWM

  • 每個(gè) Timer 單元定時(shí)器都支持 PWM 模式
  • PWM 模式最高頻率 PCLK/2
  • PWM 單次觸發(fā)(one shot)功能


定時(shí)器相關(guān)代碼

以下代碼基于 air105_projecthttps://gitee.com/iosetting/air105_project的庫(kù)函數(shù)

定時(shí)器模塊結(jié)構(gòu)

在Air105中, 全局只有一個(gè)定時(shí)器模塊, TIMM0


  1. typedef struct
  2. {
  3. TIM_TypeDef TIM[TIM_NUM];
  4. __Iuint32_t TIM_IntStatus;
  5. __Iuint32_t TIM_EOI;
  6. __Iuint32_t TIM_RawIntStatus;
  7. __Iuint32_t TIM_Comp;
  8. __IO uint32_t TIM_ReloadCount[TIM_NUM];
  9. } TIM_Module_TypeDef;
復(fù)制代碼


這個(gè) TIMM0 的地址定義在 air105.h 中


  1. #define TIMM0 ((TIM_Module_TypeDef *)TIMM0_BASE)
  2. #define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */
  3. #define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000)
  4. #define TIMM0_BASE (AIR105_APB0_BASE + 0x3000)
復(fù)制代碼

地址 = 0x40000000UL + 0x10000 + 0x3000 = 0x4001 3000
范圍 [0x4001_3000, 0x4001_3FFF]

定時(shí)器初始化

定時(shí)器的初始化只需要兩個(gè)參數(shù): TIMx, 周期(時(shí)鐘數(shù)), 為配合定時(shí)器使用, 還需要定義中斷


  1. void Timer_Init(void)
  2. {
  3. TIM_InitTypeDef TIM_InitStruct;
  4. NVIC_InitTypeDef NVIC_InitStructure;
  5. // 開(kāi)啟定時(shí)器的外設(shè)時(shí)鐘
  6. SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  7. SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  8. // 定時(shí)器的時(shí)鐘是 PCLK, 計(jì)數(shù)間隔為 1ms 對(duì)應(yīng)的時(shí)鐘數(shù)
  9. TIM_InitStruct.TIM_Period = SYSCTRL->PCLK_1MS_VAL;
  10. // 使用 定時(shí)器0
  11. TIM_InitStruct.TIMx = TIM_0;
  12. // 初始化
  13. TIM_Init(TIMM0, &TIM_InitStruct);
  14. // 開(kāi)啟定時(shí)器0的中斷
  15. TIM_ITConfig(TIMM0, TIM_InitStruct.TIMx, ENABLE);
  16. //NVIC
  17. NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19. NVIC_InitStructure.NVIC_IRQChannel = TIM0_0_IRQn;
  20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  22. NVIC_Init(&NVIC_InitStructure);
  23. // 啟動(dòng)定時(shí)器0
  24. TIM_Cmd(TIMM0, (TIM_NumTypeDef)TIM_0, ENABLE);
  25. }
復(fù)制代碼



定時(shí)器中斷處理

Air105對(duì)應(yīng)每個(gè)定時(shí)器, 各有一個(gè)中斷處理函數(shù), 可以查看 startup.air105.s 中的中斷向量定義


  1. TIM0_0_IRQHandler
  2. TIM0_1_IRQHandler
  3. TIM0_2_IRQHandler
  4. TIM0_3_IRQHandler
  5. TIM0_4_IRQHandler
  6. TIM0_5_IRQHandler
  7. TIM0_6_IRQHandler
  8. TIM0_7_IRQHandler
復(fù)制代碼


對(duì)應(yīng) Timer0 的中斷處理, 寫在 air105_it.c. TIM_ClearITPendingBit 和 NVIC_ClearPendingIRQ 是必須調(diào)用的, 用于清除中斷


  1. void TIM0_0_IRQHandler(void)
  2. {
  3. TIM_ClearITPendingBit(TIMM0, TIM_0);
  4. NVIC_ClearPendingIRQ(TIM0_0_IRQn);
  5. }
復(fù)制代碼


下面加入處理邏輯的例子, 每秒調(diào)用一次 timer_handler(), 注意不要在中斷處理中使用耗時(shí)的工作


  1. extern uint32_t timer_count;
  2. extern void timer_handler(void);
  3. void TIM0_0_IRQHandler(void)
  4. {
  5. timer_count++;
  6. if (timer_count >= 1000)
  7. {
  8. timer_count = 0;
  9. timer_handler();
  10. }
  11. TIM_ClearITPendingBit(TIMM0, TIM_0);
  12. NVIC_ClearPendingIRQ(TIM0_0_IRQn);
  13. }
復(fù)制代碼


定時(shí)器示例代碼

使用Timer0控制板載LED每隔一秒閃爍
https://gitee.com/iosetting/air105_project/tree/master/Demos/Timer/Timer_Blink

Air105 的 PWM

Air105 的8個(gè)獨(dú)立定時(shí)器均可編程產(chǎn)生PWM信號(hào). 當(dāng)用戶設(shè)定TimerNControlReg中PWM比特位為1后,定時(shí)器進(jìn)入PWM工作模式. 此時(shí) PWM 由 TimerNLoadCount2 和 TimerNLoadCount 寄存器分別控制高電平及低電平周期翻轉(zhuǎn)輸出.

頻率和占空比設(shè)置

高電平周期 = (TimerNLoadCount2 + 1) * PCLK_Period
低電平周期 = (TimerNLoadCount + 1) * PCLK_Period

PWM 相關(guān)代碼

PWM初始化也只需要三個(gè)參數(shù) TIMx 和高低電平兩個(gè)周期, 兩者之和就是一個(gè)PWM周期


  1. typedef struct
  2. {
  3. TIM_NumTypeDef TIMx;
  4. uint32_t TIM_LowLevelPeriod;
  5. uint32_t TIM_HighLevelPeriod;
  6. }TIM_PWMInitTypeDef;
復(fù)制代碼


用Timer5初始化


  1. void TimerPWM_Init(void)
  2. {
  3. TIM_PWMInitTypeDef TIM_PWMInitStruct;
  4. SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  5. SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  6. //Timer5 -> PWM5
  7. TIM_PWMInitStruct.TIM_HighLevelPeriod = SYSCTRL->PCLK_1MS_VAL;
  8. TIM_PWMInitStruct.TIM_HighLevelPeriod = 0;
  9. TIM_PWMInitStruct.TIMx = TIM_5;
  10. TIM_PWMInit(TIMM0, &TIM_PWMInitStruct);
  11. TIM_Cmd(TIMM0, TIM_5, ENABLE);
  12. }
復(fù)制代碼


將 PB5 功能復(fù)用為 PWM5


  1. GPIO_InitTypeDef gpio;
  2. gpio.GPIO_Pin = GPIO_Pin_5;
  3. gpio.GPIO_Mode = GPIO_Mode_Out_PP;
  4. gpio.GPIO_Remap = GPIO_Remap_2;
  5. GPIO_Init(GPIOB, &gpio);
復(fù)制代碼


實(shí)時(shí)調(diào)節(jié)占空比, 后兩個(gè)參數(shù)代表PCLK時(shí)鐘周期個(gè)數(shù)


  1. TIM_SetPWMPeriod(TIMM0, TIM_5, period - high_period, high_period);
復(fù)制代碼


PWM示例代碼

使用PWM5(Timer5)控制LED產(chǎn)生呼吸燈效果
https://gitee.com/iosetting/air105_project/tree/master/Demos/PWM/PWM_FadeLED

示例接線:

根據(jù)開(kāi)發(fā)板的BOMPCB查看https://wiki.luatos.com/_static/bom/Air105.html
Timer5對(duì)應(yīng)的PWM5輸出, 對(duì)應(yīng)開(kāi)發(fā)板的SP2_MI, 開(kāi)發(fā)板上的PWM5對(duì)應(yīng)的是PC7, 要注意, 別接錯(cuò)了.
運(yùn)行示例, 將一個(gè)LED串接一個(gè)1-5K的電阻, 接在SP2_MI和GND之間, 就能看到呼吸燈的效果了。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 合宙通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    1658
  • Air105
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    284
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    低功耗4G模組AIR780EX ——開(kāi)發(fā)板使用說(shuō)明

    EVB-AIR780EX 開(kāi)發(fā)板通信推出的基于 Air780EX 模組所開(kāi)發(fā)的,包含電源,
    的頭像 發(fā)表于 09-11 11:55 ?232次閱讀
    <b class='flag-5'>合</b><b class='flag-5'>宙</b>低功耗4G模組<b class='flag-5'>AIR</b>780EX ——<b class='flag-5'>開(kāi)發(fā)板</b>使用說(shuō)明

    4G模組Air780E開(kāi)發(fā)板使用手冊(cè)

    開(kāi)發(fā)板Air780E使用說(shuō)明
    的頭像 發(fā)表于 09-09 18:22 ?226次閱讀
    <b class='flag-5'>合</b><b class='flag-5'>宙</b>4G模組<b class='flag-5'>Air</b>780E<b class='flag-5'>開(kāi)發(fā)板</b>使用手冊(cè)

    LuatOS開(kāi)發(fā)板Core_Air780EP使用說(shuō)明

    Core-Air780EP 開(kāi)發(fā)板通信推出的基于 Air780EP 模組所開(kāi)發(fā)的,包含電源
    的頭像 發(fā)表于 09-03 17:38 ?303次閱讀
    <b class='flag-5'>合</b><b class='flag-5'>宙</b>LuatOS<b class='flag-5'>開(kāi)發(fā)板</b>Core_<b class='flag-5'>Air</b>780EP使用說(shuō)明

    低功耗4G模組Air700EAQ——開(kāi)發(fā)板使用說(shuō)明

    低功耗4G模組Air700EAQ——開(kāi)發(fā)板使用說(shuō)明
    的頭像 發(fā)表于 08-30 17:14 ?807次閱讀
    <b class='flag-5'>合</b><b class='flag-5'>宙</b>低功耗4G模組<b class='flag-5'>Air</b>700EAQ——<b class='flag-5'>開(kāi)發(fā)板</b>使用說(shuō)明

    LuatOS開(kāi)發(fā)板使用手冊(cè)——Air700ECQ

    LuatOS開(kāi)發(fā)板使用說(shuō)明——Air700ECQ
    的頭像 發(fā)表于 08-23 16:28 ?401次閱讀
    <b class='flag-5'>合</b><b class='flag-5'>宙</b>LuatOS<b class='flag-5'>開(kāi)發(fā)板</b>使用手冊(cè)——<b class='flag-5'>Air</b>700ECQ

    定時(shí)器的工作方式介紹

    或?qū)崿F(xiàn)周期性事件的硬件模塊。它可以用于實(shí)現(xiàn)各種定時(shí)任務(wù),如定時(shí)中斷、PWM(脈沖寬度調(diào)制)輸出、頻率測(cè)量等。定時(shí)器通常由一個(gè)計(jì)數(shù)
    的頭像 發(fā)表于 07-12 10:29 ?452次閱讀

    如何實(shí)現(xiàn)一個(gè)軟件定時(shí)器

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時(shí)器,原理大同小異。典型的實(shí)現(xiàn)方法是:通過(guò)一個(gè)硬件定時(shí)器產(chǎn)生固定的時(shí)鐘節(jié)拍,每次硬件定時(shí)器中斷到,就對(duì)一個(gè)全局的時(shí)間
    的頭像 發(fā)表于 04-29 11:00 ?474次閱讀

    STM32同一定時(shí)器PWM輸出定時(shí),會(huì)影響我的PWM輸出嗎?

    求助各位大佬 ,我用定時(shí)器2通道1輸出PWM 定時(shí)器設(shè)置為TIM2_PERIODE (1000-1) TIM2_PRESCALER 36,現(xiàn)在還想開(kāi)啟2的
    發(fā)表于 03-26 07:23

    使用555定時(shí)器的可調(diào)雙定時(shí)器電路

    定時(shí)器 IC 555 是最通用和最常用的 IC 之一,因?yàn)樗膽?yīng)用范圍更廣,如 PWM放大器、延遲定時(shí)器、開(kāi)關(guān)電路、占空比選擇、時(shí)鐘脈沖發(fā)生
    的頭像 發(fā)表于 02-25 15:16 ?1628次閱讀
    使用555<b class='flag-5'>定時(shí)器</b>的可調(diào)雙<b class='flag-5'>定時(shí)器</b>電路

    定時(shí)器會(huì)阻塞線程嗎 定時(shí)器指令有哪幾種

    定時(shí)器會(huì)阻塞線程嗎 定時(shí)器指令有哪幾種? 定時(shí)器一般不會(huì)阻塞線程,但具體是否會(huì)阻塞取決于所使用的定時(shí)器實(shí)現(xiàn)方式和使用方式。 定時(shí)器指令可以分
    的頭像 發(fā)表于 12-19 14:03 ?800次閱讀

    定時(shí)器設(shè)計(jì)實(shí)現(xiàn)

    由于目前C++標(biāo)準(zhǔn)中沒(méi)有現(xiàn)成的定時(shí)器,本設(shè)計(jì)使用C++11相關(guān)語(yǔ)法并進(jìn)行封裝。 本定時(shí)器包含一個(gè)TimerManager類用于創(chuàng)建定時(shí)器和進(jìn)行定時(shí)任務(wù)管理,TimerManager會(huì)創(chuàng)
    的頭像 發(fā)表于 11-08 16:50 ?505次閱讀

    單片機(jī)定時(shí)器中斷應(yīng)用案例

    定時(shí)器中斷,顧名思義就是在規(guī)定的時(shí)間內(nèi)發(fā)送中斷請(qǐng)求,要實(shí)現(xiàn)定時(shí)器中斷,單片機(jī)需要能夠正確地計(jì)算時(shí)間,單片機(jī)是如何進(jìn)行計(jì)時(shí)的呢?
    發(fā)表于 10-31 14:49 ?1307次閱讀
    單片機(jī)<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>應(yīng)用案例

    RA2E1定時(shí)器帶死區(qū)互補(bǔ)PWM中斷延時(shí)問(wèn)題分析

    RA2E1定時(shí)器帶死區(qū)互補(bǔ)PWM中斷延時(shí)問(wèn)題分析
    的頭像 發(fā)表于 10-27 10:56 ?644次閱讀
    RA2E1<b class='flag-5'>定時(shí)器</b>帶死區(qū)互補(bǔ)<b class='flag-5'>PWM</b><b class='flag-5'>中斷</b>延時(shí)問(wèn)題分析

    高精度定時(shí)器與高級(jí)控制定時(shí)器 PWM 封波后再恢復(fù)的區(qū)別

    高精度定時(shí)器與高級(jí)控制定時(shí)器 PWM 封波后再恢復(fù)的區(qū)別
    的頭像 發(fā)表于 10-17 16:52 ?597次閱讀
    高精度<b class='flag-5'>定時(shí)器</b>與高級(jí)控制<b class='flag-5'>定時(shí)器</b> <b class='flag-5'>PWM</b> 封波后再恢復(fù)的區(qū)別

    使用MM32F0270 定時(shí)器DMA方式輸出PWM

    使用MM32F0270 定時(shí)器DMA方式輸出PWM
    的頭像 發(fā)表于 10-17 14:47 ?730次閱讀
    使用MM32F0270 <b class='flag-5'>定時(shí)器</b>DMA方式<b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>