1. 程式人生 > >Nrf51822 滴答時鐘替代者 -- RTC

Nrf51822 滴答時鐘替代者 -- RTC

簡介: ARM的Cortex系列一般都有滴答時鐘,使用RTOS的前輩應該對滴答時鐘再熟悉不過了,但是Nordic雖然使用的也是Cortex_M0的核心,為了節省硬體資源,晶片內部省略了滴答時鐘,今天,使用RTC定時器模擬滴答時鐘進行定時。

  1. 檢視晶片手冊中RTC時鐘結構
    這裡寫圖片描述
    由圖可知,其實Nordic晶片中的RTC其實就是一個獨立的定時器,因此對其配置應該跟一般的timer設定差不離,區別是RTC是由LFCLK提供時鐘,因此,在執行RTC時必須斷開16MHz時鐘。

  2. 選擇RTC的時鐘源

    NRF_CLOCK->LFCLKSRC = 1 << 0; //使用外部32.768KHz 
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; //關輸出16MHz時鐘 0:關 1:開 NRF_CLOCK->TASKS_LFCLKSTART = 1; //開輸入32.768KHz時鐘 while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { //如果時鐘關閉,則不作操作 } NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; //確保輸出時鐘一直處於關閉狀態
  1. RTC的配置
    這裡寫圖片描述

由晶片手冊計算頻率公式可知,如果需要8Hz的RTC時鐘,則預分頻暫存器的值為
PRESCALER = round (32.768 kHz / 8 Hz) – 1 = 4095

    NVIC_EnableIRQ(RTC0_IRQn);         //使能RTC中斷
    NRF_RTC0->PRESCALER = 4095;    //RTC時鐘8Hz,計數週期125ms
    NRF_RTC0->CC[0] = 8;         //1*8   8Hz的時鐘  需要比較8次才能接近1s的定時 (125ms*8 = 1s)

    NRF_RTC0->EVTENSET = 1;     //開啟滴答事件   
    NRF_RTC0->INTENSET = 1;     //開啟滴答中斷

    NRF_RTC0->EVTENSET      = 1
<<16; //開啟比較器事件 NRF_RTC0->INTENSET = 1<<16; //開啟比較器中斷
  1. 寫中斷處理函式,此處僅判斷中斷髮生後,進行LED燈的翻轉
void RTC0_IRQHandler()
{
    if ((NRF_RTC0->EVENTS_TICK != 0) && ((NRF_RTC0->INTENSET & RTC_INTENSET_TICK_Msk) != 0))
    {
        NRF_RTC0->EVENTS_TICK = 0;
        LED1_Toggle();
    }    //滴答中斷  翻轉LED1125ms翻轉一次

    if ((NRF_RTC0->EVENTS_COMPARE[0] != 0) && ((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
    {
        NRF_RTC0->EVENTS_COMPARE[0] = 0;
        LED2_Toggle();
    }   //比較器中斷  翻轉LED21s翻轉一次
}
  1. 主函式

int main(void)
{
    //配置LED燈引腳為輸出,關閉LED燈
    //呼叫RTC時鐘源配置
    //呼叫RTC配置
    NRF_RTC0->TASKS_START = 1;   //開啟RTC定時器

    while (1)
    {
        //空轉,等待中斷並處理中斷,進行LED燈翻轉
    }

}

將程式下載到開發板, 實驗現象應該與預想的一致,LED1每過125ms就會翻轉一次,而LED2則會1s翻轉一次