嵌入式学习——硬件(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,一经查实,立即删除!

相关文章

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

本文收录于专栏 Nacos 推荐阅读&#xff1a;Nacos 架构 & 原理 文章目录 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder总结「AI生成」 前言 专栏前几篇文章主要讲了Nacos作为服务注册中心相关…

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;而不会影响…

各维度卷积神经网络内容收录

各维度卷积神经网络内容收录 卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通常是指用于图像分类的2D CNN。但是&#xff0c;现实世界中还使用了其他两种类型的卷积神经网络&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;内核沿1个方向移动。1D CNN的输入和…

全球最大智能立体书库|北京:3万货位,715万册,自动出库、分拣、搬运

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 北京城市图书馆的立体书库采用了先进的WMS&#xff08;仓库管理系统&#xff09;和WCS&#xff08;仓库控制系统&#xff09;&#xff0c;与图书…

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…

vue响应式原理细节分享

在讲解之前&#xff0c;我们先了解一下数据响应式是什么&#xff1f;所谓数据响应式就是建立响应式数据与依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更…

前端:多服务端接口资源整合与zip打包下载

项目需求 前端项目开发中,有一个页面需要去整合多个服务接口返回的数据资源,并且需要将这多个服务接口接口返回的数据进行资源压缩,最终打包成zip压缩包,并在客户端完成下载。 基本需求梳理如下, 实现思路 这个需求点其实本质上还是传统的“文件下载”功能需求,常见的例如…

Python使用defaultdict简化值为list的字典

原始代码&#xff1a; from typing import Dictrelated_objects_for_fetch: Dict[str, list] {}for key, value in [(k1, v1), (k1, v2), (k2, v2), (k3, v3), (k2, v2)]:if key not in related_objects_for_fetch:related_objects_for_fetch[key] []if value not in (value…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪&#xff0c;每一步行动总是按某种指标选取最优的操作。而且他目光短浅&#xff0c;总是只看眼前&#xff0c;并不考虑…

第三天:LINK3D核心原理讲解【第1部分】

第三天:LINK3D核心原理讲解 LINK3D学习笔记 目标 了解LINK3D velodyne64线激光雷达LINK3D质心点提取效果: 分布在车道与墙体的交界处。 课程内容 LINK3D论文精讲LINK3D聚合关键点提取代码讲解LINK3D描述子匹配代码讲解除了ALOAM的线特征、面特征,还有其他点云特征吗,是…

如何使用 Postgres 折叠您的堆栈 实现一切#postgresql认证

技术蔓延如何蔓延 假设您正在开发一款新产品或新功能。一开始&#xff0c;您的团队会列出需要解决的技术问题。有些解决方案您将自行开发&#xff08;您的秘诀&#xff09;&#xff0c;而其他解决方案您将使用现有技术&#xff08;可能至少包括一个数据库&#xff09;来解决。…

人工智能期末复习笔记(更新中)

分类问题 分类&#xff1a;根据已知样本的某些特征&#xff0c;判断一个新的样本属于哪种已知的样本类 垃圾分类、图像分类 怎么解决分类问题 分类和回归的区别 1. 逻辑回归分类 用于解决分类问题的一种模型。根据数据特征或属性&#xff0c;计算其归属于某一类别 的概率P,…

ComfyUI局部重绘的四种方式 (附件工作流在最后)

前言 局部重绘需要在图片中选择重绘区域&#xff0c;点击图片右击选择Open in MaskEditor&#xff08;在蒙版编辑器中打开&#xff09;&#xff0c;用鼠标描绘出需要重绘的区域 方式一&#xff1a;重绘编码器 这种方式重绘比较生硬&#xff0c;需要额外搭配使用才行 方式二&…