7.4
7.4.1
硬件設計
野火啟明6M5開發板的LED電路圖如圖所示。圖中RA6M5芯片的P400、P403、P404引腳分別通過一個2.2 KΩ的限流電阻連接到LED1、LED2、LED3這三個用戶LED燈的陰極,LED燈的陽極連接到3.3V電源。而LED4是電源指示燈,只要開發板通電就會亮。

野火啟明4M2開發板的LED電路圖下圖所示。

野火啟明2L1開發板的LED電路圖下圖所示。

以上所示,三塊開發板的LED電路圖差別都不大,主要差別在于用于控制用戶LED燈的引腳不一樣,這一點在使用不同板子時需要注意一下引腳的配置。
7.4.2
軟件設計
7.4.2.1
新建工程
對于e2studio開發環境:拷貝一份我們之前新建的e2s工程模板“05_Template”,然后將工程文件夾重命名為“08_Register_LED”,最后再將它導入到我們的e2studio工作空間中。
對于Keil開發環境:拷貝一份我們之前新建的Keil工程模板“06_Template”,然后將工程文件夾重命名為“08_Register_LED”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
7.4.2.2
寄存器定義頭文件
當新建工程完成之后,工程里已經自動包含了這個定義寄存器的頭文件,比如:R7FA6M5BH.h頭文件。在這個頭文件里面,已經包含了芯片所有的寄存器定義,包括IOPORT外設的寄存器。
以啟明6M5開發板的RA6M5工程為例,我們在這里列出IOPORT部分寄存器定義(它們存在于寄存器定義頭文件R7FA6M5BH.h中)。
列表1:代碼清單8-1:R7FA6M5BH.h文件中的IOPORT部分寄存器定義
左右滑動查看完整內容
/**
* @brief I/O Ports (R_PORT0)
*/
typedefstruct {/*!< (@ 0x40080000) R_PORT0?
,
→Structure */
union{
union{
__IOMuint32_tPCNTR1;/*!< (@ 0x00000000) Port?
,
→Control Register 1 */
struct{
__IOMuint32_tPDR :16;/*!< [15..0] Pmn?
,
→Direction */
__IOMuint32_tPODR :16;/*!< [31..16] Pmn?
,
→Output Data */
} PCNTR1_b;
} ;
struct{
union{
__IOMuint16_tPODR;/*!< (@ 0x00000000)?
,
→Output data register */
/* ... 代碼過長省略 ... */
} ;
union{
__IOMuint16_tPDR;/*!< (@ 0x00000002)?
,
→Data direction register */
/* ... 代碼過長省略 ... */
} ;
};
};
union{
union{
__IMuint32_tPCNTR2;/*!< (@ 0x00000004) Port?
,
→Control Register 2 */
struct{
__IMuint32_tPIDR :16;/*!< [15..0] Pmn Input?
__IM uint32_t EIDR : 16; /*!< [31..16] Pmn Event?
,
→Input Data */
} PCNTR2_b;
} ;
struct{
union{
__IMuint16_tEIDR;/*!< (@ 0x00000004)?
,
→Event input data register */
/* ... 代碼過長省略 ... */
} ;
union{
__IMuint16_tPIDR;/*!< (@ 0x00000006)?
,
→Input data register */
/* ... 代碼過長省略 ... */
} ;
};
};
union{
union{
__OMuint32_tPCNTR3;/*!< (@ 0x00000008) Port?
,
→Control Register 3 */
struct{
__OMuint32_tPOSR :16;/*!< [15..0] Pmn Output?
,
→Set */
__OMuint32_tPORR :16;/*!< [31..16] Pmn?
,
→Output Reset */
} PCNTR3_b;
} ;
struct{
union{
__OMuint16_tPORR;/*!< (@ 0x00000008)?
,
→Output set register */
/* ... 代碼過長省略 ... */
} ;
union{
__OMuint16_tPOSR;/*!< (@ 0x0000000A)?
,
→Output reset register */
/* ... 代碼過長省略 ... */
} ;
};
};
union{
union{
__IOMuint32_tPCNTR4;/*!< (@ 0x0000000C) Port?
,
→Control Register 4 */
struct{
__IOMuint32_tEOSR :16;/*!< [15..0] Pmn Event?
,
→Output Set */
__IOMuint32_tEORR :16;/*!< [31..16] Pmn Event?
,
→Output Reset */
} PCNTR4_b;
} ;
struct{
union{
__IOMuint16_tEORR;/*!< (@ 0x0000000C)?
,
→Event output set register */
/* ... 代碼過長省略 ... */
} ;
union{
__IOMuint16_tEOSR;/*!< (@ 0x0000000E)?
,
→Event output reset register */
/* ... 代碼過長省略 ... */
} ;
};
};
} R_PORT0_Type;/*!< Size = 16 (0x10) ?
,
→ */
/**
* @brief I/O Ports-PFS (R_PFS)
*/
typedefstruct {/*!< (@ 0x40080800) R_PFS?
,
→Structure */
__IOM R_PFS_PORT_Type PORT[15];/*!< (@ 0x00000000) Port?
,
→[0..14] */
} R_PFS_Type;/*!< Size = 960 (0x3c0) ?
,
→ */
/**
* @brief I/O Ports-MISC (R_PMISC)
*/
typedefstruct {/*!< (@ 0x40080D00) R_PMISC?
,
→Structure */
union{
__IOMuint8_tPFENET;/*!< (@ 0x00000000)?
,
→Ethernet Control Register */
/* ... 代碼過長省略 ... */
} ;
__IMuint8_tRESERVED[2];
union{
__IOMuint8_tPWPR;/*!< (@ 0x00000003) Write-
,
→Protect Register */
/* ... 代碼過長省略 ... */
} ;
__IMuint8_tRESERVED1;
union{
__IOMuint8_tPWPRS;/*!< (@ 0x00000005) Write-
,
→Protect Register for Secure */
/* ... 代碼過長省略 ... */
} ;
__IMuint16_tRESERVED2[5];
__IOM R_PMISC_PMSAR_Type PMSAR[12];/*!< (@ 0x00000010) Port?
,
→Security Attribution Register */
} R_PMISC_Type;/*!< Size = 40 (0x28) ?
,
→ */
/** @addtogroup Device_Peripheral_peripheralAddr
* @{ 外設首地址
*/
/** @addtogroup Device_Peripheral_declaration
* @{ 外設寄存器聲明(定義結構體指針,指向 IOPORT 寄存器首地址)
*/
,
→BASE)
,
→BASE)
,
→BASE)
,
→BASE)
,
→BASE)
7.4.2.3
hal_entry入口函數
一般來說,接下來我們應該在main函數里編寫我們的程序,但是使用FSP庫卻不一樣,在沒有使用RTOS的情況下,它規定以名為hal_entry的函數作為用戶應用程序的入口,因此我們應該在hal_entry入口函數下編寫我們的代碼。
實際上,當使用RTOS時,程序是從main函數開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數main函數調用了hal_entry函數。我們新建的工程是沒有選用RTOS的,因此,用戶程序是從hal_entry函數開始執行。我們打開“srchal_entry.c”文件,在hal_entry函數里面編寫我們的代碼。
以啟明6M5開發板為例,RA6M5工程的hal_entry函數代碼如下所示。
注解
啟明4M2開發板和啟明2L1開發板的用戶可直接打開配套的“08_Register_LED”例程查看該代碼,限于篇幅,不在本章中貼出。
列表2:代碼清單8-2:hal_entry.c文件
左右滑動查看完整內容
voidhal_entry(void)
{
/*TODO:add your own code here */
/* 取消寫保護 */
R_PMISC->PWPR =0;///< Clear BOWI bit -?
,
→writing to PFSWE bit enabled
R_PMISC->PWPR =1U<< BSP_IO_PWPR_PFSWE_OFFSET;?///< Set PFSWE bit -?
,
→writing to PFSregisterenabled
/* LED1:配置引腳 P400 對應的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_00>>8].PIN[BSP_IO_PORT_04_PIN_00 &?
,
→0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/* LED2:配置引腳 P403 對應的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_03>>8].PIN[BSP_IO_PORT_04_PIN_03 &?
,
→0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/* LED3:配置引腳 P404 對應的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_04>>8].PIN[BSP_IO_PORT_04_PIN_04 &?
,
→0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/** 此時 3 個 LED 燈的引腳默認輸出的是低電平
* 所以 3 個 LED 燈都會默認亮起來
* 我們在 while 循環里讓 LED1 閃爍:每秒鐘翻轉一次狀態
*/
while(1)
{
/* 翻轉 LED 燈:LED1 */
//R_PORT4->PODR |= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF);
//R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
//R_PORT4->PODR &= (uint16_t)~(1 << (BSP_IO_PORT_04_PIN_00 & 0xFF));
//R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
/* 或者也可以這樣用位異或操作來翻轉 LED1 */
R_PORT4->PODR ^=1<<(BSP_IO_PORT_04_PIN_00 &?0xFF);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
//這后面的代碼無需理會
/* Enter non-secure code */
R_BSP_NonSecureEnter();
}
7.4.3
下載驗證
編寫好上述代碼,然后將程序編譯并下載到開發板之后,按下復位按鍵來復位開發板,可以觀察到開發板上面除了電源指示燈之外的3個LED燈當中有兩個燈常亮,還有一個燈在緩慢閃爍。
閃爍著的LED燈為LED1,它每秒鐘(1000毫秒)便改變一次亮滅的狀態。
-
led
+關注
關注
242文章
23731瀏覽量
671261 -
mcu
+關注
關注
146文章
17867瀏覽量
360971 -
寄存器
+關注
關注
31文章
5424瀏覽量
123483 -
瑞薩
+關注
關注
36文章
22372瀏覽量
87785 -
FSP
+關注
關注
0文章
43瀏覽量
7360
原文標題:實驗:使用寄存器點亮LED燈——瑞薩RA系列FSP庫開發實戰指南(19)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
瑞薩電子RA系列微控制器的可擴展性強的配置軟件包 (FSP)安裝下載與使用指南
使用寄存器點亮LED燈

瑞薩RA8系列教程 | 基于 Keil 開發 RA8單片機

如何用C語言操作寄存器——瑞薩RA系列FSP庫開發實戰指南(10)

瑞薩RA系列MCU FSP庫開發實戰指南(09)存儲器映射

瑞薩RA8快速上手指南:Cortex-M85內核瑞薩RA8開發環境搭建 并點亮一個LED

評論