15.3.2
軟件設(shè)計
15.3.2.1
新建工程
對于e2studio開發(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”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“key”文件夾,再進入“key”文件夾里面新建源文件和頭文件:“bsp_key_irq.c”和“bsp_key_irq.h”。工程文件結(jié)構(gòu)如下。
列表1:文件結(jié)構(gòu)
左右滑動查看完整內(nèi)容
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”項目的FSP配置界面,接下來我們要在這個界面里配置芯片的引腳及其相應(yīng)的功能。
以野火啟明6M5開發(fā)板為例,首先配置引腳連接到ICU的中斷通道。

點擊可查看大圖
然后,依次點擊“Stacks”->“NewStack”->“Input”->“ExternalIRQ”來加入外部中斷模塊,如下圖所示。由于使用兩個按鍵,需要兩個外部中斷,所以這里需要加入2個外部中斷模塊。

點擊可查看大圖
第一個外部中斷模塊設(shè)置的是按鍵1的外部中斷配置,按如下圖所示進行設(shè)置:

點擊可查看大圖
第二個外部中斷模塊設(shè)置的是按鍵2的外部中斷配置,按如下圖所示進行設(shè)置:

點擊可查看大圖
外部中斷模塊(r_icu)的屬性介紹如下表所示。
表4 External IRQ屬性介紹:
開發(fā)板按鍵引腳分配和中斷號

點擊可查看大圖
配置完成之后可以按下快捷鍵“Ctrl+S”保存,最后點右上角的“GenerateProjectContent”按鈕,讓軟件自動生成配置代碼即可。
15.3.2.3
按鍵外部中斷初始化函數(shù)
列表2 代碼清單16_1:
外部中斷初始化函數(shù):文件結(jié)構(gòu)
左右滑動查看完整內(nèi)容
/* 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()用于打開一個外部中斷模塊實例。
2.R_ICU_ExternalIrqEnable()用于使能外部中斷,使能后即可觸發(fā)產(chǎn)生外部中斷。
15.3.2.4
使能FPU
因為之前的FSP配置里面Callback屬性配置的都是同一個中斷回調(diào)函數(shù),因此,我們僅需實現(xiàn)一個中斷回調(diào)函數(shù)即可。當(dāng)然,中斷回調(diào)函數(shù)也可設(shè)置為不同的兩個函數(shù),由用戶定義。
兩個按鍵共用key_external_irq_callback中斷回調(diào)函數(shù),并通過p_args->channel參數(shù)來判斷是哪個中斷通道產(chǎn)生了中斷從而判斷是哪個按鍵按下,該函數(shù)如下:
列表3 代碼清單16_2:按鍵中斷回調(diào)函數(shù)
左右滑動查看完整內(nèi)容
/* 按鍵按下標(biāo)志 */
volatilebool key1_sw2_press =false;
volatileboolkey2_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ù)
自由滑動查看完整內(nèi)容
/*用戶頭文件包含*/
#include"led/bsp_led.h"
#include"key/bsp_key_irq.h"
externvolatileboolkey1_sw2_press;
externvolatileboolkey2_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 閃爍指示程序正在運行
LED1_TOGGLE;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時 1 秒
// 按鍵被按下觸發(fā)中斷后,在主循環(huán)中 LED2 或 LED3 最長會被推遲 1 秒翻轉(zhuǎn)
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
15.3.3
下載驗證
把編譯好的程序下載到開發(fā)板并復(fù)位,按下用戶按鍵1和按鍵2即可分別控制LED2和LED3燈的亮滅。同時LED1燈在每秒鐘翻轉(zhuǎn)一次狀態(tài)。
-
led
+關(guān)注
關(guān)注
243文章
24533瀏覽量
689370 -
軟件設(shè)計
+關(guān)注
關(guān)注
3文章
65瀏覽量
18264 -
開發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
265瀏覽量
17585 -
外部中斷
+關(guān)注
關(guān)注
1文章
135瀏覽量
16519
原文標(biāo)題:實驗:按鍵外部中斷的軟件設(shè)計——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(40)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
按鍵的外部中斷學(xué)習(xí)
按鍵觸發(fā)外部中斷
介紹幾種按鍵硬件、軟件設(shè)計方面的技巧
怎么實現(xiàn)STM32F40x外部中斷的軟件設(shè)計?
STM32按鍵掃描/按鍵中斷/外部中斷資料下載
STC15單片機實戰(zhàn)項目軟件開發(fā)第三講 - 按鍵檢測(外部中斷)
外部中斷的按鍵抖動(按鍵消抖)
STM32f10x 外部中斷及中斷分組
STM32F407學(xué)習(xí)記錄---外部中斷實驗
GD32外部中斷(按鍵問題實現(xiàn))
STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)
STM32 HAL庫 CubeMX教程(四)按鍵外部中斷
按鍵外部中斷的軟件設(shè)計
評論