15.3.2
軟件設(shè)計(jì)
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”,并進(jìn)入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“key”文件夾,再進(jìn)入“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”項(xiàng)目的FSP配置界面,接下來我們要在這個界面里配置芯片的引腳及其相應(yīng)的功能。
以野火啟明6M5開發(fā)板為例,首先配置引腳連接到ICU的中斷通道。
點(diǎn)擊可查看大圖
然后,依次點(diǎn)擊“Stacks”->“NewStack”->“Input”->“ExternalIRQ”來加入外部中斷模塊,如下圖所示。由于使用兩個按鍵,需要兩個外部中斷,所以這里需要加入2個外部中斷模塊。
點(diǎn)擊可查看大圖
第一個外部中斷模塊設(shè)置的是按鍵1的外部中斷配置,按如下圖所示進(jìn)行設(shè)置:
點(diǎn)擊可查看大圖
第二個外部中斷模塊設(shè)置的是按鍵2的外部中斷配置,按如下圖所示進(jìn)行設(shè)置:
點(diǎn)擊可查看大圖
外部中斷模塊(r_icu)的屬性介紹如下表所示。
表4 External IRQ屬性介紹:
開發(fā)板按鍵引腳分配和中斷號
點(diǎn)擊可查看大圖
配置完成之后可以按下快捷鍵“Ctrl+S”保存,最后點(diǎn)右上角的“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()用于打開一個外部中斷模塊實(shí)例。
2.R_ICU_ExternalIrqEnable()用于使能外部中斷,使能后即可觸發(fā)產(chǎn)生外部中斷。
15.3.2.4
使能FPU
因?yàn)橹暗腇SP配置里面Callback屬性配置的都是同一個中斷回調(diào)函數(shù),因此,我們僅需實(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 閃爍指示程序正在運(yùn)行 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
下載驗(yàn)證
把編譯好的程序下載到開發(fā)板并復(fù)位,按下用戶按鍵1和按鍵2即可分別控制LED2和LED3燈的亮滅。同時LED1燈在每秒鐘翻轉(zhuǎn)一次狀態(tài)。
-
led
+關(guān)注
關(guān)注
243文章
24327瀏覽量
683704 -
軟件設(shè)計(jì)
+關(guān)注
關(guān)注
3文章
65瀏覽量
18204 -
開發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
244瀏覽量
17408 -
外部中斷
+關(guān)注
關(guān)注
1文章
134瀏覽量
16389
原文標(biāo)題:實(shí)驗(yàn):按鍵外部中斷的軟件設(shè)計(jì)——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(40)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
按鍵的外部中斷學(xué)習(xí)
按鍵觸發(fā)外部中斷
介紹幾種按鍵硬件、軟件設(shè)計(jì)方面的技巧
怎么實(shí)現(xiàn)STM32F40x外部中斷的軟件設(shè)計(jì)?
STM32按鍵掃描/按鍵中斷/外部中斷資料下載

瑞薩單片機(jī)之外部中斷實(shí)現(xiàn)按鍵的長按與短按(二)

STC15單片機(jī)實(shí)戰(zhàn)項(xiàng)目軟件開發(fā)第三講 - 按鍵檢測(外部中斷)

外部中斷的按鍵抖動(按鍵消抖)

STM32f10x 外部中斷及中斷分組

STM32F407學(xué)習(xí)記錄---外部中斷實(shí)驗(yàn)

GD32外部中斷(按鍵問題實(shí)現(xiàn))

STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)

STM32 HAL庫 CubeMX教程(四)按鍵外部中斷

評論