重头开始嵌入式第四十六天(硬件 ARM裸机开发 ADC 中断 UART)

目录

ADC使用

1.什么是ADC?

一、功能

二、工作原理

三、参数指标

四、应用领域

2.如何配置s3c2440中的adc?

中断

1.什么是中断?

一、定义

二、中断的作用

三、中断的类型

四、中断处理过程

2.如何配置中断?

UART

1.什么是UART?

一、功能

二、工作原理

三、主要特点

四、参数指标

2.UART的数据帧格式

3.如何配置UART(s3c2440)


ADC使用

1.什么是ADC?

ADC(Analog-to-Digital Converter)即模拟数字转换器。

一、功能

 ADC 的主要功能是将模拟信号转换为数字信号。在现实世界中,很多物理量如温度、压力、声音等都是以模拟信号的形式存在的。然而,数字系统(如计算机、微处理器等)只能处理数字信号。因此,需要 ADC 将模拟信号转换成数字信号,以便数字系统进行处理、存储和分析。

二、工作原理

 ADC 通过对输入的模拟信号进行采样和量化来实现转换。采样是在一定的时间间隔内对模拟信号进行测量,得到一系列离散的样本值。量化则是将这些样本值转换为有限个数字值的过程。量化的精度取决于 ADC 的位数,位数越高,量化误差越小,转换的精度就越高。

三、参数指标

 1. 分辨率:通常用位数来表示,如 8 位、12 位、16 位等。分辨率决定了 ADC 能够区分的最小模拟信号变化量。 2. 转换速率:指 ADC 每秒能够完成的转换次数。转换速率决定了 ADC 对快速变化的模拟信号的跟踪能力。 3. 精度:包括绝对精度和相对精度。绝对精度表示实际转换结果与理想转换结果之间的偏差;相对精度则是相对于满量程的偏差。 4. 输入范围:指 ADC 能够接受的模拟信号的幅度范围。

四、应用领域

 1. 通信领域:在无线通信系统中,ADC 用于将接收到的模拟射频信号转换为数字信号进行处理。例如,手机中的基带芯片就包含了高性能的 ADC。 2. 仪器仪表:各种测量仪器如示波器、万用表等都需要 ADC 将模拟测量信号转换为数字信号进行显示和分析。 3. 工业控制:在工业自动化系统中,ADC 用于将传感器采集到的模拟信号转换为数字信号,以便控制器进行处理和控制。 4. 音频处理:在音频设备中,ADC 将模拟音频信号转换为数字信号进行存储、处理和播放。

2.如何配置s3c2440中的adc?

代码:

#include "adc.h"void adc_init()
{ADCCON = (1 << 14) | (19 << 6) | (1 << 1) ;
}unsigned short adc_read(void)
{unsigned short value =  ADCDAT0 & 0x3ff;while(!ADCCON & (1  << 15)) ;value = ADCDAT0 & 0x3ff;return value;
}void set_channel(unsigned int num)
{ADCCON &= ~(0x7 << 3);ADCCON |=  (num << 3);
}

中断

1.什么是中断?

在计算机系统中,中断是一种非常重要的机制。

一、定义

 中断是指计算机在执行程序的过程中,由于出现了某些突发事件(如外部设备请求服务、定时器溢出等),暂停当前正在执行的程序,转而去执行相应的中断处理程序,处理完突发事件后再返回到被中断的程序继续执行。

二、中断的作用

 1. 实现实时处理:当外部设备有数据需要处理时,可以通过中断请求让计算机立即响应,从而实现对外部事件的实时处理。 2. 提高系统效率:在没有中断的情况下,计算机需要不断地查询外部设备的状态,这种方式浪费了大量的 CPU 时间。而有了中断机制,CPU 可以在等待外部设备准备好数据的过程中执行其他任务,提高了系统的效率。 3. 实现多任务处理:中断可以让计算机在执行一个任务的同时,响应其他任务的请求,从而实现多任务处理。

三、中断的类型

 1. 硬件中断:由外部设备(如键盘、鼠标、打印机等)产生的中断,通过硬件电路向 CPU 发送中断请求信号。 2. 软件中断:由程序中的特定指令(如 INT 指令)产生的中断,通常用于实现系统调用、异常处理等功能。

四、中断处理过程

 1. 中断请求:当外部设备需要服务或发生突发事件时,向 CPU 发送中断请求信号。 2. 中断响应:CPU 在执行完当前指令后,检测到中断请求信号,如果允许中断,则暂停当前程序的执行,保存当前程序的状态(如程序计数器、寄存器等),然后转去执行相应的中断处理程序。 3. 中断处理:中断处理程序根据中断类型进行相应的处理,如读取外部设备的数据、处理异常情况等。 4. 中断返回:中断处理完成后,恢复被中断程序的状态,返回到被中断的程序继续执行。

2.如何配置中断?

代码:

#include <s3c2440.h>
#include "irq.h"void eint8_init(void)
{//配置GPG0引脚功能为EINT8GPGCON &= ~(0x3 << 0);GPGCON |= (0x2 << 0);EXTINT1 &= ~(0x7 << 0);EXTINT1 |= (0x2 << 0);    // 下降沿触发EINTMASK &= ~(1 << 8);    // 使能eint8INTMSK &= ~(1 << 5);	  // 使能eint8_23
}static irq_handle_t irq_handle_vector[60];void c_deal_irq(void)
{unsigned int irq_num = INTOFFSET;if(irq_num == 5){ irq_handle_vector[irq_num + 31]();EINTPEND |= (1 << (irq_num + 3));}elseirq_handle_vector[irq_num]();SRCPND |= (1 << irq_num);INTPND = INTPND;
}void register_irq_handle(unsigned int num, irq_handle_t handler)
{irq_handle_vector[num] = handler;	
}
	     preserve8						 ;对齐规则area reset, code, 	readonly	 ;设定属性code32			                 ;使用32位位宽ARMentry			                 ;开始处b start         ;resetnop 			 ;undefb deal_swi      ;swinop             ;prefetch abortnop			 ;data abortnop			 ;reservedb deal_irq			 ;irqnop			 ;fiqdeal_irqsub lr, lr, #4			   ;获得irq的值stmfd sp!, {r4-r12, lr}	   ;保护现场import c_deal_irq		   bl c_deal_irq			   ;跳转对应的函数ldmfd sp!, {r4-r12, pc}^   ;带模式切换的恢复现场
deal_swistmfd sp!, {r4-r12, lr}	   ;保护现场sub r0, lr, #4			   ;获得swi的值ldr r1, [r0]               ;取出swi的地址值bic r0, r1, #(0xff << 24)  ;取出swi的值import c_deal_swi		   bl c_deal_swi			   ;跳转执行swi的值对应的函数ldmfd sp!, {r4-r12, pc}^   ;带模式切换的恢复现场
startldr sp, =0x40001000  ;初始化svc模式的栈mrs r0, cpsr		 ;取出cpsr的值bic r0, r0, #(1 << 7)	 msr cpsr_c, r0		mrs r0, cpsr		 ;取出cpsr的值bic r0, r0, #0x1f	 ;清零orr r0, r0, #0x12	 ;置一msr cpsr_c, r0		 ;切换工作模式到irqldr sp, =0x40000c00	 ;初始化irq模式的栈mrs r0, cpsr		 ;取出cpsr的值bic r0, r0, #0x1f	 ;清零orr r0, r0, #0x10	 ;置一msr cpsr_c, r0		 ;切换工作模式到userldr sp, =0x40000800	 ;初始化user模式的栈import mainbl mainswi #7end  				 ;结束

UART

1.什么是UART?

在芯片和通信领域中,UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器。

一、功能

 UART 主要用于在两个设备之间进行异步串行数据通信。它可以将并行数据转换为串行数据进行发送,同时也可以将接收到的串行数据转换为并行数据。

二、工作原理

 1. 数据发送:发送方将并行数据加载到 UART 的发送数据寄存器中,UART 按照设定的波特率(数据传输速率)将数据逐位发送出去。每一位数据的发送时间由波特率决定。发送时通常会添加起始位、数据位、校验位和停止位等组成一帧数据。 2. 数据接收:接收方的 UART 持续监测输入线路上的信号。当检测到起始位时,开始接收数据位,并根据设定的波特率进行采样。接收完一帧数据后,进行校验(如果有校验位),然后将数据存储在接收数据寄存器中,供接收设备读取。

三、主要特点

 1. 异步通信:发送和接收设备不需要同步时钟信号,而是通过起始位和停止位来实现数据的同步。这使得 UART 在不同时钟频率的设备之间进行通信时非常方便。 2. 简单易用:UART 的接口相对简单,只需要几根信号线(如发送线、接收线、地线等)就可以实现通信。 3. 广泛应用:UART 被广泛应用于各种电子设备中,如微控制器、计算机、传感器、通信模块等。它可以用于与其他设备进行数据交换、调试和监控等。

四、参数指标

 1. 波特率:表示数据传输的速率,单位为比特每秒(bps)。常见的波特率有 9600、115200 等。 2. 数据位:表示每帧数据中的有效数据位数,常见的有 5 位、6 位、7 位、8 位等。 3. 校验位:用于检测数据传输过程中的错误,可以选择无校验、奇校验或偶校验。 4. 停止位:表示每帧数据结束的标志位,常见的有 1 位、1.5 位、2 位等。

2.UART的数据帧格式

  1. 数据帧格式
    • 起始位:当不传输数据时,UART 数据传输线通常保持高电压电平(逻辑 “1”)。要开始数据传输,发送方会将传输线从高电平拉到低电平,并保持 1 个时钟周期,这个低电平信号就是起始位,用于向接收方表示数据传输的开始。
    • 数据位:紧接起始位之后的是数据位,数据位的个数可以根据具体需求进行设置,通常为 5 位到 8 位。如果使用奇偶校验位,数据帧长度一般是 5 位到 8 位;如果不使用奇偶校验位,数据帧长度可以是 9 位。数据位是要传输的实际信息,一般按照最低有效位优先(LSB First)的方式发送。
    • 奇偶校验位(可选):奇偶校验位是在数据位之后的额外一位,用于检验数据传输过程中是否发生错误。奇偶校验分为奇校验和偶校验。如果是偶校验,数据帧中 “1” 的个数加上奇偶校验位后应为偶数;如果是奇校验,数据帧中 “1” 的个数加上奇偶校验位后应为奇数。接收方根据校验规则对接收到的数据进行校验,如果校验结果不匹配,则认为数据传输出现错误。
    • 停止位:为了表示数据包结束,发送方将数据传输线从低电压驱动到高电压,并保持 1 到 2 位时间。停止位是数据帧的结束标志。

3.如何配置UART(s3c2440)

代码如下:

#include <s3c2440.h>
#include "uart.h"void uart0_init(void)
{//配置GPH2、3引脚功能为TXD、RXDGPHCON &= ~(0xf << 4);GPHCON |= (0xa << 4);ULCON0 &= ~(1 << 6); //普通模式ULCON0 &= ~(0x7 << 3);  //无校验ULCON0 &= ~(1 << 2);   //1位停止位ULCON0 |= (0x3 << 0);  //8位数据位UCON0 &= ~(0xf << 12);UCON0 |= (4 << 12);   // FCLK / 10UCON2 |= (1 << 15);   // 使能FCLK/nUCON0 |= (0x3 << 10);  //uart时钟选择为fclk/nUCON0 &= ~(0xf << 0);UCON0 |= (0x5 << 0);  //中断或轮询模式UBRDIV0 = 259;    //波特率  9600UFCON0 |= (1 << 0);  //使能FIFOUFCON0 |= (1 << 1);  //复位RX FIFO
}unsigned char uart_send(unsigned char * data, unsigned char len)
{int i = 0;for(i = 0; i < len; i++){while(!(UTRSTAT0 & (1 << 2)));UTXH0 = data[i];}return i;
}unsigned char uart_recv(unsigned char * data, unsigned char len)
{int i = 0;unsigned char count = UFSTAT0 & 0x3f;unsigned char num = (count < len) ? count : len;for(i = 0; i < num; i++){data[i] = URXH0;}return num;
}void uart0_handler(void)
{unsigned char count = UFSTAT0 & 0x3f;unsigned char data[64] = {0};int i = 0;for(i = 0; i < count; i++){data[i] = URXH0;}uart_send(data, i);
}
#include <s3c2440.h>
#include "irq.h"void eint8_init(void)
{//配置GPG0引脚功能为EINT8GPGCON &= ~(0x3 << 0);GPGCON |= (0x2 << 0);EXTINT1 &= ~(0x7 << 0);EXTINT1 |= (0x2 << 0);    // 下降沿触发EINTMASK &= ~(1 << 8);    // 使能eint8INTMSK &= ~(1 << 5);	  // 使能eint8_23
}void uart0_irq_init(void)
{//配置GPH2、3引脚功能为TXD、RXDGPHCON &= ~(0xf << 4);GPHCON |= (0xa << 4);ULCON0 &= ~(1 << 6); //普通模式ULCON0 &= ~(0x7 << 3);  //无校验ULCON0 &= ~(1 << 2);   //1位停止位ULCON0 |= (0x3 << 0);  //8位数据位UCON0 &= ~(0xf << 12);UCON0 |= (4 << 12);   // FCLK / 10UCON2 |= (1 << 15);   // 使能FCLK/nUCON0 |= (0x3 << 10);  //uart时钟选择为fclk/nUCON0 &= ~(0xf << 0);UCON0 |= (0x5 << 0);  //中断或轮询模式UBRDIV0 = 21;    //波特率  9600UFCON0 |= (1 << 0);  //使能FIFOUFCON0 |= (1 << 1);  //复位RX FIFOUFCON0 &= ~(0x3 << 4);UFCON0 |= (0x1 << 4);  //rxd触发深度8字节UCON0 |= (1 << 7);   //rx超时使能INTMSK &= ~(1 << 28);	//使能UART0中断INTSUBMSK &= ~(1 << 0);		//使能UART0_RXD中断
}static irq_handle_t irq_handle_vector[60];void c_deal_irq(void)
{unsigned int irq_num = INTOFFSET;if(irq_num == 5){ irq_handle_vector[irq_num + 31]();EINTPEND |= (1 << (irq_num + 3));}else if(irq_num == 28){if(SUBSRCPND & 0x1){	irq_handle_vector[39]();SUBSRCPND |= 0x1;}}elseirq_handle_vector[irq_num]();SRCPND |= (1 << irq_num);INTPND = INTPND;
}void register_irq_handle(unsigned int num, irq_handle_t handler)
{irq_handle_vector[num] = handler;	
}

注意代码不全仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559229.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一站式服务,产业园运营让创业更轻松!

一站式服务&#xff0c;也被称为“一条龙服务”或“全流程服务”&#xff0c;它是指企业或机构为了满足客户或用户的需求&#xff0c;整合内部资源&#xff0c;通过优化服务流程、提高服务效率&#xff0c;从而提供从咨询、受理、办理到反馈等各个环节的完整、连续、高效的服务…

汽车主机厂主数据管理中一物多码或多码一物问题的具体表现有哪些?

数据入口多导致重复编码 在汽车主机厂的主数据管理中&#xff0c;由于存在多个数据入口&#xff0c;不同部门或环节可能会独立进行数据录入。这就容易出现一物多码或多码一物的情况。例如&#xff0c;采购部门、生产部门、物流部门等可能各自采用不同的编码体系来标识同一种汽…

车辆路径规划问题(VRP)优化方案

车辆路径规划问题&#xff08;VRP&#xff09;优化方案 车辆路径规划问题&#xff08;Vehicle Routing Problem, VRP&#xff09;是物流领域中一个经典的组合优化问题&#xff0c;目标是在满足客户需求的情况下&#xff0c;找到一组车辆的最优配送路径&#xff0c;以最小化总的…

PMP11月考试中文报名10月9日开始!

经过PMI与中国国际人才交流基金会的联合研究决定&#xff0c;2024年度第四期PMI认证考试将于11月30日进行。 为了让各位考生能够充分准备&#xff0c;我们特此梳理了本次考试的具体安排及注意事项&#xff0c;请务必仔细阅读&#xff01; 报名时间安排&#xff1a; &#xf…

使用Python批量修改文件修改日期为随机的6到8月份

使用Python批量修改文件修改日期为随机的6到8月份 每当雪花飘起的时候&#xff0c;总有一股抹不去的情节&#xff0c;会想起儿时雪天的记忆&#xff0c;虽然模糊但也清晰。那时每年的冬季很冷&#xff0c;但依然喜欢飘雪的日子&#xff0c;看着满天迷蒙飘舞的雪花总有想不完的心…

microsoft edge浏览器卡死问题

win11经常遇到microsoft edge浏览器卡死的情况&#xff0c;有时候是一会没用浏览器就全部卡死&#xff0c;有时候是锁屏或者电脑休眠浏览器就不能用&#xff0c;找了很多的办法都没好使&#xff0c;用以下方法好使了&#xff1a; edge浏览器中打开 edge://settings/system 把 …

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题&#xff0c;就是在服务器外网架设时&#xff0c;建好角色点开始游戏提示此服务器满员&#xff0c;这个问题一般比较少见&#xff0c;而且出现的话一般都是GEE引擎的版本。 他折腾了半天&#xff0c;一直没进游戏&#x…

apt update报错:ModuleNotFoundError: No module named ‘apt_pkg‘(可能是默认python版本被改坏了)

文章目录 错误信息分析1. 确保 apt_pkg 模块已安装2. 检查 Python 版本3. 重新配置 Python4. 修复损坏的依赖5. 检查环境变量 尝试 错误信息 (base) rootkyai:/ky/tml/ky_ai_get_server_info# apt update 获取:1 file:/var/cuda-repo-cross-aarch64-ubuntu2004-11-4-local InR…

简易入门:使用Docke 部署一个tomcat服务

简易入门&#xff1a;使用Docke 部署一个tomcat服务 # 拉取 >docker pull tomcat:9.0# 后台运行容器&#xff0c;端口映射为8080. -p 宿主机端口:容器端口 >docker run -d --name tomcat-c-01 -p 8080:8080 tomcat:9.0# 查看容器id >docker ps CONTAINER ID IMAG…

Go语言对接微信支付与退款全流程指南

在互联网技术日益发展的今天&#xff0c;线上支付已成为不可或缺的一部分。作为一门简洁高效的编程语言&#xff0c;Go&#xff08;又称Golang&#xff09;凭借其强大的并发处理能力和高效性能&#xff0c;在后端开发领域越来越受到开发者的青睐。本文将详细介绍如何使用Go语言…

【Java SE基础回顾】看这篇就够了!

JavaSE复习 参考视频&#xff1a;【狂神说Java】JavaSE阶段回顾总结 简单的就不讲了&#xff0c;比如什么break和continue区别&#xff0c;甚至一些什么什么继承封装多态的概念等等。 主要写一些Java特有的&#xff0c;重点的基础知识。主要还是例子和代码更多&#xff0c;更有…

对象存储之阿里云OSS最详细的实现

Hello&#xff0c;大家好&#xff0c;我是Feri&#xff0c;一枚十多年的程序员&#xff0c;同时也是一名在读研究生&#xff0c;关注我&#xff0c;且看一个平凡的程序员如何在自我成长&#xff0c;只为各位小伙伴提供编程相关干货知识&#xff0c;希望在自我蜕变的路上&#x…

【JS】环形链表怎么找入口?

思路 判断是否有环&#xff1a;定义快慢指针&#xff0c;慢指针&#xff08;slow&#xff09;走一步&#xff0c;快指针&#xff08;fast&#xff09;走两步。 无环&#xff1a;快指针最终会到达链表的末尾&#xff08;即fast.next为null&#xff09;,永远不可能相遇有环&#…

C++ 二叉搜索树转换为双向链表

描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表: 代码 #include <iostream> #include <string> #include <optional>struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x): val(x), left(…

陈零九全新单曲《也曾想走进你的心底》 揭露爱而不得的情感遗憾

图片提供&#xff1a;种子音乐 “创作男神”陈零九于10月9日推出充满深情的全新创作单曲《也曾想走进你的心底》&#xff0c;这首歌再次延续他招牌的“九式情歌”风格&#xff0c;展现其创作魅力。歌曲以一段“爱而不得”的感情故事为主线&#xff0c;深入探讨人们在爱情中的复…

项目启动 | 盘古信息赋能奥尼视讯数字化转型升级,实现全面数智化发展

随着信息技术的飞速发展与全球市场竞争的日益激烈&#xff0c;传统制造业正面临生存和发展的危机&#xff0c;制造企业为谋求发展&#xff0c;纷纷开启数字化转型之路&#xff0c;深度融入数字技术&#xff0c;实现生产流程的智能化、管理模式的精细化以及产品服务的个性化&…

科普|网络准入控制系统是什么?2024年好用的网络准入控制系统推荐!

在宁波的传统习俗中&#xff0c;有一个有趣的谚语故事——“阿旺炒年糕”。 据说&#xff0c;宁波的男子名字中多“旺”&#xff0c;凡名字中有“旺”者&#xff0c;小名就被叫作“阿旺”。炒年糕须用慢火&#xff0c;但有一位不懂家务的男子心急&#xff0c;用旺火炒年糕&…

LSTM(长短时记忆网络)

一、引言 在处理序列数据时&#xff0c;循环神经网络&#xff08;RNN&#xff09;虽然能够处理序列数据并保留历史信息&#xff0c;但在实践中发现它对于捕捉长时间依赖关系的能力有限&#xff0c;尤其是在训练过程中容易遇到梯度消失或梯度爆炸的问题。为了解决这些问题&…

组装首页:其他组件html、css移入JS中再引入首页

组装首页 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>组装首页</title><style>* …

【计算机方向】IEEE二区宝刊,IF=9.6,2个月秒速接受,备受国人吹捧!

期刊解析 01 期刊信息✦ 期刊名称&#xff1a;IEEE Transactions on Affective Computing 出版商&#xff1a;Institute of Electrical and Electronics Engineers Inc. ISSN&#xff1a;1949-3045 …