CW32系列MCU的GTIM、ATIM的每個(gè)定時(shí)器都帶有至少4路獨(dú)立的捕獲 / 比較通道,輸入捕獲功能可以測(cè)量輸入信號(hào)的脈沖寬度或者頻率。當(dāng)捕獲比較通道 CHy 上信號(hào)發(fā)生跳變(上升沿或下降沿)時(shí),硬件自動(dòng)將當(dāng)前計(jì)數(shù)寄存器 GTIMx_CNT 的值存放到對(duì)應(yīng)通道的比較捕獲寄存器 GTIMx_CCRy 中,完成一次捕獲。通過(guò)連續(xù)幾次捕獲即可完成信號(hào)脈沖寬度或者頻率的測(cè)量。
功能框圖如下圖所示:
各個(gè)通道上觸發(fā)捕獲的條件由比較捕獲控制寄存器 GTIMx_CMMR 決定。
當(dāng)發(fā)生一次捕獲時(shí),通道 CHy 比較捕獲中斷標(biāo)志 GTIMx_ISR.CCy 被硬件置位,如果允許中斷 ( 設(shè)置中斷使能寄 存器 GTIMx_IER.CCy 為 1),CPU 將響應(yīng)中斷服務(wù)程序。退出中斷服務(wù)程序之前,應(yīng)設(shè)置中斷標(biāo)志清除寄存器 GTIMx_ICR.CCy 為 0 以清除該標(biāo)志。
輸入捕獲來(lái)源
GTIM 的輸入捕獲來(lái)源可以是外部 GTIMx_CHy 引腳,也可以是片內(nèi)其它外設(shè),通過(guò)通用定時(shí)器輸入捕獲來(lái)源配置寄存器 SYSCTRL_GTIMxCAP 進(jìn)行配置。當(dāng) SYSCTRL_GTIMxCAP.CHy 為 0x00 時(shí),輸入捕獲信號(hào)的外部輸入端口由 GPIO 復(fù)用功能寄存器 (GPIOx_AFRH 和 GPIOx_AFRL) 進(jìn)行配置。當(dāng) SYSCTRL_GTIMxCAP.CHy 為 0x01 ~ 0x07 時(shí),輸入捕獲信號(hào)來(lái)自片內(nèi)其它外設(shè),如下表所示:
這種配置下,可以在芯片內(nèi)部實(shí)現(xiàn)外部輸入的互聯(lián),例如將 UART 的 RXD 信號(hào)作為輸入捕獲來(lái)源,可以實(shí)現(xiàn)對(duì) UART 波特率的自動(dòng)檢測(cè)。
實(shí)例演示:利用GTIM的輸入捕獲功能,測(cè)量PWM信號(hào)的周期和脈寬
1.初始化系統(tǒng)時(shí)鐘
void RCC_Configuration(void)
{
__RCC_GTIM1_CLK_ENABLE();
__RCC_GPIOA_CLK_ENABLE();
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
// 系統(tǒng)時(shí)鐘設(shè)置為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();//設(shè)置PA06復(fù)用為GTIM1_CH1, 上升沿觸發(fā)捕獲
PA07_AFx_GTIM1CH2();//設(shè)置PA07復(fù)用為GTIM1_CH2,下降沿觸發(fā)捕獲。
}
3.配置中斷服務(wù)程序
void NVIC_Configuration(void)
{
__disable_irq();
NVIC_EnableIRQ(GTIM1_IRQn);
__enable_irq();
}
4.GTIM1中斷服務(wù)程序:通道1的輸入捕獲中斷獲取計(jì)數(shù)值VALUE1,通道2的輸入捕獲中斷獲取計(jì)數(shù)值VALUE2,通道1的第2次輸入捕獲中斷獲取計(jì)數(shù)值VALUE3。則信號(hào)脈寬=VALUE2-VALUE1,信號(hào)周期=VALUE3-VALUE1。注意如果待測(cè)量信號(hào)的脈寬和周期較長(zhǎng),在計(jì)算時(shí)需要考慮定時(shí)器的溢出問(wèn)題,詳見定時(shí)器溢出中斷處理內(nèi)容。
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兩個(gè)通道對(duì)PWM輸入信號(hào)進(jìn)行測(cè)量,在捕獲中斷服務(wù)程序中完成信號(hào)的周期和脈寬計(jì)算。
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的單次/連續(xù)計(jì)數(shù)模式選擇。*/
GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV1; /*!< GTIM的預(yù)分頻系數(shù)。*/
GTIM_InitStruct.ReloadValue = 0xFFFF; /*!< GTIM的重載值。*/
GTIM_InitStruct.ToggleOutState = DISABLE;
GTIM_TimeBaseInit(CW_GTIM1, GTIM_InitStruct); //GTIM的基礎(chǔ)參數(shù)初始化
GTIM_ICInitStruct.CHx = GTIM_CHANNEL1;// GTIM 輸入捕獲的配置參數(shù)
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.演示說(shuō)明:
將同一個(gè)PWM輸入信號(hào)引入到PA06和PA07上,運(yùn)行程序,使用GTIM1的CH1和CH2兩個(gè)通道對(duì)PWM輸入信號(hào)的脈寬和周期進(jìn)行測(cè)量。
來(lái)源:武漢芯源半導(dǎo)體
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120365 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3248瀏覽量
114800
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論