軟件設(shè)計(jì)
15.3.2.1
新建工程
對于e2 studio開發(fā)環(huán)境:拷貝一份我們之前的e2s 工程“11_GPIO_LED”,然后將工程文件夾重命名為“16_ICU_External_IRQ”,最后再將它導(dǎo)入到我們的e2studio工作空間中。
對于Keil開發(fā)環(huán)境:拷貝一份我們之前的Keil工程“11_GPIO_LED”,然后將工程文件夾重命名為 “16_ICU_External_IRQ”,并進(jìn)入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“key”文件夾,再進(jìn)入“key”文件夾里面新建源文件和頭文件:“bsp_key_irq.c”和 “bsp_key_irq.h”。工程文件結(jié)構(gòu)如下。
列表1:文件結(jié)構(gòu)
16_ICU_External_IRQ├─ ......└─ src├─ led│ ├─ bsp_led.c│ └─ bsp_led.h├─ key│ ├─ bsp_key_irq.c│ └─ bsp_key_irq.h└─ hal_entry.c
15.3.2.2
FSP配置
首先打開“16_ICU_External_IRQ”項(xiàng)目的FSP配置界面,接下來我們要在這個(gè)界面里配置芯片的引腳及其相應(yīng)的功能。
以野火啟明6M5開發(fā)板為例,首先配置引腳連接到ICU的中斷通道。

然后,依次點(diǎn)擊“Stacks”->“New Stack”-> “Input”->“External IRQ”來加入外部中斷模塊,如下圖所示。由于使用兩個(gè)按鍵,需要兩個(gè)外部中斷,所以這里需要加入2個(gè)外部中斷模塊。

第一個(gè)外部中斷模塊設(shè)置的是按鍵1的外部中斷配置,按如下圖所示進(jìn)行設(shè)置:

第二個(gè)外部中斷模塊設(shè)置的是按鍵2的外部中斷配置,按如下圖所示進(jìn)行設(shè)置:

外部中斷模塊(r_icu)的屬性介紹如下表所示。
列表4:External IRQ屬性介紹

配置完成之后可以按下快捷鍵“Ctrl+S”保存,最后點(diǎn)右上角的“Generate Project Content”按鈕,讓軟件自動生成配置代碼即可。
15.3.2.3
按鍵外部中斷初始化函數(shù)
列表2:代碼清單16_1:外部中斷初始化函數(shù)
/* KEY 外部中斷初始化函數(shù) */voidKey_IRQ_Init(void){fsp_err_t err = FSP_SUCCESS;/* Open ICU module */err = R_ICU_ExternalIrqOpen(&g_external_irq9_ctrl, &g_external_irq9_cfg);err = R_ICU_ExternalIrqOpen(&g_external_irq10_ctrl, &g_external_irq10_,→cfg);/* 允許中斷 */err = R_ICU_ExternalIrqEnable(&g_external_irq9_ctrl);err = R_ICU_ExternalIrqEnable(&g_external_irq10_ctrl);}
R_ICU_ExternalIrqOpen()用于打開一個(gè)外部中斷模塊實(shí)例。
R_ICU_ExternalIrqEnable()用于使能外部中斷,使能后即可觸發(fā)產(chǎn)生外部中斷。
15.3.2.4
按鍵中斷回調(diào)函數(shù)
因?yàn)橹暗腇SP配置里面Callback屬性配置的都是同一個(gè)中斷回調(diào)函數(shù),因此,我們僅需實(shí)現(xiàn)一個(gè)中斷回調(diào)函數(shù)即可。當(dāng)然,中斷回調(diào)函數(shù)也可設(shè)置為不同的兩個(gè)函數(shù),由用戶定義。
兩個(gè)按鍵共用key_external_irq_callback中斷回調(diào)函數(shù),并通過p_args->channel參數(shù)來判斷是哪個(gè)中斷通道產(chǎn)生了中斷從而判斷是哪個(gè)按鍵按下,該函數(shù)如下:
列表3:代碼清單16_2:按鍵中斷回調(diào)函數(shù)
/* 按鍵按下標(biāo)志 */volatilebool key1_sw2_press = false;volatilebool key2_sw3_press = false;/* 按鍵中斷回調(diào)函數(shù) */voidkey_external_irq_callback(external_irq_callback_args_t *p_args){/* 判斷中斷通道 */if (9 == p_args->channel){key1_sw2_press = true; // 按鍵 KEY1_SW2 按下}elseif (10 == p_args->channel){key2_sw3_press = true; // 按鍵 KEY2_SW3 按下}}
15.3.2.5
hal_entry入口函數(shù)
hal_entry入口函數(shù)如下所示:
列表4:代碼清單16_3:hal_entry入口函數(shù)
/* 用戶頭文件包含 */externvolatilebool key1_sw2_press;externvolatilebool key2_sw3_press;voidhal_entry(void){/* TODO: add your own code here */LED_Init(); // LED 初始化Key_IRQ_Init(); // KEY 外部中斷初始化while(1){/* 判斷按鍵 KEY1_SW2 是否被按下 */if (key1_sw2_press){key1_sw2_press = false; //標(biāo)志位清零LED2_TOGGLE; //LED2 翻轉(zhuǎn)}/* 判斷按鍵 KEY2_SW3 是否被按下 */if (key2_sw3_press){key2_sw3_press = false; //標(biāo)志位清零LED3_TOGGLE; //LED3 翻轉(zhuǎn)}// LED1 閃爍指示程序正在運(yùn)行LED1_TOGGLE;R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時(shí) 1 秒// 按鍵被按下觸發(fā)中斷后,在主循環(huán)中 LED2 或 LED3 最長會被推遲 1 秒翻轉(zhuǎn)}/* Enter non-secure code */R_BSP_NonSecureEnter();}
下載驗(yàn)證
把編譯好的程序下載到開發(fā)板并復(fù)位,按下用戶按鍵1和按鍵2即可分別控制LED2和LED3燈的亮滅。同時(shí)LED1燈在每秒鐘翻轉(zhuǎn)一次狀態(tài)。

如您在使用瑞薩MCU/MPU產(chǎn)品中有任何問題,可識別下方二維碼或復(fù)制網(wǎng)址到瀏覽器中打開,進(jìn)入瑞薩技術(shù)論壇尋找答案或獲取在線技術(shù)支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續(xù)
推薦閱讀
RA系列MCU中斷應(yīng)用概覽——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(35)
NVIC中斷配置固件庫&RA6M5——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(36)
外部引腳中斷——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(37)

