關(guān)于使用stm8單片機的“外部計數(shù)”TIMx_ETR測脈沖的軟件配置問題
本人在大四工作實習期間,由于工作需要,需要使用STM8單片機測量一個方波脈沖的頻率,一開始想要使用定時器捕獲,可是需要測量的脈沖頻率較高,用捕獲測量不僅測量不準確,而且效率低下。于是乎想到了用外部計數(shù)TIMx_ETR功能測量!
真正的問題來了,之前從來沒用過STM8的外部脈沖計數(shù)功能,而且網(wǎng)上也是在找不到如何配置外部脈沖計數(shù)模式。而公司的進度還在不斷的向前趕,更蛋疼的是STM8的絕大多數(shù)資料手冊全是英文版的,不像STM32單片機那樣有很多中文版。這下可急壞了筆者?蛇是硬著頭皮連夜加班的看英文文檔。
經(jīng)過2天的努力煎熬,筆者終于找到了解決方法,那個興奮啊,無以言表。接下來話不多說,趕緊向廣大網(wǎng)友分享STM8單片機的TIMx_ETR的配置技巧:
1:其實STM8單片機的TIMx_ETR功能對STM8S系列和STM8L系列的配置方法是不相同的;STM8S是標準版,而STM8L是低功耗版;
對于STM8S系列的外部計數(shù)配置,需要通過向FLASH內(nèi)修改選項字節(jié)來激活TIMx_ETR的重映射功能,通過查看手冊的“選項字節(jié)”那部分就可以發(fā)現(xiàn),在STM8S的4803h地址的重映射選項里有個選項字節(jié)叫OPT2,當向OPT2字節(jié)寫入0X20時,便可以將PB3引腳映射為TIMx_ETR外部脈沖計數(shù)功能引腳。配置完選項字節(jié)之后另外還有一個值得注意的問題是:此時該PB3引腳的管腳必須配置成“上拉輸入且無外部中斷”,即庫函數(shù)里的 GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);這一句,F(xiàn)附程序如下所示:
{
TIM1_DeInit();
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);// 開啟定時器2的時鐘,
FLASH_Unlock(FLASH_MEMTYPE_DATA); //解鎖
while(FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
FLASH_ProgramOptionByte(0x4803,0x20); //選項字節(jié),向0X4803地址寫入0X20
u8 status;
status=FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
if(status==FLASH_STATUS_SUCCESSFUL_OPERATION)
{}
FLASH_Lock(FLASH_MEMTYPE_DATA);
TIM1_ETRClockMode2Config(TIM1_EXTTRGPSC_DIV2, TIM1_EXTTRGPOLARITY_INVERTED,0x00); //外部計數(shù)配置
TIM1_TimeBaseInit(1,TIM1_COUNTERMODE_UP,9999,0);
TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
TIM1_SetCounter(0x0);
TIM1_ClearITPendingBit(TIM1_IT_UPDATE); //參考庫
TIM1_Cmd(ENABLE);
}
2:然而不是所有STM8單片機都需要改選項字節(jié),對于STM8L系列單片機就不必修改選項字節(jié),直接配置即可,附程序代碼如下:
TIM2_DeInit();
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);// 開啟定時器2的時鐘
TIM2_ETRClockMode2Config(TIM2_ExtTRGPSC_DIV2, TIM2_ExtTRGPolarity_Inverted,0x00);
TIM2_TimeBaseInit(TIM2_Prescaler_1,TIM2_CounterMode_Up,9999);//需不需要加?
TIM2_ITConfig(TIM2_IT_Update,ENABLE);
TIM2_SetCounter(0x0);
TIM2_ClearITPendingBit(TIM2_IT_Update); //參考庫
TIM2_Cmd(ENABLE);
希望能幫助到你!
編輯:admin 最后修改時間:2018-05-18