Nrf51822 滴答時鐘替代者 -- RTC
阿新 • • 發佈:2019-01-05
簡介: ARM的Cortex系列一般都有滴答時鐘,使用RTOS的前輩應該對滴答時鐘再熟悉不過了,但是Nordic雖然使用的也是Cortex_M0的核心,為了節省硬體資源,晶片內部省略了滴答時鐘,今天,使用RTC定時器模擬滴答時鐘進行定時。
檢視晶片手冊中RTC時鐘結構
由圖可知,其實Nordic晶片中的RTC其實就是一個獨立的定時器,因此對其配置應該跟一般的timer設定差不離,區別是RTC是由LFCLK提供時鐘,因此,在執行RTC時必須斷開16MHz時鐘。選擇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; //確保輸出時鐘一直處於關閉狀態
- 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; //開啟比較器中斷
- 寫中斷處理函式,此處僅判斷中斷髮生後,進行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();
} //滴答中斷 翻轉LED1 每125ms翻轉一次
if ((NRF_RTC0->EVENTS_COMPARE[0] != 0) && ((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
{
NRF_RTC0->EVENTS_COMPARE[0] = 0;
LED2_Toggle();
} //比較器中斷 翻轉LED2 每1s翻轉一次
}
- 主函式
int main(void)
{
//配置LED燈引腳為輸出,關閉LED燈
//呼叫RTC時鐘源配置
//呼叫RTC配置
NRF_RTC0->TASKS_START = 1; //開啟RTC定時器
while (1)
{
//空轉,等待中斷並處理中斷,進行LED燈翻轉
}
}
將程式下載到開發板, 實驗現象應該與預想的一致,LED1每過125ms就會翻轉一次,而LED2則會1s翻轉一次