137 timerm+輸出比較功能

#include "bat32g137.h"
#include "userdefine.h"
#include "clk.h"
#include "tmm.h"

/***********************************************************************************************************************
* Function Name: TMM0_Init
* Description  : This function initializes the TMM0 module.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void TMM0_Init(void)
{
	// 開啓外設時鐘
    CGC->PER1 |= CGC_PER1_TMMEN_Msk;     /* enables input clock supply */
	// 比較不清楚計數器
    TMM->TMSTR |= _04_TMM_TM0_COUNT_CONTINUES;
	// 停止定時器
    TMM->TMSTR &= (uint8_t)~_01_TMM_TM0_COUNT_START;
	// C D 通用寄存器
    TMM->TMMR |= _00_TMM_TMGRC0_GENERAL | _00_TMM_TMGRD0_GENERAL;
	// 
    TMM->TMOER1 &= (uint8_t)~(_08_TMM_TMIOD0_OUTPUT_DISABLE | _04_TMM_TMIOC0_OUTPUT_DISABLE | _02_TMM_TMIOB0_OUTPUT_DISABLE | _01_TMM_TMIOA0_OUTPUT_DISABLE);
    TMM->TMOER1 |= _00_TMM_TMIOA0_OUTPUT_ENABLE | _00_TMM_TMIOB0_OUTPUT_ENABLE | _04_TMM_TMIOC0_OUTPUT_DISABLE | _00_TMM_TMIOD0_OUTPUT_ENABLE;
    TMM->TMOCR |= _00_TMM_TMIOA0_INITIAL_OUTPUT_L | _00_TMM_TMIOB0_INITIAL_OUTPUT_L | _00_TMM_TMIOD0_INITIAL_OUTPUT_L;
	// 
    TMM->TMCR0 = _C0_TMM_COUNTER_CLEAR_TMGRD | _00_TMM_INETNAL_CLOCK_FCLK_FHOCO;
	// 輸出模式
    TMM->TMIORA0 = _00_TMM_TMGRB_COMPARE | _30_TMM_TMGRB_COMPARE_OUTPUT_TOGGLE | _00_TMM_TMGRA_COMPARE | _03_TMM_TMGRA_COMPARE_OUTPUT_TOGGLE;
    TMM->TMIORC0 = _80_TMM_TMGRD_GENERAL_BUFFER_REGISTER | _00_TMM_TMGRD_COMPARE | _30_TMM_TMGRD_COMPARE_OUTPUT_TOGGLE | _08_TMM_TMGRC_GENERAL_BUFFER_REGISTER | _00_TMM_TMGRC_COMPARE;
    // 開啓中斷 
	//TMM->TMIER0 = _10_TMM_OVIE_ENABLE | _08_TMM_IMID_ENABLE | _04_TMM_IMIC_ENABLE | _02_TMM_IMIB_ENABLE | _01_TMM_IMIA_ENABLE;
    TMM->TMPOCR0 = _00_TMIOD_OUTPUT_ACTIVE_L | _00_TMIOC_OUTPUT_ACTIVE_L | _00_TMIOB_OUTPUT_ACTIVE_L;
    TMM->TMGRA0 = 2000;
    TMM->TMGRB0 = 5000;
    TMM->TMGRC0 = 8000;
    TMM->TMGRD0 = 10000; // 4800000/1000 = 48000Hz 生成的方波週期頻率爲2.4KHz
    TMM->OPCTL0 = _00_TMM_PWMOP_NO_CUTOFF;
    /* Set TMIOA0 pin */
    PORT->POM1 &= 0x7FU; // P17
    PORT->P1 &= 0x7FU;
    PORT->PM1 &= 0x7FU;
    /* Set TMIOB0 pin */
    PORT->POM1 &= 0xEFU; // P14
    PORT->P1 &= ~(1<<4);
    PORT->PM1 &= 0xEFU;
    /* Set TMIOD0 pin */
    PORT->POM1 &= 0xDFU; // P15
    PORT->P1 &= 0xDFU;
    PORT->PM1 &= 0xDFU;

}

/***********************************************************************************************************************
* Function Name: TMM0_Start
* Description  : This function starts TMM0 counter.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void TMM0_Start(void)
{
    volatile uint8_t tmsr_dummy;

    INTC_ClearPendingIRQ(TMM0_IRQn);/* clear INTTMM0 interrupt flag */
    tmsr_dummy = TMM->TMSR0; /* read TMSR0 before write 0 */
    TMM->TMSR0 = 0x00U; /* clear TM0 each interrupt request */
    INTC_EnableIRQ(TMM0_IRQn);/* enable INTTMM0 interrupt */
	TMM->TMSTR |= _04_TMM_TM0_COUNT_CONTINUES;
	TMM->TMSTR |= _01_TMM_TM0_COUNT_START;
}

int main(void)
{
	TMM0_Init();
	TMM0_Start();
	while(1)
	{
		
	}
}
void IRQ27_Handler(void) __attribute__((alias("tmm0_interrupt")));
/***********************************************************************************************************************
* Function Name: tmm0_interrupt
* Description  : None
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void tmm0_interrupt(void)
{
    INTC_ClearPendingIRQ(TMM0_IRQn); /* clear INTTMM0 interrupt flag */
	uint8_t  tmsr0_temp = TMM->TMSR0;
    if ((TMM->TMSR0 & _10_TMM0_INTOV_GENERATE_FLAG) == _10_TMM0_INTOV_GENERATE_FLAG)
    {
        TMM->TMSR0 = tmsr0_temp & (uint8_t)~_10_TMM0_INTOV_GENERATE_FLAG;
    }
	if ((TMM->TMSR0 & _01_TMM0_INTA_GENERATE_FLAG) == _01_TMM0_INTA_GENERATE_FLAG)
    {
		// 清狀態
        TMM->TMSR0 = tmsr0_temp & (uint8_t)~_01_TMM0_INTA_GENERATE_FLAG;
	}
	if ((TMM->TMSR0 & _02_TMM0_INTB_GENERATE_FLAG) == _02_TMM0_INTB_GENERATE_FLAG)
    {
        TMM->TMSR0 = tmsr0_temp & (uint8_t)~(_02_TMM0_INTB_GENERATE_FLAG);
	}
}

輸出比較,是寄存器ABCD和定時器寄存器值匹配後對應的IO輸出變化,可以是高電平可以是低電平,也可以翻轉,

我自己開始就以爲是輸出方波,測試半天,才發現是可以輸出翻轉IO。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章