嵌入式學習——硬件(s3c2440外部中斷、定時器中斷)——day54

1. start.s

	preserve8area reset, code, readonlycode32entryldr pc, =startnopnopnopnopnop						   ldr pc, =interrupt_handlernopstartldr sp, =0x40001000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12;IRQbic r0, r0, #(1 << 7);打開IRQ中斷允許msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x10 ;Usermsr	cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #2048import mainb maininterrupt_handlersub lr, lr, #4	stmfd sp!, {r0-r12, lr}import do_interruptbl do_interruptldmfd sp!, {r0-r12, pc}^finishedb finishedend

2. main.c——timer4是一個純粹的定時器

#include <s3c2440.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"void init_wdt(void)	//初始化看門狗,禁止啟動,關閉看門狗
{WTCON &= ~(1 << 0);
}void delay(unsigned int n)
{while (n--);
}void init_clk(void)
{unsigned int t = MPLLCON; //將PCLK頻率存入變量設置好再進行修改,防止頻率修改中途器件因為頻率過高而短路t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用鎖相環將12MHz倍頻t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk頻率大約為400MhzCLKDIVN |= ((2 << 1) | (1 << 0));//分頻,配置HCLK為100MHz,HCLK為50MHz	MPLLCON = t;//將所有頻率配置好再進行設置,防止器件被燒壞
}void timer4_handler(void)
{static unsigned int n = 0;++n;	  if (n > 1000)  //定時器中斷觸發次數次數{ledAllNor();n = 0;}
}void init_timer4(void)
{TCFG0 |= (24 << 8);	//配置定時器 4 預分頻值25  50/25=2MHzTCFG1 &= ~(0x0f << 16);// 選擇 PWM 定時器 4 的選通輸入1/2 2/2=1MHzTCNTB4 = 1000;//設置定時器 4 的計數緩沖器的值為1000 ,1000減到0觸發一次定時器中斷	TCON |= (1 << 22); //自動重載TCON |= (1 << 21); // 定時器 4 的手動更新TCON &= ~(1 << 21);// 定時器 4 的手動更新復位INTMOD &= ~(1 << IRQ_INT_TIMER4);//配置定時器4中斷為IRQ模式INTMSK &= ~(1 << IRQ_INT_TIMER4);//讓定時器中斷處于可服務模式TCON |= (1 << 20);//啟動定時器4register_irq(IRQ_INT_TIMER4, timer4_handler);//注冊定時器中斷處理函數				 
}int main(void)
{init_wdt();init_led();init_key();init_clk();init_timer4();while (1){
//		ledAllNor();
//		delay(0xffff);}
}

3. led.h

#ifndef _LED_H_
#define _LED_H_extern void init_led(void);
extern void ledon(unsigned int n);
extern void ledAllOn(void);
extern void ledAllOff(void);
extern void ledAllNor(void);
extern void ledoff(unsigned int n);#endif

4. led.c

#include <s3c2440.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"void init_led(void)	//初始化led	,輸出模式
{GPBCON &= ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));GPBCON |= ((1 << 10) | (1 << 12) | (1 << 14) | (1 << 16));ledAllOff();		
}void ledon(unsigned int n)
{if (n < 1 || n > 4){return;}GPBDAT &= ~(1 << (n + 4));
}void ledAllOn(void)
{GPBDAT &= ~(0x0f << 5);	
}void ledAllOff(void)
{GPBDAT |= (0x0f << 5);	
}void ledAllNor(void)
{GPBDAT ^= (0x0f << 5);
}void ledoff(unsigned int n)
{if (n < 1 || n > 4){return;}GPBDAT |= (1 << (n + 4));
}

5. key.h

#ifndef _KEY_H_
#define _KEY_H_extern void init_key(void);
extern void key_handler(void);#endif

6. key.c

#include <s3c2440.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"void init_key(void)	//按鍵中斷EINT 8 11 13 14 15 19
{INTMOD &= ~(1 << IRQ_EINT8_23);//EINT8_23設置為IRQ		中斷模式 (INTMOD ) 寄存器INTMSK &= ~(1 << IRQ_EINT8_23);//EINT8_23設置為可服務 中斷屏蔽 (INTMSK ) 寄存器GPGCON &= ~((3 << 0) | (3 << 6) | (3 << 10) | (3 << 12) | (3 << 14) | (3 << 22));GPGCON |= ((1 << 1) | (1 << 7) | (1 << 11) | (1 << 13) | (1 << 15) | (1 << 23));//按鍵改為觸發外部中斷模式GPGUP |= ((1 << 0) | (1 << 11));//禁止附加上拉電阻EXTINT1 |= ((2 << 0) | (2 << 12) | (2 << 20) | (2 << 28)); //為外部中斷配置信號觸發方式EXTINT1 |= ((1 << 3) | (1 << 15) | (1 << 23) | (1 << 27) | ((unsigned int)1 << 31));//下降沿觸發+信號濾波		EXTINT2 |= ((2 << 12) | (1 << 15));EINTMASK &= ~((1 << 8) | (1 << 11) | (1 << 13) | (1 << 14) | (1 << 15) | (1 << 19));	register_irq(IRQ_EINT8_23, key_handler);//注冊由enit8_23導致產生的中斷函數
}void key_handler(void)
{if (EINTPEND & (1 << 8))//判斷具體是哪個子中斷源引發中斷{ledAllNor();}else if (EINTPEND & (1 << 11)){ledAllNor();	}else if (EINTPEND & (1 << 13)){ledon(1);	}else if (EINTPEND & (1 << 14)){ledon(2);	}else if (EINTPEND & (1 << 15)){ledon(3);	}else if (EINTPEND & (1 << 19)){ledon(4);	}EINTPEND = EINTPEND;
}

7. interrupt.h

#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_typedef void (*irq_handler)(void);
#define IRQ_EINT8_23 5
#define IRQ_INT_TIMER4 14extern void do_interrupt(void);
extern void register_irq(int irq_num, irq_handler handler);#endif

8. interrupt.c

#include <s3c2440.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"static irq_handler handler_vector[60];//static防止別人去修改,只能在本interrupt.c文件中使用void do_interrupt(void)
{int n = INTOFFSET;handler_vector[n]();SRCPND = SRCPND;//先清srcINTPND = INTPND;//置位																							  
}void register_irq(int irq_num, irq_handler handler)
{handler_vector[irq_num]	= handler;
}

1.?中斷執行流程

? ? ? ? 1. 中斷源發出中斷請求

? ? ? ? 2. CPU查詢中斷是否被運行、以及中斷是否被屏蔽

? ? ? ? 3. CPU考察中斷優先級

? ? ? ? 4. CPU保護現場

? ? ? ? 5. 執行中斷服務函數

? ? ? ? 6. 恢復現場?

2. 外部中斷是帶有sub寄存器的子請求源

3. 對pend寄存器寫1是清零

pend寄存器0未請求 1請求,但寫1清零

4. 串口中斷帶sub子寄存器

5. 判斷中斷源

pend? 給1是0? ?給0是1

srcpnd

intpnd

6. s3c2440是遞減寄存器

7. 定時器沒有子中斷源

PLL鎖相環:倍頻,使頻率升高

MPLL:給主板倍頻(不要修改MPLL)

UPLL:給USB倍頻

分頻器:分頻,將頻率升高

FCLK分頻器

????????????????????????重點

p

m

s

7-20

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

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

相關文章

【ARM CoreLink 系列 7.1 -- TZC-400 控制器 programmers model】

請閱讀【ARM CoreLink 文章專欄導讀】 文章目錄 TZC-400 programmers modelBuild configuration registerAction registerGate keeper registerSpeculation control registerInterrupt status registerTZC-400 programmers model ARM TZC-400(TrustZone地址空間控制器)是一種…

Nacos配置中心客戶端源碼分析(一): 客戶端如何初始化配置

本文收錄于專欄 Nacos 推薦閱讀&#xff1a;Nacos 架構 & 原理 文章目錄 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder總結「AI生成」 前言 專欄前幾篇文章主要講了Nacos作為服務注冊中心相關…

zram壓縮機制看swapon系統調用

1.swapon開啟zram交換分區 swapon /dev/block/zram0 mkswap /dev/block/zram0 上面命令調用了linux的swapon系統調用啟動zram0交換分區;mkswap命令向塊設備文件/dev/block/zram0寫入了swap_header信息 問題:實際安卓平臺是哪里觸發swapon和mkswap調用的,我們已MTK8195平臺…

平衡三進制類腦計算

PS:用來記錄一些新奇又有趣的想法。。。 1、量子的世界 1.1薛定諤的貓 這感覺是個有趣的話題。 在宏觀中可以觀測到的&#xff0c;是穩定的兩種狀態&#xff0c;但隨著尺寸不斷縮小&#xff0c;直至達到微觀尺度&#xff0c;這一切都變的有趣了起來&#xff0c;一只“既死又活…

zabbix server client 安裝配置

Zabbix Server 采用源碼包部署&#xff0c;數據庫采用 MySQL8.0 版本&#xff0c;zabbix-web 使用 nginxphp 來實現。具體信息如下&#xff1a; 軟件名 版本 安裝方式 Zabbix Server 6.0.3 源碼安裝 Zabbix Agent 6.0.3 源碼安裝 MySQL 8.0.28 yum安裝 Nginx 1.20…

Ubuntu20.04安裝vimplus插件

參考文章&#xff1a; Ubuntu Linux下vimplus的安裝及使用安裝vimplus之后亂碼問題解決 1、安裝步驟&#xff1a; $ git clone https://github.com/chxuan/vimplus.git ~/.vimplus$ cd ~/.vimplus$ ./install.sh2、./install.sh 過程 出現選擇是否備份 /home/yin-roc/.vim…

一個中文和越南語雙語版本的助貸平臺開源源碼

一個中文和越南語雙語版本的助貸平臺開源源碼。后臺試nodejs。 后臺 代理 前端均為vue源碼&#xff0c;前端有中文和越南語。 前端ui黃色大氣&#xff0c;邏輯操作簡單&#xff0c;注冊可對接國際短信&#xff0c;可不對接。 用戶注冊進去填寫資料&#xff0c;后臺審批&…

庫存管理系統基于spingboot vue的前后端分離倉庫庫存管理系統java項目java課程設計java畢業設計

文章目錄 庫存管理系統一、項目演示二、項目介紹三、部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 庫存管理系統 一、項目演示 庫存管理系統 二、項目介紹 基于spingboot和vue前后端分離的庫存管理系統 功能模塊&#xff…

熱題系列章節7

劍指 Offer 04. 二維數組中的查找 題目描述&#xff1a; 在一個二維數組中&#xff08;每個一維數組的長度相同&#xff09;&#xff0c;每一行都按照從左到右遞增的順序排序&#xff0c;每一列都按照從上到下遞增的順序排序。請完成一個函數&#xff0c;輸入這樣的一個二維數…

Go 語言環境搭建

本篇文章為Go語言環境搭建及下載編譯器后配置Git終端方法。 目錄 安裝GO語言SDK Window環境安裝 下載 安裝測試 安裝編輯器 下載編譯器 設置git終端方法 總結 安裝GO語言SDK Window環境安裝 網站 Go下載 - Go語言中文網 - Golang中文社區 還有 All releases - The…

策略模式在金融業務中的應用及其框架實現

引言 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;它允許在不修改客戶端代碼的情況下&#xff0c;動態地改變一個類的行為。它通過定義一系列算法并將它們封裝在獨立的策略類中&#xff0c;使這些算法可以互相替換&#xff0c;而不會影響…

Spark Cache 的用武之地

在什么情況下適合使用 Cache 我建議你在做決策的時候遵循以下 2 條基本原則&#xff1a; 如果 RDD/DataFrame/Dataset 在應用中的引用次數為 1&#xff0c;就堅決不使用 Cache如果引用次數大于 1&#xff0c;且運行成本占比超過 30%&#xff0c;應當考慮啟用 Cache第一條很好…

各維度卷積神經網絡內容收錄

各維度卷積神經網絡內容收錄 卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;通常是指用于圖像分類的2D CNN。但是&#xff0c;現實世界中還使用了其他兩種類型的卷積神經網絡&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;內核沿1個方向移動。1D CNN的輸入和…

高通Android 12 /13根據包名授權懸浮窗權限

代碼路徑frameworks/base/service/core/com/android/server/policy/PhoneWindowManager.java 1、 PhoneWindowManager.java中關于根據包名實現懸浮窗權限授權的功能實現 在實現根據包名授予懸浮窗權限的核心的功能開發中&#xff0c;在通過上述的功能原理實現的過程中分析得知…

EigenLayer 生態解析-再質押與 AVS 崛起

基于以太坊網絡的再質押協議 EigenLayer 提出了利用為以太坊網絡驗證而質押的 ETH 來與其他協議共享安全性和資本效率,同時為協議參與者提供額外利息。在 AVS、再質押、積分系統等概念的推動下,逐漸形成一個龐大的生態系統,從 2024 年初到現在 EigenLayer 的 TVL 增加了 12 …

5.Spring IOC 循環依賴問題源碼深度剖析

Spring IOC 容器解決循環依賴問題主要涉及到幾個關鍵的緩存和對象創建過程中的處理邏輯。以下是對循環依賴問題進行深度剖析的概述&#xff1a; 循環依賴的背景 循環依賴發生在兩個或多個Bean相互依賴對方&#xff0c;形成一個閉環。這可能是直接的&#xff0c;比如Bean A依賴B…

全球最大智能立體書庫|北京:3萬貨位,715萬冊,自動出庫、分揀、搬運

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》 北京城市圖書館的立體書庫采用了先進的WMS&#xff08;倉庫管理系統&#xff09;和WCS&#xff08;倉庫控制系統&#xff09;&#xff0c;與圖書…

Linux磁盤監控思路分析

磁盤監控原理 設備又名I/O設備&#xff0c;泛指計算機系統中除主機以外的所有外部設備。 1.1 計算機分類 1.1.1 按照信息傳輸速度分&#xff1a; 1.低速設備&#xff1a;每秒傳輸信息僅幾個字節或者百個字節&#xff0c;如&#xff1a;鍵盤、鼠標等 2.中速設備&#xff1a…

leetCode.98. 驗證二叉搜索樹

leetCode.98. 驗證二叉搜索樹 題目描述 代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

100張linux C/C++工程師面試高質量圖

文章目錄 雜項BIOSlinux開機啟動流程內核啟動流程網絡編程網絡編程流程tcp狀態機三次握手四次斷開reactor模型proactor模型select原理poll原理epoll原理文件系統虛擬文件系統文件系統調用阻塞IO非阻塞IO異步IO同步阻塞同步非阻塞IO多路復用進程管理進程狀態程序加載內存管理MMU…