嵌入式開發學習日志Day8(ARM體系架構——按鍵、蜂鳴器及中斷)

一、蜂鳴器學習

?

代碼實現:

二、BSP工程管理及Makefile

1、BSP工程管理

利用BSP工程管理,使文檔顯示不雜亂;

????????將這些文件分為4類,并保存到4個不同的文件夾里。

????????首先在新的工程文件夾里創建一個之后我們編寫的類似led驅動,clk驅動等等外設驅動程序都放在這文件夾里面,創建名為bsp

?再創建project文件夾,存放 start.s和 main.c 文件,也就是應用文件;

?? 一個imx6ull文件夾,用來保存NXP的相關庫cc.h、fsl_common.h、fsl_iomuxch和 MCIMX6Y2.h 這四個文件;

最后再創建一個obj文件夾,用來存放編譯生成的.o?文件。

2、Makefile?

target = ledcross_compiler = arm-linux-gnueabihf-cc = $(cross_compiler)gcc
ld = $(cross_compiler)ld
objcopy = $(cross_compiler)objcopy
objdump = $(cross_compiler)objdumpincdirs = bsp imx6ull #所有包含頭文件的文件夾
srcdirs = bsp project #所有包含源文件的文件夾include = $(patsubst %, -I%, $(incdirs))  #處理了頭文件之后生成了$(incdirs),然后在生成的每個文件前面加-I
#I是include,-Idsp意思是使用的頭文件去dsp文件夾找cfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))  #將所有源文件中的.c找出來,但是得到的結果帶目錄。eg:文件名/main.c
sfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S))   #將所有源文件中的.s找出來,但是得到的結果帶目錄。eg:文件名/main.Scfilenodir = $(notdir $(cfiles)) #去掉了目錄名,得到的是main.c
sfilenodir = $(notdir $(sfiles))#去掉了目錄名,得到的是main.Scobjs = $(patsubst %, obj/%, $(cfilenodir:.c=.o)) #編譯之后生成的結果是main.o,(.c)需要放入obj的目錄中去,obj/表示放在obj這個目錄中去
sobjs = $(patsubst %, obj/%, $(sfilenodir:.S=.o)) #編譯之后生成的結果是main.o,(.S)需要放入obj的目錄中去,obj/表示放在obj這個目錄中去objs = $(cobjs) $(sobjs)  #將.c生成的obj和.S生成的obj放在一起VPATH = $(srcdirs)  #表示如果找源文件找不到的話,就去srcdirs中去查找;$(target).bin : $(objs)$(ld) -Timx6ull.lds -o$(target).elf $^$(objcopy) -O binary -S -g $(target).elf $@$(objdump) -D $(target).elf > $(target).dis$(sobjs) : obj/%.o : %.S    #.S生成sobj@mkdir -p obj   #如果沒有obj文件,創建obj目錄,@符號表示,創建的過程中沒有回顯,,-p表示如果這個目錄已存在,則不報錯$(cc) -Wall -nostdlib -c $(include) -o $@ $<$(cobjs) : obj/%.o : %.c  #.c生成cobj@mkdir -p obj     #如果沒有obj文件,創建obj目錄,@符號表示,創建的過程中沒有回顯,,-p表示如果這個目錄已存在,則不報錯$(cc) -Wall -nostdlib -c $(include) -o $@ $<.PHONY : clean
clean:rm -rf $(objs) $(target).elf $(target).bin $(target).dis

三、 按鍵練習

代碼實現:

#include"key.h"
#include"MCIMX6Y2.h"
#include"fsl_iomuxc.h"
#include "core_ca7.h"
#include "gpio.h"
void init_key(void)
{IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_UART1_CTS_B,0x10F0);GPIO_Pin_Config_t t = {.direction = GPIO_Direction_In};gpio_pin_config(GPIO1,18,&t);GPIO1->ICR2 |= (3 << 18);GPIO1->IMR |= (1 << 18);GIC_SetPriority(GPIO1_Combined_16_31_IRQn,1);GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);}int key_pressed(void)
{return((GPIO1->DR & (1 << 18)) == 0) ? 1 : 0;}

四、中斷

4.1 GIC控制器(通用中斷控制器)

?VFIQ/VIRQ中V指虛擬化的;

????????GIC 接收眾多的外部中斷,然后對其進行處理,最終就只通過四個信號報給 ARM 內核,這四個信號的含義分別為: VFIQ:虛擬快速 FIQ。 VIRQ:虛擬 IRQ。 FIQ:快速中斷 IRQ。 IRQ:中斷 IRQ。

作用:

  1. 作用是中斷優先級排序;
  2. 中斷屏蔽的控制;

    GIC控制器(v2版本)最多處理8個內核;最多有1020個中斷源:

    SGI ?(軟件中斷):( 0 - 15 ),,軟件中斷,由軟件觸發引起的中斷,通過向寄存器GICD_SGIR

    寫入數據來觸發,系統會使用 SGI 中斷來完成多核之間的通信。
    PPIs(私有中斷):(16 - 31), GIC 是支持多核的,每個核肯定有自己獨有的中斷。這些獨有的中斷肯定是要指定的核心處理,因此這些中斷就叫做私有中斷;
    SPI(共享中斷):(32-1019), (注意!不是 SPI 總線那個中斷),這類中斷泛指所有的外設中斷;如定時器、外部中斷、串口中斷等。

    ? ? ? ? 實際用到的只有(32-159)128個,這128是imx6ull所支持的

    ? ? ? ? PS:GIC也可以屏蔽不需要的中斷
    ? ? ? ? ? ? ? ? V2版本的GIC不在ARM內部,V3、V4版本的是64位

4.2?異常向量表

????????異常向量表重映射是指在處理器發生異常時,通過改變異常向量表的物理地址與邏輯地址之間的映射關系

????????目的:確保系統能夠正確響應和處理異常。

????????各模式下的sp只能在進入對應模式后 才能設置,這是因為每種模式的sp都是分離的。 這里分別設置irq、sys、svc模式下的大小都為2MB。

異常狀態返回地址偏移量:當異常狀態發生以后,返回地址和lr中保留的地址偏移量

4.3 協處理器

????????協處理器:用于減輕系統微處理器特定處理任務的芯片;

? ? ? ? cortex A7 共16個協處理器,CP0~CP15

4.3.1 mcr指令與mrc指令?

用mcr與mrc來訪問協處理器;

mcr寫入協處理器;

mrc讀取協處理器;


協處理器編號p0-p15;

讀取出來的寄存器內容:

SCTLR寄存器:


eg:mrc p15, 0, r0, c0, c0, 0(mrc指令讀取MIDR(主ID)寄存器,讀出來的結果放入了寄存器R0中)

? ? CPSR分為I位(bit[7](0不屏蔽? 1屏蔽))、F位(bit[6] 0不屏蔽 1屏蔽)

CPS指令

????????這里的 effect 分為倆個bit[7](IE使能 cpsie(0)、ID失能cpsid(1)),使用了effect的話就不能省略iflags,i位指irq,f位指frq

PS:在匯編中調main.c中的函數時,要先保護現場

獲取中斷號,并記錄?

GPIOx_ICR? ? ? ? //設置中斷寄存器?

GPIOx_IMR? ? ? ? //設置中斷屏蔽寄存器 ,若為1,開中斷

GPIOx_ISR? ? ? ? //設置中斷標記寄存器 ,若為1,則說明該位產生中斷,但要手動清零

4.4? 搶占優先級

????????Cortex——A7 有32個搶占優先級(誰數小,誰的優先級就高)

????????1 1111 ---> 32個

????????0(組優先級) xxxx(子優先級)

五、提高代碼的耦合性

gpio.c

#include "gpio.h"void gpio_pin_config(GPIO_Type *base, int pin, GPIO_Pin_Config_t *config)   //初始化函數,GPIo引腳的配置,   
// 參數分別是GPIO_Type類型的base,將GPIO的組號傳入   參數2:引腳號     參數3:初始化引腳
{if(config->direction == GPIO_Direction_Out)     //判斷  將相關寄存器,方向配置為輸出{base->GDIR |= (1 << pin);if(config->defalut_value != 0)   //該引腳的默認值為高電平{  base->DR |= (1 << pin);   }else   // 該引腳的默認應該配置為低電平{base->DR &= ~(1 << pin);   }}else  //需要將該引腳配置為低電平{base->GDIR &= ~(1 << pin);}
}void gpio_write(GPIO_Type *base, int pin, int value)  //寫入函數,參數分別是:參數1:參數分別是GPIO_Type類型的base,將GPIO的組號傳入
// 參數2:引腳   參數3:需要寫入的值
{if(value)       //判斷寫入的值是不是1,如果是1的話,則在其DR寫入1;{base->DR |= (1 << pin);  //在輸入得引腳寫入1}else    // 如果不是,則進行指定位清0{base->DR &= ~(1 << pin);     //在輸入得引腳寫入0}
}int gpio_read(GPIO_Type *base, int pin) // 讀函數,參數分別是GPIO_Type類型的base,第二個參數:引腳
{return (base->DR & (1 << pin)) != 0;
}

gpio.h

#ifndef _GPIO_H_
#define _GPIO_H_
#include "MCIMX6Y2.h"
typedef enum
{GPIO_Direction_Out,GPIO_Direction_In
}GPIO_Direction_t;   //枚舉的方法列舉GPIO兩種狀態,輸入或者輸出的方向typedef struct 
{GPIO_Direction_t direction;  // 引腳的工作方式,列:輸入或者輸出int defalut_value;       // 初始化引腳后,該引腳的默認值是高電平還是低電平
}GPIO_Pin_Config_t;    //    初始化引腳extern void gpio_pin_config(GPIO_Type *base, int pin, GPIO_Pin_Config_t *config);
extern void gpio_write(GPIO_Type *base, int pin, int value);
extern int gpio_read(GPIO_Type *base, int pin);#endif

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

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

相關文章

Linux部署Sonic前后端(詳細版)(騰訊云)

系統用的是Ubuntu 22.04 LTS 1、安裝Docker sudo apt update sudo apt install -y docker.io docker-compose sudo systemctl start docker sudo systemctl enable docker# 如果不想每次用 sudo&#xff0c;可以加權限 sudo usermod -aG docker $USER 2、安裝 docker-compose…

騰訊云CBS:企業級云存儲的性能與可靠性重構

摘要 根據Forrester 2025年網絡分析與可見性&#xff08;NAV&#xff09;報告&#xff0c;東西向流量安全與加密威脅檢測成為企業核心痛點&#xff08;誤報率降低需求↑40%&#xff09;。騰訊云CBS作為底層存儲支柱&#xff0c;通過三副本跨可用區冗余架構與毫秒級故障切換能力…

ubuntu 22.04 更換阿里源 (wsl2 參照)

步驟 1: 備份當前源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 步驟 2: 編輯源列表文件 sudo nano /etc/apt/sources.list 步驟 3: 添加阿里云鏡像源 ubuntu 阿里源地址可以在這查看 ubuntu鏡像_ubuntu下載地址_ubuntu安裝教程-阿里巴巴開源鏡像站 …

idea中push拒絕,merge,rebase的區別

在 IntelliJ IDEA 中進行 Git 操作時&#xff0c;Push 拒絕&#xff08;Push Rejected&#xff09;、Merge 和 Rebase 是常見的沖突解決方式。它們有不同的適用場景和影響&#xff0c;下面詳細說明它們的區別&#xff0c;并附上流程圖幫助理解。 1. Push 拒絕&#xff08;Push …

輕松實現PDF局部擦除的技術級解決方案

在處理PDF文檔時&#xff0c;我們常常會遇到這樣的場景&#xff1a;想要刪除某段文字、擦除一張圖片&#xff0c;或者對頁面內容進行局部調整。但很多編輯工具要么操作繁瑣&#xff0c;要么功能受限&#xff0c;甚至還需要付費解鎖核心功能。 這是一款輕便又實用的PDF編輯工具…

css color 十六進制顏色透明度

css color 十六進制顏色透明度 例&#xff1a;#FFFFFF ~~ #FFFFFF1A(10% ) 0% 為 FF10% 為 1A20% 為 3330% 為 4D40% 為 6650% 為 8060% 為 9970% 為 B380% 為 CC90% 為 E6100% 為 00

Git簡介和常用命令

Git簡介 Git是一款版本管理軟件&#xff0c;可以在任何時間點保存文件&#xff0c;也能夠恢復到以前任意時間點保存的文檔&#xff0c;Git作用簡單舉例來說就是&#xff0c;寫論文&#xff0c;有很多個版本&#xff0c;將原來的論文保存起來&#xff0c;新建一個副本&#xff…

Kafka 性能調優指南

文章目錄 概述操作系統層面調優文件系統優化內存管理磁盤 I/O 優化 JVM 調優堆內存設置GC 收集器選擇常見 GC 問題 Broker 端調優版本兼容性關鍵參數配置日志段大小調優設置原則推薦配置調優考慮因素監控命令 應用層調優客戶端復用資源管理多線程消費模式 性能指標調優吞吐量優…

佰力博科技與您探討低溫真空探針臺如何保養

低溫真空探針臺是一種用于在低溫或真空環境下進行電學性能測試的精密儀器&#xff0c;其保養和維護對于確保設備的穩定運行和延長使用壽命至關重要。 一、日常清潔與檢查 1、使用后應立即清潔探針臺&#xff0c;尤其是探針、接口和連接器&#xff0c;避免灰塵和雜質影響精度。…

MySQL:深入總結鎖機制

寫在前面 在 MySQL 數據庫中&#xff0c;鎖機制是保障并發控制和數據一致性的關鍵。合理運用鎖機制&#xff0c;能有效避免數據競爭&#xff0c;提升數據庫性能。接下來&#xff0c;我們就深入了解 MySQL 中的各類鎖。 博主總結&#xff08;注&#xff1a;針對總結的詳解補充在…

AI+OT安全,讓威脅情報實現主動防御

當前&#xff0c;網絡犯罪組織的運作模式正日趨“企業化”&#xff0c;給全球網絡安全帶來了嚴峻挑戰。企業以及各類組織機構有必要采用威脅情報驅動的防御體系&#xff08;Threat-Informed Defense, TID&#xff09;&#xff0c;將安全運營模式從被動響應徹底轉向基于威脅情報…

深度剖析:UDS上下行分離隧道如何繞過主流防火墻?

&#x1f525; 深度剖析&#xff1a;UDS上下行分離隧道如何繞過主流防火墻&#xff1f; &#x1f4ca; 系統架構圖 #mermaid-svg-lv5FKIvBMKPeTFuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lv5FKIvBMKPeTFuW …

Vue 使用vue-cli

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - 使用Vue-cli 筆記 目錄 使用vue-cli 創建項目 配置文件 啟動項目 入口文件 Index.html Main.js Eslint修復 第一種 第二種 第三種 更換為淘寶源 查看當前配置 配置淘寶源 驗證配置 總結 使用vue-cli 創建項目…

Sentinel實現原理

Sentinel 是阿里巴巴開源的分布式系統流量控制組件&#xff0c;主要用于服務保護&#xff0c;涵蓋流量控制、熔斷降級、系統負載保護等功能。 以下是 Sentinel 的實現原理&#xff0c;使用中文簡要說明&#xff1a; 1. 總體架構 Sentinel 采用 輕量級 設計&#xff0c;分為 核…

DeepSeek生成HTML5生命天數計算器

DeepSeek生成HTML5生命天數計算器 讓DeepSeek生成一個生命天數計算器 提示詞prompt 幫我做一個我活了多少天的網頁 用戶輸入出生日期即可顯示我活了多少天 頁面ui要好看點&#xff0c;加上顯示官方統計 人一生平均可以活多少天 自動計算剩余天數。幫我按照上述需求再次生成一個…

如何使typora圖片不居中留白?

如何使typora圖片不居中留白&#xff1f; 駐波使用typora記筆記的時候&#xff0c;好幾次插入圖片太大選擇縮小都會發現圖片仍然滯留在中間&#xff0c;居中顯示&#xff0c;但我本人覺得并不好看&#xff0c;所以我決定改一下&#xff0c;于是有了這篇博客 檢查看原理 軟件內…

高精度頻率基石:超低相噪恒溫晶振的全場景應用解決方案

在科技高速發展的今天&#xff0c;頻率源作為電子系統的 “心臟”&#xff0c;其穩定性與可靠性直接決定著通信、導航、測量等關鍵領域的性能上限。深度洞察行業需求&#xff0c;重磅推出SYN3627L 型 100MHz 恒溫晶振&#xff08;OCXO&#xff09;。這款集高穩定性、低相位噪聲…

【android bluetooth 協議分析 01】【HCI 層介紹 27】【LeReadRemoteFeatures命令介紹】

深入理解 LE Read Remote Features 命令與事件響應 在藍牙低功耗&#xff08;BLE&#xff09;通信中&#xff0c;設備特性&#xff08;LE Features&#xff09;協商是連接過程中的一個關鍵環節。本文將詳細介紹 HCI 層的命令 LE_Read_Remote_Features 及其對應的事件響應 LE_R…

企業架構設計中的CBAM方法深度解析:成本效益驅動的架構決策藝術

目錄 CBAM方法概述與核心價值 CBAM核心流程與實施步驟 前期準備與場景確定 成本效益建模與分析 風險調整與決策制定 實施技巧與挑戰克服 CBAM實戰案例與應用場景 案例一&#xff1a;電商平臺促銷系統架構選型 案例二&#xff1a;制造業ERP系統云遷移決策 案例三&…

為什么你的vue項目連接不到后端

當你新創建一個vue項目時&#xff0c;你很有可能忘記配置了后端的地址這個時候可以加上這樣的配置在 vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import vueDevTools from vite-plugi…