1. 準(zhǔn)備工作
硬件準(zhǔn)備
首先需要準(zhǔn)備一個開發(fā)板,這里我準(zhǔn)備的是STM32L4的開發(fā)板(BearPi):
軟件準(zhǔn)備
需要安裝好Keil - MDK及芯片對應(yīng)的包,以便編譯和下載生成的代碼。
Keil MDK和串口助手Serial Port Utility 的安裝包都可以在文末關(guān)注公眾號獲取,回復(fù)關(guān)鍵字獲取相應(yīng)的安裝包:
選擇芯片型號
打開STM32CubeMX,打開MCU選擇器:
搜索并選中芯片STM32L431RCT6:
配置時鐘源
如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
如果使用默認(rèn)內(nèi)部時鐘(HSI),這一步可以略過;
這里我都使用外部時鐘:
配置LED的GPIO引腳
查看小熊派開發(fā)板的原理圖,如下:
所以接下來我們選擇配置PC13引腳:
設(shè)置用戶標(biāo)簽為LED:
配置GPIO引腳為外部中斷引腳
在原理圖上如下:
所以接下來我們選擇配置PB2引腳和PB3引腳為外部中斷觸發(fā)引腳:
因為沒有設(shè)置硬件上拉,所以我們配置開啟上拉電阻,并設(shè)置用戶標(biāo)簽為KEY1和KEY2,接下來是最重要的一步:
開啟下降沿觸發(fā)中斷:即在按下按鍵時電平由高變?yōu)榈蜁r觸發(fā)
開啟上升沿觸發(fā)中斷:即在按下按鍵后松開時電平由低變?yōu)楦邥r觸發(fā)
開啟下降沿上升沿都觸發(fā)中斷:即在按下時觸發(fā),松開時再次觸發(fā)
這里我選擇開啟下降沿觸發(fā)中斷:
配置NVIC設(shè)置中斷優(yōu)先級
知識小卡片 —— NVIC
NVIC全稱Nested vectored interrupt controller,即嵌套向量中斷控制器,用來決定中斷的優(yōu)先級。
NVIC在 ARM Conrtex-M 內(nèi)核中,用一個 8 位的寄存器來配置,總共可以配置 2 8 = 256 2^8=256 28=256級中斷,但是 ST 公司在生產(chǎn) STM32 的時候,發(fā)現(xiàn)一個小小的單片機(jī)根本用不了這么多,純屬浪費(fèi),所以將該寄存器的低 4 位全部置0,只使用高 4 位來配置,這樣一來 STM32 就只有 2 4 = 16 2^4=16 24=16級中斷啦。
簡化為16級中斷后,ST發(fā)現(xiàn) STM32 內(nèi)部這么豐富的外設(shè),還是不方便配置,干脆人工給這4位來個分組,劃分出了5個分組:
優(yōu)先級分組 | 搶占優(yōu)先級占的位數(shù) | 子優(yōu)先級占的位數(shù) |
---|---|---|
NVIC_PriorityGroup_0 | 0 bit | 4 bit |
NVIC_PriorityGroup_1 | 1 bit | 3 bit |
NVIC_PriorityGroup_2 | 2 bit | 2 bit |
NVIC_PriorityGroup_3 | 3 bit | 1 bit |
NVIC_PriorityGroup_4 | 4 bit | 0 bit |
再次強(qiáng)調(diào)一下,這5種中斷分組規(guī)則是人為的,用哪種規(guī)則,之后設(shè)置具體的優(yōu)先級時對應(yīng)就行,STM32默認(rèn)使用的規(guī)則是 NVIC_PriorityGroup_0 。
STM32 的CPU判斷優(yōu)先級的方法如下:
先判斷搶占優(yōu)先級,數(shù)字越小,優(yōu)先級越高;
若搶占優(yōu)先級相同,判斷子優(yōu)先級,同樣,數(shù)字越小,優(yōu)先級越高;
知識小卡片結(jié)束啦~ 對NVIC有沒有了解呢?
接下來在STM32CubeMX中配置中斷優(yōu)先級:
配置優(yōu)先級分組
這里我配置使用中斷優(yōu)先級分組規(guī)則 NVIC_PriorityGroup_2:
配置具體的優(yōu)先級大小
根據(jù)中斷優(yōu)先級分組規(guī)則 NVIC_PriorityGroup_2來設(shè)置具體的優(yōu)先級大小:
配置時鐘樹
STM32L4的最高主頻到80M,所以配置PLL,最后使HCLK = 80Mhz即可:
生成工程設(shè)置
代碼生成設(shè)置
最后設(shè)置生成獨(dú)立的初始化文件:
生成代碼
點擊GENERATE CODE即可生成MDK-V5工程:
STM32 HAL庫中斷處理機(jī)制
先打開stm32l4xx_it.c文件:
可以看到其中處理EXIT2和EXIT3中斷都調(diào)用了同一個函數(shù),但是EXIT2和EXIT3向該函數(shù)傳入的參數(shù)不同:
HAL_GPIO_EXTI_IRQHandler();1.
那么,HAL庫對于中斷是如何處理的呢?我們打開 stm32l4xx_hal_gpio.c 文件,看一下該函數(shù)的原型,一探究竟:
/**
* @brief Handle EXTI interrupt request.
* @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
* @retval None
*/
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
可以看到,在該函數(shù)中首先讀取了一下中斷寄存器,確認(rèn)該中斷是否發(fā)生,確認(rèn)之后又調(diào)用了一個函數(shù),并將接收到的參數(shù) GPIO_Pin 繼續(xù)傳給該函數(shù):
HAL_GPIO_EXTI_Callback(GPIO_Pin);1.
該函數(shù)稱為EXIT中斷的回調(diào)函數(shù),用來處理所有發(fā)生的EXIT中斷事件。
那么,這個函數(shù)又干了什么呢?接著探索哈哈哈~
同樣在stm32l4xx_hal_gpio.c文件中找到該函數(shù)的原型:
/**
* @brief EXTI line detection callback.
* @param GPIO_Pin: Specifies the port pin connected to corresponding EXTI line.
* @retval None
*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
哈哈哈,這下是不是非常清楚了~
該回調(diào)函數(shù)使用__weak進(jìn)行了弱定義,所以用戶可以再次定義該函數(shù),并且這個note寫的非常清楚:
這個函數(shù)不應(yīng)該被改變,如果需要使用回調(diào)函數(shù),請重新在用戶文件中實現(xiàn)該函數(shù)。
自己實現(xiàn)EXIT中斷處理回調(diào)函數(shù)
這個函數(shù)放在哪都行,為了方便,我們放在gpio.c的最后。
實現(xiàn)的基本思想是:
因為所有的EXIT中斷都會調(diào)用該函數(shù),所以首先判斷具體的中斷事件;
對該中斷事件進(jìn)行處理
實現(xiàn)代碼如下:
/* USER CODE BEGIN 2 */
/**
* @brief EXIT中斷回調(diào)函數(shù)
* @param GPIO_Pin —— 觸發(fā)中斷的引腳
* @retval none
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* 判斷哪個引腳觸發(fā)了中斷 */
switch(GPIO_Pin)
{
case GPIO_PIN_2:
/* 處理GPIO2發(fā)生的中斷 */
//點亮LED
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
break;
case GPIO_PIN_3:
/* 處理GPIO3發(fā)生的中斷 */
//熄滅LED
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
}
/* USER CODE END 2 */
然后編譯整個工程:
最后進(jìn)行下載設(shè)置:
最后點擊下載即可:
實驗現(xiàn)象如下:
至此,我們已經(jīng)學(xué)會了如何配置NVIC使用外部中斷檢測按鍵,并了解了NVIC和HAL庫中斷處理機(jī)制的一些基本知識,下一節(jié)講述如何配置USART以及實現(xiàn)printf函數(shù)。
上一篇:【STM32Cube_22】使用ADC讀取電壓值
下一篇:STM32CubeMX生成F1的工程中提示找不到 __HAL_TIM_SetCompare 問題
推薦閱讀
史海拾趣
面對日益激烈的市場競爭,Astro Industries Inc意識到成本控制的重要性。于是,公司開始著手進(jìn)行供應(yīng)鏈的整合與優(yōu)化。通過與優(yōu)質(zhì)供應(yīng)商建立長期合作關(guān)系,公司確保了原材料的穩(wěn)定供應(yīng)和質(zhì)量可控。同時,公司還引入了先進(jìn)的生產(chǎn)管理系統(tǒng),提高了生產(chǎn)效率,降低了生產(chǎn)成本。這些措施使得Astro Industries Inc在保持產(chǎn)品質(zhì)量的同時,也具備了更強(qiáng)的市場競爭力。
隨著國內(nèi)市場的飽和,Astro Industries Inc開始將目光投向海外市場。公司制定了詳細(xì)的國際化戰(zhàn)略,通過參加國際展覽、建立海外銷售網(wǎng)絡(luò)等方式,積極開拓國際市場。同時,公司還針對不同國家和地區(qū)的市場需求,推出了定制化的產(chǎn)品,滿足了不同客戶的特殊需求。這些舉措使得Astro Industries Inc在國際市場上也取得了不俗的成績。
國博電子的前身可以追溯到2000年成立的上海華信集成電路有限公司,起初專注于射頻芯片的研發(fā)與生產(chǎn)。隨著技術(shù)的積累和市場的拓展,公司逐步從單一的射頻芯片企業(yè)成長為覆蓋射頻芯片、模塊、組件的完整產(chǎn)業(yè)平臺。這一跨越不僅體現(xiàn)了公司在技術(shù)上的深厚積累,也反映了其對市場需求的敏銳洞察和快速響應(yīng)能力。通過不斷的技術(shù)創(chuàng)新和產(chǎn)品研發(fā),國博電子成功在無線通信、移動通信等領(lǐng)域占據(jù)了一席之地。
在數(shù)字化轉(zhuǎn)型的大潮中,一家名為Focus的電子產(chǎn)品制造商(虛構(gòu))意識到傳統(tǒng)制造模式的局限性,決定實施全面的數(shù)字化轉(zhuǎn)型戰(zhàn)略。公司首先引入了先進(jìn)的ERP系統(tǒng)和智能制造技術(shù),實現(xiàn)了生產(chǎn)流程的自動化和智能化。同時,為了快速擴(kuò)大市場份額和增強(qiáng)技術(shù)實力,F(xiàn)ocus積極尋求并購機(jī)會,先后收購了多家在物聯(lián)網(wǎng)、人工智能等領(lǐng)域具有核心競爭力的初創(chuàng)企業(yè)。通過資源整合和優(yōu)勢互補(bǔ),F(xiàn)ocus迅速成長為行業(yè)內(nèi)的領(lǐng)軍企業(yè)。
隨著公司實力的增強(qiáng),Cretex開始將目光投向國際市場。他們積極參與國際電子展會,與全球各地的合作伙伴建立聯(lián)系。通過引進(jìn)國外先進(jìn)的技術(shù)和管理經(jīng)驗,Cretex的產(chǎn)品質(zhì)量和服務(wù)水平得到了進(jìn)一步提升。同時,公司還針對不同國家和地區(qū)的市場需求,推出定制化的電子產(chǎn)品,贏得了更多客戶的青睞。
隨著產(chǎn)品技術(shù)的成熟,Aromat Corp開始積極拓展市場。公司加大了對營銷和宣傳的投入,通過參加行業(yè)展會、舉辦產(chǎn)品發(fā)布會等方式提升品牌知名度。同時,Aromat Corp還積極與合作伙伴建立戰(zhàn)略合作關(guān)系,共同開拓市場,進(jìn)一步擴(kuò)大了公司的市場份額。
本信息來自合作QQ群:AVR單片機(jī)學(xué)習(xí)與交流群(17727270) 群管理員在壇子里的ID:銅河 100M、4通道,2G采樣,25k記錄 據(jù)說,這個雖然是100M,但實測是200M… 查看全部問答∨ |
|
程序在執(zhí)行掃描時老是在一個地方進(jìn)行判斷該怎么辦 大家好,我的程序(不是自己寫的)在執(zhí)行判斷掃描時老是停留在一個地方,怎么辦? 程序段如下: main: nop nop nop mov wdt_contr,#00111110B ;喂狗   ...… 查看全部問答∨ |
2440 CAMERA CODE DMA地址在CONFIG.BIB中設(shè)置的疑惑? 我的CONFIG.BIB一段如下: MEMORY ;NK NK 8C200000 01D00000 RAMIMAGE ;RAM RAM 8E800000 0 ...… 查看全部問答∨ |
我現(xiàn)在用一個運(yùn)算放大器調(diào)整單片機(jī)的采樣信號.放大器的型號為LF412,資料里電源連接方式是雙電源供電,如接+/-15v,由于我現(xiàn)在的輸入信號只有正的.我把負(fù)電源接地,正電源接+15v,請問這樣做行嗎?… 查看全部問答∨ |
這個程序不是原創(chuàng)的,但是我修改了一點點,理解起來輕松了很多。大家覺得怎樣,如果有較好的不妨拿出來分享討論一下吧 ! & ...… 查看全部問答∨ |
打算通過24V直流 串個10K電阻 然后再通過個5V穩(wěn)壓管接地,最后在穩(wěn)壓管2端取得一個接近5V的穩(wěn)定電壓,可行否? 穩(wěn)壓管要如何選擇其參數(shù),請賜教… 查看全部問答∨ |
06.23【每周討論】我們年輕,富有正義。對于社會中的不文明現(xiàn)象該怎樣看待呢? 06.23【每周討論】年輕的我們,富有正義、滿懷激情。對于社會中的不文明現(xiàn)象該怎樣看待呢?我們年輕人,富有正義、滿懷激情,眼里容不下一粒沙。社會中那些不文明的現(xiàn)象經(jīng)常在我們的周圍發(fā)生,卻讓我們感到無可奈何。若為此感到懊惱的話,那你永遠(yuǎn) ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 組團(tuán)掘金1800億植介入醫(yī)械市場 注冊2025Medtec享門票限免及精準(zhǔn)商機(jī)對接
- 北斗規(guī)?;瘧?yīng)用賦能大理州智慧城市建設(shè)并獲兩岸業(yè)者與專家廣泛贊譽(yù)
- 超低噪聲開關(guān)穩(wěn)壓器在噪聲敏感型射頻應(yīng)用中的優(yōu)勢
- 萊迪思更新其高I/O密度和安全器件,進(jìn)一步拓展低功耗、小尺寸FPGA產(chǎn)品組合
- 無人機(jī)系統(tǒng)方案寶典:從選型到落地
- 納芯微:以應(yīng)用需求為內(nèi)核,驅(qū)動壓力傳感器不斷創(chuàng)新
- 中間繼電器有哪些選型原則?中間繼電器動態(tài)負(fù)載、短時負(fù)載都學(xué)過了嗎
- e絡(luò)盟社區(qū)攜手 Würth Elektronik 發(fā)起全球 LED 設(shè)計挑戰(zhàn)賽
- 開關(guān)量模塊如何控制中間繼電器?中間繼電器故障有哪些
- 中間繼電器用萬用表怎么測好壞?光電開關(guān)如何控制中間繼電器
- TI 高精度實驗室信號鏈精品課大作戰(zhàn)——你學(xué)習(xí)我送禮!
- TI 嵌入式處理器最新產(chǎn)品發(fā)布會 全程在線直播 4月16日精彩為您呈現(xiàn)!預(yù)報名、看直播、享好禮
- 【TI 嵌入式研討會集錦】小站添加了很多新內(nèi)容,歡迎提貨!
- 《帶您了解ADI數(shù)字健康生物傳感器系列》有獎直播
- 解鎖【W(wǎng)5500-EVB-Pico】,探秘以太網(wǎng)底層,得捷Follow me第4期來襲!
- 免費(fèi)下載Vishay最新汽車解決方案
- 答題贏京東卡|《安森美和安富利物聯(lián)網(wǎng)創(chuàng)新設(shè)計大賽作品集》
- 有獎?wù){(diào)查:ST MEMS 傳感器論壇用戶問卷調(diào)查,參與有驚喜
- 答題贏好禮:ADI MEMS工業(yè)監(jiān)測助力機(jī)器大健康發(fā)展
- Cannot open include file: 'icmpapi.h': No such file or directory
- 為什么我的硬盤在ce啟動后不能看見?
- 編程發(fā)短信給手機(jī),短信中一直附加著一段亂碼
- 本周三有獎直播: 5G一致性測試和設(shè)備驗收測試
- DriverStudio開發(fā)IRP_MJ_DEVICE_CONTROL的routine時設(shè)置OutBuffer的問題
- GPRS貓發(fā)送MMS
- TIVA Launchpad 七:顯示漢字
- 【sensorTile 器件詳解】LSM6DSM 加速度Acc+陀螺儀Gyro (第二篇)
- 單片機(jī)編程問題請教;
- 廣告專區(qū)太瘋狂。。。