CW32系列MCU的GTIM、ATIM的每個定時器都帶有至少4路獨立的捕獲 / 比較通道,輸入捕獲功能可以測量輸入信號的脈沖寬度或者頻率。當捕獲比較通道 CHy 上信號發生跳變(上升沿或下降沿)時,硬件自動將當前計數寄存器 GTIMx_CNT 的值存放到對應通道的比較捕獲寄存器 GTIMx_CCRy 中,完成一次捕獲。通過連續幾次捕獲即可完成信號脈沖寬度或者頻率的測量。
功能框圖如下圖所示:
各個通道上觸發捕獲的條件由比較捕獲控制寄存器 GTIMx_CMMR 決定。
當發生一次捕獲時,通道 CHy 比較捕獲中斷標志 GTIMx_ISR.CCy 被硬件置位,如果允許中斷 ( 設置中斷使能寄 存器 GTIMx_IER.CCy 為 1),CPU 將響應中斷服務程序。退出中斷服務程序之前,應設置中斷標志清除寄存器 GTIMx_ICR.CCy 為 0 以清除該標志。
輸入捕獲來源
GTIM 的輸入捕獲來源可以是外部 GTIMx_CHy 引腳,也可以是片內其它外設,通過通用定時器輸入捕獲來源配置寄存器 SYSCTRL_GTIMxCAP 進行配置。當 SYSCTRL_GTIMxCAP.CHy 為 0x00 時,輸入捕獲信號的外部輸入端口由 GPIO 復用功能寄存器 (GPIOx_AFRH 和 GPIOx_AFRL) 進行配置。當 SYSCTRL_GTIMxCAP.CHy 為 0x01 ~ 0x07 時,輸入捕獲信號來自片內其它外設,如下表所示:
這種配置下,可以在芯片內部實現外部輸入的互聯,例如將 UART 的 RXD 信號作為輸入捕獲來源,可以實現對 UART 波特率的自動檢測。
實例演示:利用GTIM的輸入捕獲功能,測量PWM信號的周期和脈寬
1.初始化系統時鐘
void RCC_Configuration(void)
{
__RCC_GTIM1_CLK_ENABLE();
__RCC_GPIOA_CLK_ENABLE();
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
// 系統時鐘設置為HSI,6分頻,8MHz, PCLK、HCLK不分頻, PCLK=HCLK=SysClk=8MHz
}
2.初始化GPIO
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pins = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_Init(CW_GPIOA, GPIO_InitStruct);
PA06_AFx_GTIM1CH1();//設置PA06復用為GTIM1_CH1, 上升沿觸發捕獲
PA07_AFx_GTIM1CH2();//設置PA07復用為GTIM1_CH2,下降沿觸發捕獲。
}
3.配置中斷服務程序
void NVIC_Configuration(void)
{
__disable_irq();
NVIC_EnableIRQ(GTIM1_IRQn);
__enable_irq();
}
4.GTIM1中斷服務程序:通道1的輸入捕獲中斷獲取計數值VALUE1,通道2的輸入捕獲中斷獲取計數值VALUE2,通道1的第2次輸入捕獲中斷獲取計數值VALUE3。則信號脈寬=VALUE2-VALUE1,信號周期=VALUE3-VALUE1。注意如果待測量信號的脈寬和周期較長,在計算時需要考慮定時器的溢出問題,詳見定時器溢出中斷處理內容。
void GTIM1_IRQHandler(void)
{
GTIM1_IRQHandlerCallBack();
}
void GTIM1_IRQHandlerCallBack(void)
{
static uint8_t stage = 0;
static uint32_t cnt = 0;
if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_OV))
{
GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_OV);
if (stage == 1)
{
cnt++;
}
}
if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_CC1))
{
if (stage == 0)
{
PWMPeriod = GTIM_GetCapture1(CW_GTIM1);
stage = 1;
}
else if (stage == 1)
{
PWMPeriod = GTIM_GetCapture1(CW_GTIM1) + cnt * 65536 - PWMPeriod;
stage = 0;
cnt = 0;
}
GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_CC1);
}
if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_CC2))
{
if (stage == 1)
{
PWMWidth = GTIM_GetCapture2(CW_GTIM1) + cnt * 65536 - PWMPeriod;
}
GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_CC2);
}
}
5.主程序:使用GTIM1的CH1和CH2兩個通道對PWM輸入信號進行測量,在捕獲中斷服務程序中完成信號的周期和脈寬計算。
static uint32_t PWMPeriod = 0;
static uint32_t PWMWidth = 0;
int32_t main(void)
{
RCC_Configuration();//System Clocks Configuration
GPIO_Configuration();//GPIO Configuration
NVIC_Configuration();//NVIC Configuration
GTIM_InitTypeDef GTIM_InitStruct = {0};
GTIM_ICInitTypeDef GTIM_ICInitStruct = {0};
GTIM_InitStruct.Mode = GTIM_MODE_TIME; /*!< GTIM的模式選擇。*/
GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;
/*!< GTIM的單次/連續計數模式選擇。*/
GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV1; /*!< GTIM的預分頻系數。*/
GTIM_InitStruct.ReloadValue = 0xFFFF; /*!< GTIM的重載值。*/
GTIM_InitStruct.ToggleOutState = DISABLE;
GTIM_TimeBaseInit(CW_GTIM1, GTIM_InitStruct); //GTIM的基礎參數初始化
GTIM_ICInitStruct.CHx = GTIM_CHANNEL1;// GTIM 輸入捕獲的配置參數
GTIM_ICInitStruct.ICFilter = GTIM_CHx_FILTER_NONE;
GTIM_ICInitStruct.ICInvert = GTIM_CHx_INVERT_ON;
GTIM_ICInitStruct.ICPolarity = GTIM_ICPolarity_Rising;
GTIM_ICInit(CW_GTIM1, GTIM_ICInitStruct);//輸入捕獲功能初始化
GTIM_ICInitStruct.CHx = GTIM_CHANNEL2;
GTIM_ICInitStruct.ICPolarity = GTIM_ICPolarity_Falling;
GTIM_ICInit(CW_GTIM1, GTIM_ICInitStruct);
GTIM_ITConfig(CW_GTIM1, GTIM_IT_CC1 | GTIM_IT_CC2 | GTIM_IT_OV, ENABLE);
GTIM_Cmd(CW_GTIM1, ENABLE);
while (1)
{
}
}
6.演示說明:
將同一個PWM輸入信號引入到PA06和PA07上,運行程序,使用GTIM1的CH1和CH2兩個通道對PWM輸入信號的脈寬和周期進行測量。
來源:武漢芯源半導體
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5401瀏覽量
122805 -
定時器
+關注
關注
23文章
3272瀏覽量
116747
發布評論請先 登錄
相關推薦
MCU定時器/計數器
定時器是不是有編碼器輸入功能?
代碼+案例+生態:武漢芯源半導體CW32嵌入式開發實戰正式出版

代碼+案例+生態:武漢芯源半導體CW32嵌入式開發實戰正式出版
武漢芯源半導體CW32芯片重慶地區線下技術交流會成功舉辦
使用STM32F1輸入捕獲功能時,TIM6和TIM7無法實現輸入捕獲是哪里的問題?
定時器的工作方式介紹
三菱plc編程定時器編程咋輸入
武漢芯源半導體CW32F030K8T7在即熱式熱水器的應用介紹
【項目展示】基于CW32的遙控循跡小車

評論