小實驗--震動點燈

1.實驗目的

使用中斷的方法,震動傳感器檢測到震動時,LED1點亮2秒,之后熄滅。

2.硬件清單

  • 震動傳感器
  • STM32開發板
  • ST-Link

3.硬件連接

STM32震動傳感器
PA4DO
3V3VCC
GNDGND

4.代碼

4.1exti.c

#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"uint8_t vibrate_flag = FALSE;void exti_init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef gpio_initstruct;//初始化GPIOgpio_initstruct.Mode =GPIO_MODE_IT_FALLING;gpio_initstruct.Pin =GPIO_PIN_4;gpio_initstruct.Pull =GPIO_PULLUP;gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &gpio_initstruct);//設置中斷線HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);HAL_NVIC_EnableIRQ(EXTI4_IRQn);}void EXTI4_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_4){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET){vibrate_flag = TRUE;}}
}uint8_t vibrate_flag_get(void)
{uint8_t temp = vibrate_flag;vibrate_flag = FALSE;return temp;
}void vibrate_flag_set(uint8_t value)
{vibrate_flag = value;
}

4.2main.c

#include "sys.h"
#include "uart1.h"
#include "delay.h"
#include "exti.h"
#include "led.h"int main(void)
{HAL_Init();                         /* 初始化HAL庫 */stm32_clock_init(RCC_PLL_MUL9); /* 設置時鐘, 72Mhz */led_init();exti_init();while(1){ if(vibrate_flag_get() == TRUE){led1_on();delay_ms(2000);led1_off();vibrate_flag_set(FALSE);}}
}

4.3exti.h

#ifndef __HAL_EXTI_H
#define __HAL_EXTI_H#include "stdint.h"#define TRUE    1
#define FALSE   0void exti_init(void);
uint8_t vibrate_flag_get(void);
void vibrate_flag_set(uint8_t value);#endif

exti_init這個函數就是中斷的相關配置,在之前的文章有講。

因為在中斷函數中最好不要出現延時函數,
所以這里是用了標志的方法,
在大型項目中一般就寫兩個函數uint8_t vibrate_flag_get(void);
和void vibrate_flag_set(uint8_t value);
來分別傳出標志符和修改標志符。

然后我在.h文件中宏定義了兩個符號TRUE和FALSE,使用vibrate_flag變量保存.
分別表示震動模塊的打開和關閉。
但是因為當震動模塊打開后,沒有將vibrate_flag變量復位為FALSE,
這樣就會造成main函數中的if一直成立燈就會一直亮,
所以就使用定義臨時變量temp來將vibrate_flag變量復位為FALSE。

還有一個問題就是當碰一下震動模塊,震動模塊會觸發很多上升沿和下降沿,
導致燈不會亮2秒,會亮很多秒,
所以在延時兩秒后又通過vibrate_flag_set函數將vibrate_flag手動復位為FALSE。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92158.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vcpkg: 一款免費開源的C++包管理器

目錄 1.簡介 2.安裝 3.常用命令 4.與項目集成 5.vcpkg的工作原理 5.1.包索引:ports 系統(定義庫的 “元信息”) 5.2.源碼獲取:從 “地址” 到 “本地緩存” 5.3.編譯構建:按 “triplet” 定制目標 5.4.安裝布…

WinCC通過無線Modbus TCP監控S7-1200/200SMT PLC實例詳解

工業自動化系統中,車間內通常部署多臺PLC設備并需通過中央監控平臺實現集中管控。考慮到工業現場設備間距普遍在數十至數百米范圍,傳統有線以太網雖能保障傳輸速率,但其施工需面臨電纜溝開挖或復雜布線工程,既增加線材采購、人力投…

【AI智能編程】Trae-IDE工具學習

什么是Trae? Trae與 AI 深度集成,提供智能問答、代碼自動補全以及基于 Agent 的 AI 自動編程能力。使用 Trae 開發項目時,你可以與 AI 靈活協作,提升開發效率。提供傳統的 IDE 功能,包括代碼編寫、項目管理、插件管理…

智能駕駛再提速!批量蘇州金龍L4級自動駕駛巴士交付杭州臨平區

近日,由蘇州金龍海格客車研發的“清源”L4級自動駕駛巴士現身杭州市臨平區并投入測試。這是臨平區引進的首批L4級自動駕駛巴士,標志著臨平區智能交通建設邁入新階段。此次投入測試的“清源”小巴采用一級踏步設計,車身延續了海格蔚藍巴士的經…

Spring_事務

在mysql階段的文章中,已經介紹過事務了。本篇文章是對mysql事務的總結和對使用Spring框架來實現事務操作的講解。事務回顧什么是事務事務時一組操作的集合,是一個不可分割的操作。事務會把所有操作作為一個整體,一起向數據庫提交或者撤銷操作…

事務管理介紹

為什么要用事務管理在我們同時操作兩個或更多個數據庫時,可能因為網絡等各方面原因導致中間出現異常。造成像對第一個數據庫的操作成功了,但是對第二個數據庫的操作沒有成功。這樣數據的完整性就被破壞了。事務:是一組操作的集合,…

Android 之 ViewBinding 實現更安全、高效的視圖綁定

??一、配置說明????作用位置??需在模塊級 build.gradle或 build.gradle.kts文件的 android {}塊內添加:android {buildFeatures {viewBinding true // Kotlin DSL 語法} }android {buildFeatures {viewBinding true // Groovy 語法} }??生成規則??為每…

全球首款Java專用AI開發助手實測:一句話生成完整工程代碼——飛算 JavaAI

🌟 嗨,我是Lethehong!🌟🌍 立志在堅不欲說,成功在久不在速🌍🚀 歡迎關注:👍點贊??留言收藏🚀🍀歡迎使用:小智初學計算機…

Shader開發(七)創建第一個Shader項目

在前面的章節中,我們已經了解了Shader的基本概念和渲染管線的工作原理。現在,是時候動手實踐了!本章將帶您一步步創建第一個Shader項目,開啟真正的Shader開發之旅。 為什么選擇openFrameworks? 與其他文章不同&#x…

IAR軟件中測量函數執行時間

通常在調試代碼中需要直到某個函數或者某段代碼的實際執行時間,在IAR中可以直接借助軟件提供的工具來計算代碼執行時間。 第一種方法 進入仿真調試界面,在需要測量的代碼前面打斷點。工具欄中選擇 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字節碼文件(.class)的組成詳解

文章目錄基礎信息常量池字段方法屬性字節碼文件內容說明案例文件基本信息類的基本信息常量池字段信息構造方法實例方法主方法源文件信息字節碼文件由五部分組成,分別是基礎信息、常量池、字段、方法、屬性。案例: public class Main implements Interfa…

C++之vector類的代碼及其邏輯詳解 (下)

1. insert()這個就是在指定位置插入一個元素,首先計算要插入的這個位置和開頭之間的距離,接著判斷那個_finish 有沒有碰到_endofstorage 或者_endofstorage 是不是為0,如果滿足條件,那就進行擴容,然后接著重新計算距離…

【自動化測試】Python Selenium 自動化測試元素定位專業教程

1. 引言:元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自動化測試的基礎,所有用戶交互操作(如點擊、輸入、選擇)都依賴于準確識別頁面元素。Selenium WebDriver 提供了多種定位策略,從簡單的 ID 定位到復雜…

通用代碼自用

多文件上傳public int save(Role role, RequestParam("nfile") MultipartFile nfile, HttpServletRequest request) {System.out.println(nfile.getOriginalFilename());String path request.getSession().getServletContext().getRealPath("/upload");Fi…

生成式AI如何顛覆我們的工作和生活

原問題: ?你覺得生成式AI未來會如何改變普通人的工作和生活?? 做過一個對比國外和國內工業化產品制造的簡單調研,類似一款定制化的臺燈或者語音音響,從零到原型實物, 美國至少需要20萬美刀,國內成本大概…

K8S、Docker安全漏洞靶場

1 介紹 一個脆弱基礎設施自動化構建框架,主要用于快速、自動化搭建從簡單到復雜的脆弱云原生靶機環境。 1.1 項目的緣起 在研究漏洞時,我們經常會發現“環境搭建”這一步驟本身就會占用大量的時間,與之相比,真正測試PoC、ExP的時間可能非常短。由于許多官方鏡像在國內的…

使用Nginx部署前后端分離項目

使用Nginx部署前后端分離項目:用戶中心系統實踐指南 部署前的關鍵準備 在正式部署前,務必確保前后端在生產環境能正常運行: 前端:測試所有API請求路徑和生產環境配置后端:驗證數據庫連接、環境變量和外部服務集成完整流…

當前就業形勢下,軟件測試工程師職業發展與自我提升的必要性

軟件測試行業正處于深刻變革期,2025年的市場已超越400億美元規模,預計2027年將增長7% 。在這個技術驅動、效率至上的時代,測試工程師若想保持競爭力,必須主動擁抱變革,系統性提升技能。通過深入分析行業現狀與人才需求…

java 之 繼承

一、繼承 1.1 、什么是繼承? 繼承就是把所有的類的公共部分(相同的成員)提取出來,放到一個類中繼承需要使用 extends 關鍵字 public class Animal{ public String name; } public class Dog extends Animal{}Dog 是 An…

強化應急通信生命線:遨游三防平板、衛星電話破局極端災害救援

暴雨傾盆,山洪咆哮,城市陷入內澇。今年進入汛期以來,我國廣東、福建、河南、陜西、京津冀等地相繼遭遇暴雨、洪澇、山洪等災害,道路損毀、基站斷網、電力中斷等次生問題為應急響應帶來嚴峻挑戰。如何保障極端場景下的通信暢通&…