加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

瑞薩RA8系列教程 | RA8單片機(jī)SysTick使用描述

10/09 12:50
943
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

微信公眾號(hào) | strongerHuang

每個(gè)Cortex-M內(nèi)核都集成了一個(gè)SysTick模塊,那是因?yàn)檫@個(gè)模塊幾乎是單片機(jī)項(xiàng)目必備的一個(gè)(定時(shí)器)功能。

不管是最新的Cortex-M85內(nèi)核,還是經(jīng)典的Cortex-M3內(nèi)核單片機(jī),都集成了?SysTick 模塊。

cm3.h與cm85.h

單片機(jī)開發(fā)者,接觸最多的就是core_cm3.h(core_cm85.h)文件,這里定義了與內(nèi)核相關(guān)的大部分內(nèi)容,平時(shí)我們調(diào)用最多也是這里的接口。

我們對(duì)比一下這兩個(gè)源文件:

通過(guò)對(duì)比源代碼,你會(huì)直觀地發(fā)現(xiàn),cm85比cm3代碼行數(shù)明顯大多了,1943行和4672行。當(dāng)然,行數(shù)多了這么多,左側(cè)紅色(差異)部分也比較多。

雖然,左側(cè)“紅色”比較多,但大部分都是多出來(lái)的行數(shù)以及宏定義。仔細(xì)對(duì)比,其實(shí)很多都是一樣的,比如我們常用的系統(tǒng)復(fù)位函數(shù):

__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void){  __DSB();                                                          /* Ensure all outstanding memory accesses included                                                                       buffered write are completed before reset */  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */  __DSB();                                                          /* Ensure completion of memory access */
  for(;;)                                                           /* wait until reset */  {    __NOP();  }}

再比如系統(tǒng)Tick配置函數(shù):

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)  {    return (1UL);                                                   /* Reload value impossible */  }
  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |                   SysTick_CTRL_TICKINT_Msk   |                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */  return (0UL);                                                     /* Function successful */}

其實(shí),你會(huì)發(fā)現(xiàn),在Cortext-M3單片機(jī)上常用的這些函數(shù)接口,基本和CM85一樣,這也說(shuō)明CM85大部分接口向下兼容CM3。

RA8單片機(jī)SysTick使用描述

這里結(jié)合瑞薩 RA8D1(Cortex-M85內(nèi)核)單片機(jī)給大家講述一下SysTick的用法以及描述其源碼。

使用?e2 studio?以及fsp軟件

工具自帶的軟件包其實(shí)是最實(shí)用的,這里以IO翻轉(zhuǎn),SysTick延時(shí)為例,手把手教大家創(chuàng)建一個(gè)工程,并演示效果。

1、打開e2 studio創(chuàng)建單片機(jī)項(xiàng)目

我們命名項(xiàng)目名稱為:RA8D1_SysTick

選擇對(duì)應(yīng)芯片型號(hào):R7FA8D1BEC

基本上只需要?jiǎng)觿?dòng)鼠標(biāo)“點(diǎn)一點(diǎn)”,一個(gè)完整的工程就創(chuàng)建好了。

2、配置工程

這里配置一些基礎(chǔ)的信息,我們使用一個(gè)IO(PA01)來(lái)測(cè)試一下SysTick延時(shí)時(shí)間。

配置時(shí)鐘樹:

配置輸出Hex文件:

3、演示

這里只是簡(jiǎn)單演示Demo,我們添加一個(gè)IO翻轉(zhuǎn)來(lái)測(cè)試SysTick延時(shí)時(shí)間。

while(1){    R_PORT10->PODR ^= 1<<(BSP_IO_PORT_10_PIN_01 & 0xFF);     //PA01亮滅翻轉(zhuǎn)    R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);    //SysTick延時(shí)}

這個(gè)是1ms翻轉(zhuǎn),SysTick延時(shí)誤差還是比較小,相對(duì)1ms來(lái)說(shuō)誤差可以忽略(采樣頻率100KHz看不出來(lái)誤差)。

采樣頻率為100MHz,其實(shí)還是看得出來(lái)有點(diǎn)誤差。當(dāng)然,這個(gè)誤差是晶振、軟件等多種因素影響的。還有,us級(jí)別的誤差,相對(duì)ms可以忽略。

如果改為1us翻轉(zhuǎn),通過(guò)IO翻轉(zhuǎn)來(lái)測(cè)試,誤差就相對(duì)明顯一點(diǎn)。

4、源碼描述

有經(jīng)驗(yàn)的工程師應(yīng)該都能看懂,這里針對(duì)初學(xué)者簡(jiǎn)單說(shuō)下。

R_PORT10->PODR ^= 1<<(BSP_IO_PORT_10_PIN_01 & 0xFF);

為了減少軟件帶來(lái)誤差,這里直接操作寄存器進(jìn)行IO翻轉(zhuǎn)。

R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);

R_BSP_SoftwareDelay:阻塞延時(shí)函數(shù),是FSP軟件包自帶函數(shù)接口。
BSP_DELAY_UNITS_MILLISECONDS:宏定義,延時(shí)單位(毫秒)。系統(tǒng)定義了三個(gè)宏:

typedef enum{    BSP_DELAY_UNITS_SECONDS      = 1000000, ///< Requested delay amount is in seconds    BSP_DELAY_UNITS_MILLISECONDS = 1000,    ///< Requested delay amount is in milliseconds    BSP_DELAY_UNITS_MICROSECONDS = 1        ///< Requested delay amount is in microseconds} bsp_delay_units_t;

R_BSP_SoftwareDelay:其實(shí)就是利用SysTick進(jìn)行的延時(shí)。

通過(guò)分析源碼,你會(huì)發(fā)現(xiàn)Cortex-M85內(nèi)核的SysTick和 Cortex-M3的向下兼容,常用的接口也一樣。

最后,單片機(jī)內(nèi)核的SysTick是不是很簡(jiǎn)答,希望通過(guò)本文的描述,對(duì)你了解SysTick有所幫助。

瑞薩電子

瑞薩電子

(RENESAS)于2003年4月1日—由日立制作所半導(dǎo)體部門和三菱電機(jī)半導(dǎo)體部門合并成立。RENESAS結(jié)合了日立與三菱在半導(dǎo)體領(lǐng)域方面的先進(jìn)技術(shù)和豐富經(jīng)驗(yàn),是無(wú)線網(wǎng)絡(luò)、汽車、消費(fèi)與工業(yè)市場(chǎng)設(shè)計(jì)制造嵌入式半導(dǎo)體的全球領(lǐng)先供應(yīng)商。創(chuàng)立日期2003年4月1日公司法人董事長(zhǎng)&CEO伊藤達(dá)業(yè)務(wù)范圍單片機(jī)邏輯模擬等的系統(tǒng)LSI、分立半導(dǎo)體元件、SRAM等的存儲(chǔ)器開發(fā)、設(shè)計(jì)、制造、銷售、服務(wù)的提供。集團(tuán)成員44家公司(日本20家,日本以外24家)年度銷售額2006財(cái)年(截止至2007年3月):9526億日元(約83億美元)從業(yè)人員:26000人(全世界20個(gè)國(guó)家、43家公司)瑞薩科技是世界十大半導(dǎo)體芯片供應(yīng)商之一,在很多諸如移動(dòng)通信、汽車電子和PC/AV 等領(lǐng)域獲得了全球最高市場(chǎng)份額。瑞薩集成電路設(shè)計(jì)(北京)有限公司蘇州分公司(RDB-SU)是瑞薩科技全資子公司,2004年1月成立以來(lái),現(xiàn)已擁有150多名優(yōu)秀工程師,承擔(dān)著家電和汽車電子領(lǐng)域MCU的一系列設(shè)計(jì)工作,并在2006年4月開始開發(fā)面向中國(guó)市場(chǎng)的MCU。

(RENESAS)于2003年4月1日—由日立制作所半導(dǎo)體部門和三菱電機(jī)半導(dǎo)體部門合并成立。RENESAS結(jié)合了日立與三菱在半導(dǎo)體領(lǐng)域方面的先進(jìn)技術(shù)和豐富經(jīng)驗(yàn),是無(wú)線網(wǎng)絡(luò)、汽車、消費(fèi)與工業(yè)市場(chǎng)設(shè)計(jì)制造嵌入式半導(dǎo)體的全球領(lǐng)先供應(yīng)商。創(chuàng)立日期2003年4月1日公司法人董事長(zhǎng)&CEO伊藤達(dá)業(yè)務(wù)范圍單片機(jī)邏輯模擬等的系統(tǒng)LSI、分立半導(dǎo)體元件、SRAM等的存儲(chǔ)器開發(fā)、設(shè)計(jì)、制造、銷售、服務(wù)的提供。集團(tuán)成員44家公司(日本20家,日本以外24家)年度銷售額2006財(cái)年(截止至2007年3月):9526億日元(約83億美元)從業(yè)人員:26000人(全世界20個(gè)國(guó)家、43家公司)瑞薩科技是世界十大半導(dǎo)體芯片供應(yīng)商之一,在很多諸如移動(dòng)通信、汽車電子和PC/AV 等領(lǐng)域獲得了全球最高市場(chǎng)份額。瑞薩集成電路設(shè)計(jì)(北京)有限公司蘇州分公司(RDB-SU)是瑞薩科技全資子公司,2004年1月成立以來(lái),現(xiàn)已擁有150多名優(yōu)秀工程師,承擔(dān)著家電和汽車電子領(lǐng)域MCU的一系列設(shè)計(jì)工作,并在2006年4月開始開發(fā)面向中國(guó)市場(chǎng)的MCU。收起

查看更多

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級(jí)嵌入式軟件工程師,業(yè)余維護(hù)公眾號(hào)『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。