嵌入式开发,裸机开发,中断,按键控制蜂鸣器。

2023-05-16

0.前言

        最近想体验一下面试,真正收到公司通知又有点无从下手,没有做准备。但是反手一想,既然是想体验,锻炼而已,干就完了。

        推荐一首歌《Timber》——MattyBRaps,也是考研时期常听的一首。

1.K2按键控制蜂鸣器

        我用的是三星的S3C2410A芯片。

        上个博客说了开发流程,裸机开发的步骤:需求分析,查原理图,查芯片手册,code。

1.1需求分析

        过!!!

1.2查原理图

        搜k2

        GPX1_1(XEINT9)  这就是引脚。中间的其它过程略过。


1.3查芯片手册

1.3.1配置中断

找到GPX1_1

        地址0x11000c20  4-7位写入0xf  这里面有个EXT_INT41[1]  这是对应的中断触发方式  

        接下来找EXT_INT41的1口

        地址0x11000e04  的4-6位写入0x2  下降沿触发(这是硬件工程师告诉我们的  或者自己找所用器件的相关资料)

        还有一点 这个板子默认是不中断  所以要找到中断的管脚 取消中断掩码,因为用的是EXT_INT41  所以找EXT_INT41_MASK

        刚才用的是1口 所以

        把这个地址的1位置0代表启用中断


1.3.2gic-->过滤 

        之前找到了GPX1_1这个引脚  对应XEINT9这个中断寄存器  这个XEINT9对应的就是57好中断源。

        怎么知道的呢?

        往下

        Spi25,Gic中相关配置,所以接下来找中断控制这一章节

          肯定选寄存器

        选哪个  因为是57号 对应spi是25   现在又有问题 用哪个CPU呢?

用 cpu0 ,然后,

        看这个

        找到设置cpu0的

        刚好25就在0-31之间  所以选ICDISER_CPU0

        加上相应偏移地址就是找到这个1

         这几步操作都是为了让57号中断源启动 , 使能57,  把地址0x10490104的25位写入1 , 为啥是25位 , 首先cpu0管了160个中断源  cpu0又分了ser01234 ,  五个  ,160/5=32,所以是ser1管57号源(不是spi号),   57-32=25  所以25位写1 。

        (再或者就理解为25属于ser1  所以直接就配25位)

        这几步完成了使能57号。

        接下来把中断源交给cpu0去

        是这个。

        又该选哪个 ?到这里是不是感觉可麻烦,是真麻烦  

        发现一共有40个  ,知道是CPU0 , 刚才说了有160个源 , 这边分成40个处理 , 160/40=4  ,所以 57在14*4=56 ,在第15个 ,又因为从零开始 , 所以 在14。

         


        接着

        我们知道是ser1(上面)所以选8-15bit位写入   写入啥

        写入0x00000001  , 为啥 ,对应CPU0啊

        所以就是0x10490938的8-15写入1

        然后 中断给了cpu  那就要设置中断优先级  

        用这个

        也是找14 

        写入也是8-15位  写什么  这个随便(0~255之间) 假如我们取12

就是0x10490438这个地址的8-15写入12

        然后 57源可以中断了  接下来设置cpu0使能中断

        0x10480000  的0 位 写入1

        接着设置cpu0的中断优先级阈值(0-255)

        0x10480004的0-7位写入ff  就代表所有中断优先级都可以通过

        最后  开启GIC

        0x10490000  0位写入1


1.3.3中断处理

         上面已经打开了GIC 接下来需要得到中断号

        0x1048000C  0-9 不写东西 等下在代码里分析

        到这一步就算结束了 但是还有清理工作

        1清除管脚中断标志(必须清)

        因为原来用的就是INT41的1口  0x11000F44  1位写入1 

        最后清除GIC的57号中断标志

        0x10490284  的25位写入1  代表25(spi  就是57源)清除


        最后的最后  结束中断

        0x10480010  的0-9写入57  彻底结束57

        还有搜蜂鸣器的步骤,我跳过了,都一样的。代码中会有的。


        恭喜你自己吧,都看到这里了,这么有耐心,相信会换来糖吃。


1.4代码

1.4.1汇编部分

        因为这个是裸机开发,少不了汇编。是汇编配合C实现的。

.text
.global _start
_start:

b	reset		@reset复位
nop				@undefine
nop				@swi
nop				@预取异常
nop				@数据异常
nop				@保留
b	irq_handler				@外中断异常				K2键外部中断 
nop				@快速中断异常

reset:				@****1.初始化
	ldr r0,=0x40008000				@设置中断向量位置  这还与软中断不一样
	mcr p15,0,r0,c12,c0,0
	@这个SOC有16个协处理器  ARM处理器是老大 这协处理器是老二 
	@这条指令是专属于协处理器指令  mcr是将ARm处理器的内容给协处理器  就是老大安排老二做事
	@mrc是老二给老大传送内容  就是汇报
	@为什么要用这个mcr  ARM 懒呗 其实是 不能所有工作都交给ARM做 一般老大不做事 就是安排事
	@p15 是第16个协处理器  交给他去做  0默认值
	@r0是ARM内容  把ARM的r0里的 就是0x40008000这个地址里的东西给P15的c12寄存器
	@c0 0  代表是如果c12装不下就继续往c0装
	
	@要定义两种处理器模式下的栈  为什么要定义栈  用栈去处理函数啊  函数都是用栈实现的
	@切换到irq模式    10010 IRQ
	mrs r0,cpsr		
	bic r0,#0x1f	@先把后五位清零
	orr r0,#0x12	@0x12=10010  再或上
	msr cpsr,r0
	
	ldr sp,=irq_end		@定义这个栈
	
	@切换用户模式		10000  User mode;
	mrs r0,cpsr
	bic r0,#0x9f		@9f=100 11111  把后五位清零   和第八位清零   为什么 因为用户模式下
						@用户模式不可以中断   初始值是1  清零代表可以中断
	orr r0,#0x10		@0x10=10000   
	msr cpsr,r0
	
	ldr sp,=usr_end		@定义这个栈		
	
	

b main			@执行完初始化  会进入主函数 等待按下按键实现中断

irq_handler:
sub lr,lr,#4	@lr-4表示当前中断点地址
stmfd sp!,{r0-r12,lr}
bl doirq 
ldmfd sp!,{r0-r12, pc}^





.data
	irq_start:
		.space 160
	irq_end:
	
	usr_start:
		.space 160
	usr_end:
.end

1.4.2C部分

#define GPA1CON (*(volatile unsigned int *)0x11400020)
#define ULCON2 (*(volatile unsigned int *)0x13820000)

#define UBRDIV2 (*(volatile unsigned int *)0x13820028)
#define UFRACVAL2 (*(volatile unsigned int *)0x1382002c)
#define UCON2 (*(volatile unsigned int *)0x13820004)
#define UTRSTAT (*(volatile unsigned int *)0x13820010)

#define URXH2 (*(volatile unsigned int *)0x13820024)
#define UTXH2 (*(volatile unsigned int *)0x13820020)

//中断
#define GPX1CON (*(volatile unsigned int *)0x11000c20)
#define EXT_INT41CON (*(volatile unsigned int *)0x11000e04)
#define EXT_INT41_MASK (*(volatile unsigned int *)0x11000f04)

#define ICDISER_CPU0 (*(volatile unsigned int *)0x10490104)
#define ICDIPDR14_CPU0 (*(volatile unsigned int *)0x10490838)
#define ICDIPR14_CPU0 (*(volatile unsigned int *)0x10490438)
#define ICCICR_CPU0 (*(volatile unsigned int *)0x10480000)
#define ICCPMR_CPU0 (*(volatile unsigned int *)0x10480004)
#define ICDDCR (*(volatile unsigned int *)0x10490000)


#define ICDIAR_CPU0 (*(volatile unsigned int *)0x1048000c)
#define EXT_INT41_PAND (*(volatile unsigned int *)0x11000f44)
#define ICDICPR_CPU (*(volatile unsigned int *)0x10490284)
#define ICCEOIR_CPU0 (*(volatile unsigned int *)0x10480010)



//bzz
#define GPD0CON (*(volatile unsigned int *)0x114000a0)
#define TCFG0 (*(volatile unsigned int *)0x139d0000)
#define TCFG1 (*(volatile unsigned int *)0x139d0004)

#define TCNTB0 (*(volatile unsigned int *)0x139d000c)
#define TCMPB0 (*(volatile unsigned int *)0x139d0010)

#define TCON (*(volatile unsigned int *)0x139d0008)

static int tag=0;

void delay()
{
	int i=0;
	for(i=0;i<1000000;i++)
	{
		;
	}
}

void delay_doudong(int time)
{
	int i=0;
	for(i=0;i<time;i++)
	{
		;
	}
}




void init_k2()		//初始化
{
	GPX1CON = GPX1CON | (0xf<<4);
	
	EXT_INT41CON = EXT_INT41CON & (~(0x7<<4)) | (0x2<<4);
	
	EXT_INT41_MASK = EXT_INT41_MASK & (~(0x1<<1));
	
	ICDISER_CPU0 = ICDISER_CPU0 |  0x1<<(57-32);
	
	ICDIPDR14_CPU0 = ICDIPDR14_CPU0 & (~(0xff<<8)) |(0x1<<8);
	
	ICDIPR14_CPU0 = ICDIPR14_CPU0 & (~(0xff<<8)) | (12<<8);
	
	ICDIPR14_CPU0 = 1;
	
	ICCPMR_CPU0 = 0xff;
	
	ICDDCR = 1;
	
	
	//bzz初始化
	//1 配置GPD0_0为PWM输出模式
	GPD0CON = GPD0CON &(~(0xf)) | 0x2;
	
	//2 配置一级分频--》25
	TCFG0 = TCFG0 &(~(0xff)) | 0x24;
	
	//3 配置二级分频--》4
	TCFG1 = TCFG1 &(~(0xf)) | 0x2;
	//4 设置输入波形个数
	TCNTB0 = 1912;
	//5 设置输入波形中高电平的持续时间
	TCMPB0 = 1912/2;
	
	TCON = TCON | (1<<3) | (1<<1);
	
}

void bzz_on()
{
	TCON = TCON &(~(1<<1)) | 1;		//  1左移1  10  取反 01 
}

void bzz_off()
{
	TCON = TCON & (~(0x1 << 0));
	
}

void init_uart()
{
	GPA1CON = GPA1CON &~(0xff) | (0x22);
	
	ULCON2 = 0<<6 | 0<<5 |0<<2 | 0x3;
	
	UBRDIV2=53;		//整数部分
	UFRACVAL2=4;	//小数部分
	
	UCON2 = UCON2 &~(0xf) | (1<<2) | 1;

}
char recv()
{
	while(!(UTRSTAT&1))
	{
		;
	}
	return URXH2;
}

void send(char c)
{
	while(!(UTRSTAT &(1<<1) ))
	{
		;
	}
	UTXH2 = c;
}


void doirq()
{
	
	int num = ICDIAR_CPU0 & (0x3ff);
	switch(num)
	{
		case 57:
		{
			tag++;
			send('o');
			send('k');
			
			bzz_on();
			//delay();
			if(tag%2==0){
				bzz_off();
				//delay();
			}
			
			
			EXT_INT41_PAND =  EXT_INT41_PAND | (1<<1);
			
			ICDICPR_CPU = ICDICPR_CPU | (1<<(57-32));
			
		}
		break;
	}
	ICCEOIR_CPU0 = ICCEOIR_CPU0 & (~(0x3ff)) | num;
	
	
}





int main()
{
	init_k2();
	init_uart();
	while(1)
	{
		;
	}
	
	
}




        以上就是全部代码。

1.4.3代码总结

        有个问题是什么,我没有解决按键抖动的问题。其他还好。嘿嘿。

2.总结

        一切代码皆逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发,裸机开发,中断,按键控制蜂鸣器。 的相关文章

  • Prometheus监控实战系列二十:监控Kubernetes集群(下)

    本文承接上篇 xff0c 在本篇中我们会讲解Prometheus如何应用基于Kubernetes的服务发现功能 xff0c 检索目标信息并进行监控 在监控策略上 xff0c 我们将混合使用白盒监控与黑盒监控两种模式 xff0c 建立起包括基
  • RT-Thread 简介及架构

    RT Thread xff0c 全称是 Real Time Thread xff0c 顾名思义 xff0c 它是一个嵌入式实时多线程操作系统 xff0c 基本属性之一是支持多任务 xff0c 允许多个任务同时运行并不意味着处理器在同一时刻真
  • 进程的结构

    什么是进程 UNIX标准 xff08 特别是IEEE Std 1003 1 2004年版 xff09 把进程定义为 一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源 目前 xff0c 可以把进程看作正在运行的程序 像Linu
  • 【代码小坑】梯度回传为0

    记录一下训练过程中遇到的问题 xff0c 由于这个问题我花了很长时间才解决 xff0c 所以值得记录 先给出结论 xff1a tensor转换成numpy后会丢失梯度 xff0c 导致回传出现问题 由于原代码不容易理解 xff0c 简单用个
  • (超详细)零基础如何学习操作系统---操作系统书籍推荐

    直接先给出路线书籍 编码 隐匿在计算机软硬件背后的语言 汇编语言 x86从实模式到保护模式 操作系统导论 操作系统真象还原 查漏补缺 1 编码 隐匿在计算机软硬件背后的语言 对于完全不懂计算机的朋友 xff0c 这本书可以让你对计算机有一个
  • 多种形式ICP问题的ceres实例应用

    一家之言 xff0c 仅作分享 xff0c 如有不合理或需要改进的地方 xff0c 欢迎各位讨论 ICP方法主要解决空间点云3D 3D的运动估计问题 xff0c 已知 xff1a t 1 t 1 t 1 和
  • git配置以及git-cola使用教程

    git安装 打开终端 xff0c 输入sudo apt get install git git配置 配置用户名 git config global user name 34 user name 34 配置邮箱 git config glob
  • C++ 手撸简易服务器

    本文使用上一期写的反射类 xff0c 另外我发现 lt WinSock2 h gt 这个头文件里有RegisterClass 这个结构 xff0c 还有typedef RegisterClass RegisterClassW这句话 这都能重
  • STM32CubeMX实战教程(一)——软件入门

    软件入门 前言新建工程界面简介MCU外设配置时钟树工程设置工具生成代码代码分析main cgpio cstm32f4xx it c 程序下载现象 结语 前言 STM32Cube 是一个全面的软件平台 xff0c 包括了ST产品的每个系列 平
  • STM32F4 | 定时器中断实验

    文章目录 一 STM32F429 通用定时器简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置定时器更新中断功能 这一章介绍如何使用 STM32F429 的通用定时器 xff0c STM32F429 的定时器功能十分强
  • 相机标定和ORBSLAM2/VINS测试

    目录 一 相机标定1 1 标定目的1 2 常见模型介绍1 2 1 相机模型1 2 2 畸变模型 1 3 双目标定1 3 1 常见标定工具及对应使用场景1 3 2 Kalibr标定1 3 3 opencv双目标定1 3 4 basalt标定
  • matlab安装教程

    MATLAB xff08 矩阵实验室 xff09 是MATrix LABoratory的缩写 xff0c 是一款由美国The MathWorks公司出品的商业数学软件 MATLAB是一种用于算法开发 数据可视化 数据分析以及数值计算的高级技
  • 软件工程结构化分析

    需求分析的概念 需求分析是软件定义时期的最后一个阶段 xff0c 它的基本任务是准确的回答 系统必须做什么 这个问题 也就是对目标系统提出完整 准确 清晰 具体的要求 在需求分析阶段结束之前 xff0c 系统分析员应该写出软件需求规格说明书
  • 树莓派忘记密码 vnc登陆显示‘No configured security type is supported by 3.3 viewer’的问题解决办法

    树莓派忘记密码以及部署VNC 1 修改密码 需求你的树莓派有屏幕 xff0c 没有屏幕的可以百度其他解决方案了一把键盘 树莓派吃灰了很久 xff0c 最近由于有新的需求 xff0c 就拿出来玩耍一下 首先是第一个问题 xff0c 如何查看i
  • imx6ull 正点原子设备树适配韦东山的开发板 (一)顺利启动,配置led,button

    设备树在公司经常用到 有时候很多驱动编写也就是替换设备树 所以拿韦老师的板子练手设备树 这次尝试直接拿正点的设备书改成韦老师的板子能用 对比 正点原子的设备树结构图 韦东山的设备树结构图 从因为蓝色的是开发板厂商对开发板自己的优化 所以我们
  • 一文了解目标检测边界框概率分布

    一文了解目标检测边界框概率分布 概率建模 众所周知 xff0c CNN的有监督学习通常是建立在给定训练数据集之上的 xff0c 数据集的标签 也称为GT xff0c 决定了人类期望模型学习的样子 它通过损失函数 优化器等与CNN模型相连 因
  • Kalibr安装教程

    系统 xff1a Ubuntu18 04 首先 xff0c 需要安装好gcc g 43 43 cmake ros xff0c 如果没有 xff0c 可使用如下命令一键安装 sudo apt get install gcc g 43 span
  • 程序员:每一份不忘初心的情怀, 都是对技术的追求

    1 真正的情怀 xff0c 是从不矫情 这几年 情怀 大约快成了贬义 创业讲情怀 xff0c 产品讲情怀 xff0c 好像没点情怀都不好意思出门见人 我们曾经充满热情 xff0c 是一位开源软件倡导者 xff0c 我们崇尚全栈工程师才有未来
  • HTML代码简写方法

    原文链接 xff1a HTML代码简写方法 大写的E代表一个HTML标签 1 E 代表HTML标签 2 E id 代表id属性 3 E class 代表class属性 4 E attr 61 foo 代表某一个特定属性 5 E foo 代表
  • Git远程分支

    远程分支 远程分支是位于远程仓库的分支 xff0c 我们通常会用远程分支来更新本地分支 xff0c 然后在本地进行修改 xff0c 最后将修改的结果同步到远程分支上 除此之外 xff0c 我们还需要搞清楚远程跟踪分支和跟踪分支的概念 远程跟

随机推荐

  • STM32F4 | PWM输出实验

    文章目录 一 PWM 简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置定时器 PWM 输出功能 上一章 xff0c 我们介绍了 STM32F429 的通用定时器 TIM3 xff0c 用该定时器的中断来控制 DS1
  • 基于大疆RM3508电机的串级PID(角度环+速度环)

    1 前言 最近参加ROBOCON xff0c 我负责编写传球机器人 xff0c 由于传球机构需要一个电机转固定角度来带动球 xff0c 所以便用大疆3508电机通过串级PID来实现 xff0c 不得不说3508电机还是真的强 xff0c 先
  • ROS三种通信方式之服务通信

    一 服务通信的理论模型 服务通信也是ROS中一种极其常用的通信模式 xff0c 服务通信是基于请求响应模式的 xff0c 是一种应答机制 也即 一个节点A向另一个节点B发送请求 xff0c B接收处理请求并产生响应结果返回给A 就像是服务器
  • 滑模控制理论(SMC)

    滑模控制理论 Sliding Mode Control SMC 滑膜控制理论是一种建立在现代控制理论基础上的控制理论 xff0c 其核心为李雅普诺夫函数 xff0c 滑膜控制的核心是建立一个滑模面 xff0c 将被控系统拉倒滑模面上来 xf
  • ROS OpenRAVE 常用逆解库 ikfast (应用于UR机械臂)

    ArmKine cpp include 34 armKine h 34 include lt math h gt include lt stdio h gt include lt corecrt math defines h gt defi
  • Fast and High Quality Image Denoising via Malleable Convolution阅读笔记

    论文 xff1a Fast and High Quality Image Denoising via Malleable Convolution arXiv xff1a https arxiv org abs 2201 00392 Abst
  • 浅谈java继承机制——通过super调用父类方法

    最近在看代码的时候遇到一个天坑 xff0c 由于习惯性思维 xff0c 可能大部分人都会掉近这个坑 xff0c 所以拿出来记录一下 子类使用super调用的父类方法里 xff0c 再调用父类的方法 先来看一段代码 xff08 该段代码只是作
  • ORB_SLAM2运行KITTI数据集

    在前文我们已经安装运行了ORB SLAM2 xff0c 下载和编译 xff08 包括报错 xff09 在文章 xff1a ORB SLAM2下载编译及运行EuRoC数据集 浅梦语11的博客 CSDN博客 euroc数据集下载 并且我们使用运
  • 嵌入式学习札记(基于STM32L431) 一、ARM Cortex-M4微处理器

    ARM Cortex M4微处理器 写在前面ARM Cortex M4微处理器简介ARM Cortex M4微处理器内部结构概要位数总线结构中断控制存储器保护低功耗内部寄存器 寻址方式与机器码获取方法指令保留字简表与寻址方式指令保留字简表寻
  • 嵌入式 Linux平台 C程序 交叉编译技术

    嵌入式Linux平台C程序交叉编译技术 一 实验目的和任务 本实验要求复习和掌握Linux平台的C程序开发过程 本实验要求掌握嵌入式开发板的操作方法 本实验要求掌握Linux平台交叉编译方法和程序运行方法 二 实验设备介绍 B703实验室是
  • MapReduce编程综合应用

    MapReduce编程综合应用 实验环境 VMware虚拟机 xff08 CentOS 7系统 xff09 Hadoop 数据 现有一份汽车销售记录 xff0c 销售记录 包括时间 地点 邮政编码 车辆类型等信息 xff0c 每条记录信息包
  • MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解决方法

    1 问题复现 xff1a 今天在进行数据迁移时 xff0c 使用Navicat连接数据库进行连接时 xff0c 由于 SQL语句中使用了 group by分组函数 xff0c 结果报了如下错误 xff1a 2 产生原因 产生原因说是 xff
  • deepin linux 安装配置

    开启root权限 span class token function sudo span span class token function su span root 开启root权限 linux安装curl span class toke
  • 解决Ubuntu1804安装后不能使用root用户远程登录

    解决Ubuntu1804安装后不能使用root用户远程登录 root用户密码正确无法远程 解决方法 1 为root用户设置密码 span class token function sudo span span class token fun
  • git 删除本地/远程分支

    1 删除本地分支 git branch d 本地分支名A 注意 xff1a 需要切换到其他分支下才能删除 xff0c 处于分支A的时候 xff0c 无法删除分支A 切换分支git checkout 本地分支名B 如果本地分支A下有未合并的更
  • RTD\RTK\PPK\PPP\DGPS\地基增强系统\星基增强系统

    xff08 一 xff09 RTD xff08 Real Time Differential xff09 xff1a 实时动态码相位差分技术 RTD计算的是伪距 xff0c 根据基准站已知坐标和各卫星的坐标 xff0c 求出每颗卫星每一时刻
  • NVIDIA JETSON TX2 介绍及上电、刷机全纪录

    一 TX2相关 1 1 图片 1 2 TX2介绍 xff1a NVIDIA Jetson TX2 嵌入式领域的AI超级电脑 它是一台基于NVIDIA Pascal 架构的AI单模块超级计算机 它性能强大 xff0c 外形小巧 xff0c 节
  • 小白控制算法之自抗扰调参经验总结

    最近做的项目用到了自抗扰 xff0c 尝试联系一些相关领域的老师 xff0c 无奈似乎有所保留 xff0c 只得自己从头研究起 讲道理 xff0c 无论是复杂的系统 xff0c 还是超过9个参数的调节 xff0c 整个调程序和调参的过程都不
  • DS001-测试冒泡排序的运行时间

    本程序演示如何测试一段程序的运行时间 以冒泡排序算法为例 include 34 time h 34 与时间相关的函数 include 34 stdlib h 34 rand 函数在此库中 include 34 stdio h 34 输入输出
  • 嵌入式开发,裸机开发,中断,按键控制蜂鸣器。

    0 前言 最近想体验一下面试 xff0c 真正收到公司通知又有点无从下手 xff0c 没有做准备 但是反手一想 xff0c 既然是想体验 xff0c 锻炼而已 xff0c 干就完了 推荐一首歌 Timber MattyBRaps xff0c