1. 程式人生 > 其它 >華大HC32系統嘀嗒定時器以及串列埠配置

華大HC32系統嘀嗒定時器以及串列埠配置

嘀嗒定時器

系統定時器(嘀嗒定時器)常用來為系統提供基準時鐘,可以判斷當前執行時間,也能用來自定義延時函式。

初始化SysTick

HC32預設沒開啟系統定時器,如果直接去獲取Tick,會獲取不到任何值。

初始化定義在hc32f46x_utility.c中第311行。

SysTick_Init

/**
 *******************************************************************************
 ** \brief This function Initializes the interrupt frequency of the SysTick.
 **
 ** \param [in] u32Freq                 SysTick interrupt frequency (1 to 1000).
 **
 ** \retval Ok                          SysTick Initializes succeed
 ** \retval Error                       SysTick Initializes failed
 **
 ******************************************************************************/
__WEAKDEF en_result_t SysTick_Init(uint32_t u32Freq)
{
    en_result_t enRet = Error;
    if ((0UL != u32Freq) && (u32Freq <= 1000UL))
    {
        m_u32TickStep = 1000UL / u32Freq;
        /* Configure the SysTick interrupt */
        if (0UL == SysTick_Config(SystemCoreClock / u32Freq))
        {
            enRet = Ok;
        }
    }
    return enRet;
}

該函式是弱定義函式,可以使用者自行在其他地方定義同名函式並覆蓋,這裡直接呼叫。傳入引數為系統頻率,決定了每次定時間隔是1s或是1ms之間任意值。

定義SysTick中斷

初始化定時器後,系統雖然開始計時,但是此時u32TickCount計數值仍未增加,需要在定時器中斷中執行SysTick_IncTick來增加計數值。可以定義在任何地方。

void SysTick_IrqHandler(void)
{
    SysTick_IncTick();
}

獲取SysTick計數值

以上步驟執行完後,方可使用SysTick_GetTick()獲取當前計數時間,亦可直接讀取全域性變數u32TickCount

的值。

DEBUG功能

hc32f46x_utility.c中,同樣定義了printf,DebugOutput等DEBUG函式,初始化完串列埠後可以直接使用printf來debug,預設使用了USART3PE5作為DEBUG輸出。如果沒有在其他地方初始化串列埠的話,printf會沒有輸出,需要通過 Ddl_UartInit();初始化串列埠3或者是初始化其他串列埠,並修改DEBUG函式,更改USART3為其他串列埠。

串列埠配置

HC32使用的匯流排矩陣,可以將外設對映到任意引腳上。串列埠配置可以直接參照例程。如果只使用一個USART(不包括DEBUG),直接修改define即可。

/* USART channel definition */
#define USART_CH                        (M4_USART2)

/* USART baudrate definition */
#define USART_BAUDRATE                  (12500000ul)

/* USART RX Port/Pin definition */
#define USART_RX_PORT                   (PortB)
#define USART_RX_PIN                    (Pin00)
#define USART_RX_FUNC                   (Func_Usart2_Rx)

/* USART TX Port/Pin definition */
#define USART_TX_PORT                   (PortB)
#define USART_TX_PIN                    (Pin01)
#define USART_TX_FUNC                   (Func_Usart2_Tx)

/* USART interrupt number  */
#define USART_RI_NUM                    (INT_USART2_RI)
#define USART_EI_NUM                    (INT_USART2_EI)
#define USART_TI_NUM                    (INT_USART2_TI)
#define USART_TCI_NUM                   (INT_USART2_TCI)