嵌入式学习——硬件(s3c2440外部中断、定时器中断)——day54

1. start.s

	preserve8
	area reset, code, readonly
	code32
	entry

	ldr pc, =start
	nop
	nop
	nop
	nop
	nop						   
	ldr pc, =interrupt_handler
	nop
		
start
	ldr sp, =0x40001000

	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr r0, r0, #0x12;IRQ
	bic r0, r0, #(1 << 7);打开IRQ中断允许
	msr cpsr_c, r0
	ldr sp, =0x40001000
	sub sp, sp, #1024

	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr r0, r0, #0x10 ;User
	msr	cpsr_c, r0
	ldr sp, =0x40001000
	sub sp, sp, #2048

	import main
	b main

interrupt_handler
	sub lr, lr, #4	
	stmfd sp!, {r0-r12, lr}
	import do_interrupt
	bl do_interrupt
	ldmfd sp!, {r0-r12, pc}^

finished
	b finished

	end

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频率大约为400Mhz
	CLKDIVN |= ((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=2MHz
	TCFG1 &= ~(0x0f << 16);// 选择 PWM 定时器 4 的选通输入1/2 2/2=1MHz

	TCNTB4 = 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);//启动定时器4

	register_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 14

extern 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;//先清src
	INTPND = 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.mfbz.cn/a/759707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言力扣刷题11——打家劫舍1——[线性动态规划]

力扣刷题11——打家劫舍1和2——[线性动态规划] 一、博客声明二、题目描述三、解题思路1、线性动态规划 a、什么是动态规划 2、思路说明 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更好的督促自己学习以及理解力扣大佬们的解…

Java基础(三)——类和对象、构造方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

运维锅总详解Prometheus

本文尝试从Prometheus简介、架构、各重要组件详解、relable_configs最佳实践、性能能优化及常见高可用解决方案等方面对Prometheus进行详细阐述。希望对您有所帮助&#xff01; 一、Prometheus简介 Prometheus 是一个开源的系统监控和报警工具&#xff0c;最初由 SoundCloud …

业务模型扩展字段存储

构建业务模型时&#xff0c;通常模型会设置扩展信息&#xff0c;存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性&#xff0c;但并没有结构化存储的类型和非空等约束&#xff0c;且强依赖代码中写入/读取时进行序列化/反序列化操作&#xff0c; 当扩展信息结构简单且…

数据倾斜优化:Hive性能提升的核心

文章目录 1. 定义2. 数据倾斜2.1 Map2.2 Join2.3 Reduce 3. 写在最后 1. 定义 数据倾斜&#xff0c;也称为Data Skew&#xff0c;是在分布式计算环境中&#xff0c;由于数据分布不均匀导致某些任务处理的数据量远大于其他任务&#xff0c;从而形成性能瓶颈的现象。这种情况在H…

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

python open函数中文乱码怎么解决

首先在D盘下新建一个html文档&#xff0c;接着在里面输入含有中文的Html字符&#xff0c;使用中文格式对读取的字符进行解码&#xff0c;再用utf-8的模式对字符进行编码&#xff0c;然后就能正确输出中文字符。 代码如下&#xff1a; # -*- coding: UTF-8 -*- file1 open(&quo…

策略模式在金融业务中的应用及其框架实现

引言 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不修改客户端代码的情况下&#xff0c;动态地改变一个类的行为。它通过定义一系列算法并将它们封装在独立的策略类中&#xff0c;使这些算法可以互相替换&#xff0c;而不会影响…

【原理】机器学习中的最小二乘法公式推导过程

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是最小二乘法1.1. 什么是最小二乘法1.2. 最小二乘法的求解公式 二、最小二乘法求解公式的推导 最小二乘法是基本的线性求解问题之一&#xff0c;本文介绍最小二乘法的原理&#xff0c;和最小二法求解公式…

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下&#xff1a; 一、Python学习方法 分解自己的学习目标&#xff1a;可以将学习目标分基础知识&#xff0c;进阶知识&#xff0c;高级应用&#xff0c;实…

开源模型破局OpenAI服务限制,15分钟灵活搭建RAG和Agent应用

简介&#xff1a; 今天&#xff0c;我们做了两个实验&#xff0c;目标在15分钟内&#xff0c;完成下载社区的开源模型&#xff0c;部署成API&#xff0c;替换LlamaIndex中RAG和LangChain中OpenAI接口Agent的最佳实践&#xff0c;并取得符合预期的结果。 实验一 实验目标&…

企业级im即时通讯,WorkPlus专注于政企移动数字化平台底座

企业级IM即时通讯是为满足政府和企业内部通讯需求而设计的高级通讯解决方案。作为一家专注于政企移动数字化平台底座的企业&#xff0c;WorkPlus为政府和企业提供了安全专属的移动数字化解决方案。本文将介绍企业级IM即时通讯的重要性、WorkPlus的特点和优势。 1. 企业级IM即时…

AttGAN实验复现 2024

AttnGAN 代码复现 2024 文章目录 AttnGAN 代码复现 2024简介环境python 依赖数据集TrainingPre-train DAMSMTrain AttnGAN SamplingB_VALIDATION 为 False (默认)B_VALIDATION 为 True 参考博客 简介 论文地址&#xff1a; https://arxiv.org/pdf/1711.10485.pdf 代码 python…

springboot使用测试类报空指针异常

检查了Service注解&#xff0c;还有Autowired注解&#xff0c;还有其他注解&#xff0c;后面放心没能解决问题&#xff0c;最后使用RunWith(SpringRunner.class)解决了问题&#xff01;&#xff01; 真的是✓8了&#xff0c;烦死了这个✓8报错&#xff01;

DIVE INTO DEEP LEARNING 56-60

文章目录 56 Gated Recurrent Unit(GRU)56.1 Motivation: How to focus on a sequence56.2 The concept of doors56.3 Candidate hidden state56.4 hidden state56.5 summarize56.6 QA 57 Long short-term memory network57.1 Basic concepts57.2 Long short-term memory netwo…

240630_昇思学习打卡-Day12-Transformer中的Multiple-Head Attention

240630_昇思学习打卡-Day12-Transformer中的Multiple-Head Attention 以下为观看大佬课程及查阅资料总结所得&#xff0c;附大佬视频链接&#xff1a;Transformer中Self-Attention以及Multi-Head Attention详解_哔哩哔哩_bilibili&#xff0c;强烈建议先去看大佬视频&#xff…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学&#xff0c;是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216&#xff0c;论文提出了一种新的embedding模型&#xff0c;称为M3-Embedding&#xff0c;它在多语言性&#xff08;Multi-Linguality&#xff09;、多功能…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库&#xff0c;校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库&#xff0c;校验规则使用utf8_ bin[区…

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

24年诺瓦星云入职认知能力测验Verify + 职业性格问卷OPQ可搜索带解析求职SHL题库

一、走进西安诺瓦星云科技股份有限公司 西安诺瓦星云科技股份有限公司(简称诺瓦星云) 是全球极具竞争力的LED显示解决方案供应商&#xff0c;实施"基于西安&#xff0c;围绕北京与深圳&#xff0c;辐射全球"的全球化布局&#xff0c;总部位于西安&#xff0c;西安、…