一、STM32的通用定時器介紹
STM32F103ZE 擁有 TIM2、TIM3、TIM4 和 TIM5 共 4 個通用定時器。
STM32F103C8擁有TIM2/TIM3/TIM4這三個通用定時器
通用定時器除了具備基本定時器的向上計數器功能外,還可以向下、向上/向下計數。
此外還具備獨立通道,能夠實現輸入捕獲、輸出比較、PWM 輸出、單脈沖輸出的功能。
二、輸出比較產生PWM
1、產生PWM的幾種方式
①、硬件實現。比如STM32 自帶的 PWM 輸出功能。
注意了,硬件實現的時候,外部接線需要接到通用定時器的外部通道上!
②、通用定時器的輸出比較實現軟件的PWM,這個軟件產生的PWM要比定時器模擬產生的PWM精確許多。
③、單純的定時器計數實現PWM。
2、STM32的輸出比較相關介紹
每個通用定時器擁有4路捕獲/比較通道。
每路通道都有一個捕獲/比較寄存器(TIMx_CCRx)用于裝載初值。
同時該寄存器包含兩個寄存器,一個是供用戶寫入比較值的,另一個是和計數器比較的當前捕獲/比較寄存器。
捕獲/比較模式寄存器 x(TIMx_CCMRx)中有輸出比較預裝載使能位(OCxPE ),開啟后只有當更新時間到來時, TIMx_CCRx寄存器的比較值,才會傳入到當前捕獲/比較寄存器。否則寫入的比較值將立即生效。
當計數器和捕獲/比較模式寄存器 x(TIMx_CCMRx)一樣時,會發(fā)生什么呢?
①、假如此時設置了事件產生寄存器(TIMx_EGR)中的 CCxG 位,會產生一個捕獲/比較事件。
②、設置了相應的中斷使能位TIMx_DIER 寄存器中的 CCxIE 位,則會產生一個捕獲/比較中斷。
3、輸出比較產生PWM代碼實現
timer.c
#include "timer.h"
/* TIM4中斷優(yōu)先級配置函數 */
void NVIC_TIM4Enable(void)
{
NVIC_InitTypeDef NVIC_initstructure;
NVIC_initstructure.NVIC_IRQChannel = TIM4_IRQn; //選擇TIM4中斷通道
NVIC_initstructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷通道
NVIC_initstructure.NVIC_IRQChannelPreemptionPriority = 0; //設定搶占優(yōu)先級為0
NVIC_initstructure.NVIC_IRQChannelSubPriority = 0; //設定響應優(yōu)先級為0
NVIC_Init(&NVIC_initstructure);
}
/* TIM4初始化函數*/
void TIM4Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能TIM4時鐘
TIM_TimeBaseStructure.TIM_Period = 255; //自動重裝載值設為255,方便產生0-255級RGB顏色等級
TIM_TimeBaseStructure.TIM_Prescaler = 72*39-1; //計數周期設為39us,以使RGB刷新達到100Hz無閃爍效果
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //基本定時器沒有時鐘分頻功能,此項會被忽略
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //設置向上計數模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化TIM4
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4 CCR1的預裝載寄存器
TIM_SetCompare1(TIM4, 0); //設定TIM4捕獲比較1寄存器值為0
NVIC_TIM4Enable(); //初始化TIM4中斷優(yōu)先級
TIM_ClearITPendingBit(TIM4, TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3); //清除中斷標志位,否則啟動中斷會先進中斷服務函數
TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3, ENABLE); //使能TIM4更新中斷和捕獲/比較1、2、3的中斷源
TIM_Cmd(TIM4, ENABLE); //使能TIM4定時器
}
stm32f10x_it.c
...
/* TIM4中斷 */
void TIM4_IRQHandler (void)
{
/* 采用直接寄存器操作,可以獲得比庫函數更高的執(zhí)行效率,節(jié)省中斷函數執(zhí)行時間 */
if ((TIM4->SR & TIM_FLAG_Update) != 0) //檢測是否為定時器溢出中斷
{
TIM4->SR = ~TIM_FLAG_Update; //清除更新中斷標志位
if (TIM4->CCR1 != 0) //比較值(即占空比)不為0時,點亮小燈,下同
{
LED = 1;
}
}
else if ((TIM4->SR & TIM_IT_CC1) != 0) //檢測比較中斷產生時熄滅小燈,下同
{
TIM4->SR = ~TIM_IT_CC1; //清除捕獲/比較通道1中斷標志位
LED = 0;
}
}
此處只是簡單的驗證,所以在主函數通過設定比較值來改變占空比。
TIM_SetCompare1(TIM4, 5); //這里的設置的范圍是0~255(定時器設置的時候分了256級!)
//當然也可以直接采用寄存器的方式 TIM4->CCR1 = 5;
還需要注意的是通用定時器的分頻值,預計裝載值。具體解釋可以看<這里>。
三、硬件PWM
硬件實現的時候,外部接線需要接到通用定時器的外部通道上!當然也不可以,不在對應的外部通道上!(前提得能重映射!)
基本定時器不能輸出PWM,通用和高級定時器才可以。
而通用和高級的配置又有所不同,一個一個來看…
1、高級定時器的硬件PWM輸出
對應TIM1_CH1 - PA8 ; TIM_CH4 - PA11
void TIM1Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外設時鐘使能
//設置該引腳為復用輸出功能,輸出TIM1 CH1 CH4的PWM脈沖波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 //TIM_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 255; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 72*39-1; //設置用來作為TIMx時鐘頻率除數的預分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
//TIM_OCMode;TIM_OCPolarity-對應輸出的占空比CCR。 TIM_OCMode=1;TIM_OCPolarity=High或者TIM_OCMode=2;TIM_OCPolarity=Low為正常
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = 1; //設置待裝入捕獲比較寄存器的脈沖值;也就是剛上電的占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據TIM_OCInitStruct中指定的參數初始化外設TIMx
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根據TIM_OCInitStruct中指定的參數初始化外設TIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主輸出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1預裝載使能
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH4預裝載使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的預裝載寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
2、通用定時器的硬件PWM輸出
對應TIM3_CH2 - PA7
void TIM3Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器 3 時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA時鐘
//設置該引腳為復用輸出功能,輸出 TIM3 CH2 的 PWM 脈沖波形 GPIOA.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIO
//初始化 TIM3
TIM_TimeBaseStructure.TIM_Period = 255; //設置在自動重裝載周期值
TIM_TimeBaseStructure.TIM_Prescaler = 72*39-1; //設置預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化 TIMx
//初始化 TIM3 Channel2 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇 PWM 模式 1
TIM_OCInitStructure.TIM_Pulse = 255;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化外設 TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能預裝載寄存器
TIM_Cmd(TIM3, ENABLE); //使能 TIM3
}
上一篇:KST-STM32學習之項目實戰(zhàn)RGB舞臺燈光
下一篇:KST-STM32學習之位帶操作
推薦閱讀
史海拾趣
面對數字化浪潮的沖擊,ECLIPTEK公司積極擁抱數字化轉型和智能制造。公司引入大數據、云計算和人工智能等先進技術,推動生產過程的智能化和自動化。通過數字化轉型和智能制造,ECLIPTEK不僅提高了生產效率和質量,還降低了生產成本和能源消耗。這一轉型為公司未來的發(fā)展奠定了堅實的基礎。
隨著科技的不斷發(fā)展,Apacer宇瞻科技緊跟時代步伐,不斷創(chuàng)新產品。2006年,公司推出了存儲容量高達2GB的microSD卡,這款數碼卡體積僅為普通SD卡的四分之一,但存儲容量卻與之不相上下。這一創(chuàng)新產品不僅滿足了市場對高容量、小型化存儲設備的需求,也進一步鞏固了宇瞻科技在市場上的地位。
隨著全球化進程的加速,富致科技也積極實施國際化戰(zhàn)略。公司不僅在歐洲、北美等地設立了銷售和服務網絡,還通過參加國際展會、建立海外研發(fā)中心等方式,不斷提升品牌影響力和市場競爭力。同時,富致科技還注重與全球頂尖企業(yè)和研究機構的合作,共同推動PPTC技術的創(chuàng)新與發(fā)展。
隨著公司業(yè)務的不斷發(fā)展,Allied公司開始積極拓展產品線,逐漸涵蓋了多種類型的電線電纜產品,滿足了不同客戶的需求。同時,公司還積極開拓新的市場領域,將產品推廣至全國范圍,并逐漸拓展至國際市場。通過不斷的產品創(chuàng)新和市場拓展,Allied公司的業(yè)務規(guī)模逐漸擴大,市場份額也穩(wěn)步提升。
在市場競爭日益激烈的情況下,Chiefdom Electronic Co Ltd注重創(chuàng)新營銷策略,以吸引更多消費者的關注。公司推出了一系列具有針對性的廣告宣傳活動,利用社交媒體、網絡直播等新媒體渠道進行廣泛傳播。同時,公司還積極參與各類電子展會和論壇,展示其最新技術和產品,與潛在客戶建立聯系。這些創(chuàng)新營銷策略使得公司的品牌知名度和美譽度不斷提升,進而帶動了銷售業(yè)績的穩(wěn)步增長。
隨著全球化的深入發(fā)展,Chiefdom Electronic Co Ltd意識到國際化布局對于提升競爭力的重要性。公司開始積極拓展海外市場,設立海外研發(fā)中心和銷售網絡,以便更好地了解當地市場需求和文化特點。通過本地化運營和定制化服務,公司成功打入多個國際市場,并獲得了良好的業(yè)績回報。這些國際化布局不僅提升了公司的整體競爭力,還為其在全球電子行業(yè)中占據了更加重要的地位。
模糊控制在基于CAN總線的數據采集與控制系統(tǒng)中的應用 介紹了如何的把把模糊算法與CAN部線結合起來應用于控制系統(tǒng);并設計了一種智能型模糊控制算法,給出了系統(tǒng)的整體結構和現場模糊控制單元的硬件實現電路及其軟件設計思路。系統(tǒng)的仿真結果表明,該系統(tǒng)實時性好、控制精度較高。… 查看全部問答∨ |
我本科畢業(yè)設計做的開關電源 感覺很喜歡這個東西 讀研究生一直不知道自己應該選哪個方向 快研二了,導師替我選了題目 開學要去清華做課題 出乎我的意外,居然是做脈沖電源 呵呵,很開心 但是依然很擔心自己的動手能力 導師說可能要自 ...… 查看全部問答∨ |
三星提供的DNW太不穩(wěn)定了,能不能自己寫一個下載工具,那里有完整的DNW源碼?我看下載要用USB PORT/UBOOT功能,請問這一項用的USB協(xié)議是 三星提供的DNW太不穩(wěn)定了,能不能自己寫一個下載工具,那里有完整的DNW源碼?《通過網絡下到的都不是很全,都沒有UBOOT選項功能的實現》我看下載要用USB PORT/UBOOT功能,請問這一項用的USB協(xié)議是?如果不按這個UBOOT的USB協(xié)議來發(fā)送NK,那EBOOT里 ...… 查看全部問答∨ |
|
wince可以做屏保嗎? 如何實現呢?需要怎么樣的配置? 電腦里面的屏保程序可以運行在wince下面嗎?還是要單獨開發(fā)? 希望有經驗的同志們多多支招啊 發(fā)現wince還是很好玩的 每天問個問題,每天散點分,馬上要過年了,希望大家在新的一年里面快 ...… 查看全部問答∨ |
最近改Nand driver,從SLC改為支持MLC。 但改完了發(fā)現一個問題: 1、全部先擦一遍 2、連續(xù)寫20個Page,每一個Page都是2K內容 + 64Byte的OOB (此時若將這20個Page讀出來,發(fā)現全部都是正確的) 3、將前8個Page的OOB部分寫入一些信息 (此時是 ...… 查看全部問答∨ |
我暈。。這是寫第二次了,不明白今天是怎么回事了???、 哎,不管了,再寫一次了。 這個版塊冷得很了,我一個人可弄不起來。。國產的這塊其實非常不錯,我覺得學著用簡單實用。 大家出來耍耍吧。下面是我根據4.0版的 ...… 查看全部問答∨ |
我的家太小了,放不下了,孩子的書越來越多,只能騰騰地方,多放些孩子的書吧~這些書都是正版的,絕大部分是全新的,保存完好。低至3~5折,有需要的朋友來選購。郵費問題大家還是一人一半吧! 支付寶交易!我的QQ:1819815928部分清單:序號 ...… 查看全部問答∨ |
我下了MDK5.0,也知道跟以往不同的是多了個安裝包,問題隨之而來,我裝了STM32F0的包后,我新建工程就有STM32F0的芯片,但我要開發(fā)TI的芯片怎么辦呢,根本就沒有TI的包啊 再有開發(fā)STM32F1我以前的MDK4.幾,都是芯片容量可選,但在5.0卻不可選,只 ...… 查看全部問答∨ |
各位,我用launchpad調諾基亞5110屏的程序,程序中只要有 LCD_clear(); 就無法執(zhí)行,屏蔽 LCD_clear(); 之后只能顯一部分,LCD_clear();檢查覺得也沒問題,可就是執(zhí)行不了,怎么解決? # include "msp430g25 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 三人行必有我?guī)煛狤Eworld網友原創(chuàng)教程隆重登場!
- 看視頻答題,玩轉幸運大抽獎:Littelfuse汽車電子電路保護知多少
- 好書共讀 | 《控制之美(卷2)——最優(yōu)化控制MPC與卡爾曼濾波器》
- 是德科技有獎直播:灣區(qū)圓桌派-穿越頻譜壁壘:毫米波技術的創(chuàng)新之路
- 6月6日 Microchip 直播|利用單片機設計安全關鍵型應用時應采取的最佳實踐方法
- 2023 DigiKey KOL 系列——將TinyML融入IoT物聯網應用中
- 拆驚喜抽獎:泰克全新3系列MDO和4系列MSO示波器來啦
- 【EEWORLD第三十屆】2011年09月社區(qū)明星人物揭曉!