實現功能:PA8隨意延時驅動led燈閃爍,并且將PA8用杜邦線連接到PA7口,PA7是通用定時器TIM3的2通道,在TIM3_CH2觸發中斷程序中取反連接到PD2口的led燈,指示中斷程序運行,并且每次進入中斷后改變觸發捕獲的極性。實現兩個led燈會交替閃爍。
先有必要了解stm32定時器的輸入觸發模塊,如下圖:
需要注意的是,一眼望去一個定時器似乎有8個通道,左邊四個,右邊四個,但其實左邊和右邊是共用相同的IO引腳,所以名稱標注是一模一樣。也就是說,每個通用定時器都只有四個獨立通道,當某一通道作為了輸入觸發功能那就不能再作為輸出匹配功能。這一點我們也可以從其他地方找到印證。比如TIM_ITConfig()函數中如下:
Enables or disables the specified TIM interrupts.
Parameters:
我們可以看到此函數TIM_IT參數的取值范圍如下:
TIM_IT_Update: TIM update Interrupt source
TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
TIM_IT_COM: TIM Commutation Interrupt source
TIM_IT_Trigger: TIM Trigger Interrupt source
TIM_IT_Break: TIM Break Interrupt source
也就是說每個通道的捕獲和比較功能是共用一個中斷標志。
stm32定時器輸入觸發功能其實挺簡單的,與AVR單片機幾乎一樣。就是單片機引腳上一旦出現一個有效邊沿(可以配置為上升、下降或者上升下降均觸發),那么定時器計數器CNT里面的值就會被相應的Capture/Compare X Register保存下來。這里X可以是1,2,3,4任何一個。并且中斷標志位被置位。但是此時TIM的計數寄存器CNT卻不管這一事件的發生,繼續自己的計數。此功能可以用來測量外部信號的脈寬或者是周期。
對于定時器的時基單元TIM_TimeBaseStructure就不作說明了,在我前面的文章有專門介紹。下面就重點講解輸入觸發單元TIM_ICInitStructure。
首先看次結構體原型的定義如下:
typedef struct
{
uint16_t TIM_Channel; /*!< Specifies the TIM channel.
This parameter can be a value of @ref TIM_Channel */
uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal.
This parameter can be a value of @ref TIM_Input_Capture_Polarity */
uint16_t TIM_ICSelection; /*!< Specifies the input.
This parameter can be a value of @ref TIM_Input_Capture_Selection */
uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler.
This parameter can be a value of @ref TIM_Input_Capture_Prescaler */
uint16_t TIM_ICFilter; /*!< Specifies the input capture filter.
This parameter can be a number between 0x0 and 0xF */
} TIM_ICInitTypeDef;
它一共有5個成員,5個成員具體作用,我們只要看看3.5版本固件庫的說明就清楚了。
uint16_t TIM_ICInitTypeDef::TIM_Channel
Specifies the TIM channel. This parameter can be a value of TIM_Channel
其中TIM_Channel的取值范圍如下:
TIM_Channel_1.
TIM_Channel_2
TIM_Channel_3
TIM_Channel_4
uint16_t TIM_ICInitTypeDef::TIM_ICFilter
Specifies the input capture filter. This parameter can be a number between 0x0 and 0xF
說實話這個成員具體作用我沒有深入了解,僅僅知道是作為對輸入信號的濾波作用,估計是讓用戶設定用多少個采樣時鐘來確定最終輸入信號,起到濾波作用,避免高頻信號干擾,反正不管它了。
uint16_t TIM_ICInitTypeDef::TIM_ICPolarity
Specifies the active edge of the input signal. This parameter can be a value of TIM_Input_Capture_Polarity
這個就是觸發邊沿的極性選擇了,取值范圍如下:
TIM_ICPolarity_BothEdge
TIM_ICPolarity_Rising
TIM_ICPolarity_Falling
uint16_t TIM_ICInitTypeDef::TIM_ICPrescaler
Specifies the Input Capture Prescaler. This parameter can be a value of TIM_Input_Capture_Prescaler
這個成員是對外部信號進行分頻,也即是設置上圖中的Prescaler,可以設置為1/2/4/8分頻。
uint16_t TIM_ICInitTypeDef::TIM_ICSelection
Specifies the input. This parameter can be a value of TIM_Input_Capture_Selection
這個成員的作用就必須要對照上面的示意圖才能明白。仔細看上面的圖,可以發現定時器的4個通道并不是完全獨立的,而是1、2一組,3、4一組,同組之間的通道是有聯系的。也就是可以出現交叉觸發。而TIM_ICSelection就是選擇要不要使用交叉來觸發,如果不明白可以看固件庫的說明文檔,如下是此結構體成員的取值范圍:
#define TIM_ICSelection_DirectTI ((uint16_t)0x0001)
TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively
#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002)
TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively.
#define TIM_ICSelection_TRC ((uint16_t)0x0003)
TIM Input 1, 2, 3 or 4 is selected to be connected to TRC.
也就是說,根據不同的取值,可以講外部引腳的觸發信號連到內部不同的單元,這樣就使得單片機更加靈活了。
下面是main.c文件
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void delay()
{
u32 i,j;
for(i=0;i<1000;i++)
for(j=0;j<5000;j++)
;
}
void rcc_cfg()
{
;
}
void gpio_cfg()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //隨意延時led取反,且將PA8作為觸發定時器電平
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //觸發中斷時,取反PD2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* TIM3 channel 2 pin (PA.07) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void nvic_cfg()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級0級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級3級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
}
void tim3_cfg()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_InternalClockConfig(TIM3);
//預分頻系數為36000-1,這樣計數器時鐘為72MHz/36000 = 2kHz
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;
//設置時鐘分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//設置計數器模式為向上計數模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//設置計數溢出大小,每計2000個數就產生一個更新事件
TIM_TimeBaseStructure.TIM_Period = 2000 - 1;
//將配置應用到TIM2中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//禁止ARR預裝載緩沖器
TIM_ARRPreloadConfig(TIM3, DISABLE);
//下面是對 TIM_ICInitStructure的配置
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0; /*選擇輸入比較濾波器,濾波設置,經歷幾個周期跳變認定波形穩定0x0~0xF*/
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//開啟TIM2的中斷
TIM_ClearFlag(TIM3, TIM_IT_CC2);
TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);
TIM_Cmd(TIM3, ENABLE); //使能TIMx外設
}
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
rcc_cfg();
gpio_cfg();
nvic_cfg();
tim3_cfg();
while (1)
{
/* Set PA8 */
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);
delay();
/* Reset PA8 */
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
delay();
}
}
注意定時器3通道2引腳設置為浮空輸入。
下面是stm32f10x_it.c文件
#include "stm32f10x_it.h"
u8 flag=0;
extern TIM_ICInitTypeDef TIM_ICInitStructure;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
//每次進入中斷就改變捕獲觸發方式,且翻轉PD2的電平
if(flag==0)
{
flag=1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
GPIO_WriteBit(GPIOD, GPIO_Pin_2, Bit_RESET);
}
else
{
flag=0;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
GPIO_WriteBit(GPIOD, GPIO_Pin_2, Bit_SET);
}
}
}
程序運行后,可以看到板子上兩個led燈交替閃爍。
我并沒有對捕獲值作任何處理,因為我只是測試程序是否能順利進入捕獲中斷。
上一篇:(STM32)GPIO庫函數使用一覽
下一篇:STM32的官方庫函數調用
推薦閱讀
史海拾趣
近年來,隨著人工智能和物聯網技術的快速發展,電子行業迎來了轉型升級的機遇。聯捷(Elinker)緊跟時代潮流,積極推進智能制造和數字化轉型。公司引進了先進的自動化生產線和智能化設備,提高了生產效率和產品質量。同時,公司還加大了對人工智能和物聯網技術的研發力度,推出了一系列具有創新性的智能電子產品。
隨著市場競爭的加劇,Cristek Interconnects Inc公司意識到質量管理的重要性。于是,公司投入大量資源,建立了一套完善的質量管理體系,從原材料采購到生產流程控制,再到產品出廠檢驗,每一個環節都嚴格把關。這種嚴謹的質量管理態度,使得Cristek的產品在行業中享有良好的聲譽,贏得了客戶的信賴。
在環保意識日益增強的今天,大雅智能積極響應國家節能減排政策,推動綠色環保生產。通過采用環保材料和節能技術,大雅智能有效降低了產品生產和使用過程中的能耗和排放。同時,大雅智能還積極參與環保公益活動,倡導綠色消費理念。這些舉措不僅提高了大雅智能的社會責任感形象,也為其可持續發展奠定了堅實基礎。
以上五個故事均基于虛構的DAYA公司(大雅智能)在電子行業中的發展經歷,旨在展示一個電子科技公司可能面臨的市場挑戰、機遇以及發展策略。這些故事雖然并非真實事件,但其中蘊含的商業邏輯和發展趨勢對于電子行業的其他公司也具有一定的借鑒意義。
自上世紀80年代起,Beckhoff便將基于PC的自動化新技術作為公司的發展理念。通過不斷研發和創新,公司成功地將工業PC、現場總線模塊、驅動產品和控制軟件等整合為一套完整的、相互兼容的控制系統。這一創新為工控領域帶來了革命性的變革,使得工業自動化系統更加開放、靈活和高效。
在電子行業的激烈競爭中,Freqtech Ohg公司深知技術創新的重要性。公司投入大量研發資源,專注于高頻電子技術的研發。經過數年的努力,Freqtech成功開發出一款高性能的高頻濾波器,該產品在信號傳輸效率和穩定性方面遠超同類競品。這一技術創新不僅為公司贏得了國內外多個重要客戶,還使得Freqtech在高頻電子領域迅速崛起,成為行業內的佼佼者。
在電子行業的激烈競爭中,GREEGOO公司憑借其在半導體材料領域的持續創新,成功研發出了一種新型高性能芯片封裝材料。這種材料不僅大幅提升了芯片的散熱性能和穩定性,還顯著降低了生產成本。這一技術突破迅速吸引了業界的關注,多家知名電子產品制造商紛紛與GREEGOO建立合作關系,推動了公司業務的快速增長。GREEGOO因此在電子材料市場上嶄露頭角,成為行業內的佼佼者。
新春伊始,在匯集、總結幾年來對干擾原因(因素)的初步認識基礎上,我們不妨來個“反向思維”,以求探索干擾的有效解決辦法。 你做過安防工程嗎?這樣直接提問,雖然有些唐突,但還都可以回答“做過”。但是,如果我問:“你做工程 ...… 查看全部問答∨ |
現在有個項目,就是通過單片機控制精密行星直流減速電機(型號:ple06-16/55zyn04a3), 達到如下目的:電機 正轉反轉100次/分鐘 電壓15V,電流3.2A,功率120W 不知道選用什么型號的單片機,還有具體的編程大概是如何的?可以用C語言編程嗎? ...… 查看全部問答∨ |
單片機學習新人 STC12C4052AD P1.1口電平輸出.求解疑惑 上圖 上程序 用STC12C4052 搭建好最小系統 12M晶振 .寫個 P1.1口輸出 間隔時間輸出脈沖信號.程序如下: ORG 0000H LJMP MAIN ORG 0030HMAIN: MOV R1, ...… 查看全部問答∨ |
|
本帖最后由 ddllxxrr 于 2016-1-7 16:35 編輯 出一個 TP-LINK 的路由器,九成九新,300M速度,原價210,現在 150元包郵出,需要的聯系我的QQ 429512065 本站強薦:185娛樂?城.足球?真_人.彩票齊全?手機可投?注任何游戲. 首次開戶送10元.首存送 ...… 查看全部問答∨ |
現象一:這PCB板子的PCB設計要求不高,就用細一點的線,自動布吧點評:自動布線必然要占用更大的PCB面積,同時產生比手動布線多好多倍的過孔,在批量很大的產品中,PCB廠家降價所考慮的因素除了商務因素外,就是線寬和過孔數量,它們分別影響到 ...… 查看全部問答∨ |
本帖最后由 chenzhufly 于 2014-11-24 16:11 編輯 在Altera SoC FPGA系統中,有兩種不同的外設連接方式,一種是ARM通過AXI總線連接的外設,(可以成為硬外設),另外有一種是通過FPGA連接的外設, 在SoC FPGA中,通過FPGA連接的外設是通過LW HP ...… 查看全部問答∨ |
求大神解答啊,MSP430F5529A支持幾個UART口啊??最近要選個單片機做項目,需要至少兩個UART串口,不知道這個單片機支持幾個啊??… 查看全部問答∨ |