嵌入式学习——硬件(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.mzph.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…