![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程
文章平均质量分 72
嵌入式开发白菜
这个作者很懒,什么都没留下…
展开
-
如何从bootloader开始嵌入式学习?
这需要一定的硬件知识,不求你能设计硬件,但是至少能看懂;答:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。对于bootloader,我学习时是先看了<ARM体系架构与编程>,然后自己写程序把各个硬件的实验都做了一遍,在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。2. 但是Flash一般是只能读不能直接写的,如果我用到全局变量,这些全局变量在哪里?4. 内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?原创 2023-11-01 09:57:44 · 298 阅读 · 0 评论 -
作为一个新人,怎样学习嵌入式Linux?
在嵌入式Linux里也许我们用QT也许用Android,这个时候你应该去学学QT、Android的编程。你学过VC的话,也是要花时间去了解那些类、控件的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序和PC上的程序开发没什么差别。学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。回到主题,首先我们要明白你的目的是什么,大概来说所谓。,这是我的专长,倒是可以说一点。,不涉及界面这些东西,原创 2023-10-31 13:37:05 · 231 阅读 · 0 评论 -
怎么避免野指针?
(3)所以NULL的实质其实就是地址0,然后我们给指针赋初值为NULL,其实就是让指针指向0地址处。为什么指向0地址处?(1)野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向一个可用的内存空间),然后去解引用。(2)知道了野指针产生的原因,避免方法就出来了:在指针的解引用之前,一定确保指针指向一个绝对可用的空间。(2)在C语言中,int *p,你可以p = (int *)0,但是不可以p = 0,因为类型不同。第三点:在指针解引用之前,先去判断这个指针是不是NULL。原创 2023-10-30 09:07:02 · 277 阅读 · 0 评论 -
嵌入式学习笔记(65)野指针问题
第三种情况就是指向了一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说是程序的一个变量x),那么野指针的解引用就会刚好修改这个变量x的值,导致这个变量莫名其妙的被改变,程序出现离奇的错误。(5)指针变量如果是局部变量,则分配在栈上,本身遵从栈的规律(反复使用,使用完不擦出,所以是脏的,本次在栈上分配到的变量的默认值是上次这个栈空间被使用时余留下来的值),就决定了栈的使用多少会影响这个默认值。(1)野指针,就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)原创 2023-10-29 15:23:43 · 97 阅读 · 0 评论 -
嵌入式学习笔记(64)指针带来的一些符号的理解
譬如“我回家了”,这里面的家指的是你家的房子(类似于左值);我们写的代码是给编译器看的,代码要想达到你想象的结果,就必需要编译器对你的代码的理解和你自己对代码的理解一样。当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个变量所对应的内存空间中存储的那个数。(2)*在用于指针相关功能的是后续有2种用法:第一种是指针定义时,*结合前面的类型用于表明要定义的指针的类型;取地址符使用时直接加在一个变量的前面,然后取地址符和变量加起来构成一个新的符号,这个符号表示这个变量的地址。原创 2023-10-28 17:56:59 · 127 阅读 · 0 评论 -
嵌入式学习笔记(63)指针到底是什么
在汇编中都有间接访问(CPU访问内存通过CPU中的寄存器写入内存地址来实现间接访问,譬如:ldr r0, [r1] 将CPU中的r1寄存器中保存的DDR内存地址处所保存在DDR内存中的值赋值给r0寄存器),其实就是CPU的寻址方式中的间接寻址。(2)此时如果我们解引用p,则相当于我们访问了这个随机数字为地址的内存空间。(1)当我们int *p 定义一个指针变量p时,因为p是局部变量,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,则值是随机的),所以此时p变量中存储的是一个随机的数字。原创 2023-10-26 10:03:31 · 108 阅读 · 0 评论 -
嵌入式学习笔记(63)位操作实战
说明这个式子应该是 ~(~(0U)<<(m-n+1)) << (n-1) ,这就又分为2部分了。(4)给定一个整形数a,清除a的bit15~bit23,保持其他位不变。(2)给定一个整形数a,设置a的bit3~bit7,保持其他位不变。(3)给定一个整型数a,清除a的bit15,保证其他位不变。(1)给定一个整型数a,设置a的bit3,保证其他位不变。分析为什么要>>(n-1),相当于是我们(5)中的第二步。(5)给定一个整形数a,取出a的bit3~bit8。分析为什么要&,相当于我们(5)中的第一步。原创 2023-10-25 20:42:36 · 280 阅读 · 0 评论 -
嵌入式学习笔记(62)如何用位运算构建特定二进制数
(譬如本例中要构造的数bit4~bit10为0其余位为1,那我们就先构造一个bit4~bit10为1,其余位为0的数,然后对这个数按位取反即可) ~(0x7f<<4)(1)从上节可知,对寄存器特定位进行置1或者清0或者取反,关键性的难点在于要事先构建一个特别的数,这个数和原来的值进行位与、位或、位异或等操作,即可达到我们对寄存器操作的要求。(2)更难一点的要求:获取bit3~bit7为1,同时bit23~bit25为1,其余位为0的数:((0x1f<<3) | (0x7<<23))原创 2023-10-24 15:18:28 · 119 阅读 · 0 评论 -
嵌入式学习笔记(61)位操作寄存器时的特殊作用
读改写的操作理念,就是:当我想改变一个寄存器中某些特定位时,我不会直接去给他写,我会先读出寄存器整体原来的值,然后在这个基础上修改我想要修改的特定位,再将修改后的值整体写入寄存器。(2)如果希望将一个寄存器的某些特定位变成0而不影响其他位,可以构造一个合适的1和0组成的数和这个寄存器原来的值进行位与操作,就可以将特定位清零。我们要构造这样一个数:要置1的特定位为1,其他位为0,然后将这个数与原来的数进行位或即可。(1)回顾上节讲的位或操作的特点:任何数,其实就是1或者0)与1位或变成1,与0位或无变化。原创 2023-10-23 09:39:05 · 184 阅读 · 0 评论 -
嵌入式学习笔记(61)位操作符
(3)从真值表可以看出:位或操作的特点是:只有2个0相位或才能得到0,只要有1个1结果就一定是1.位异或:(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化。(1)位异或真值表:1^1=0 0^0=0 1^0=1 0^1=1。位与:(任何数,其实就是1或者0)与1位与无变化,与0位与变成0。位或:(任何数,其实就是1或者0)与1位或变成1,与0位或无变化。(2)真值表:1&0=0 1&1=1 0&0=0 0&1=0。(2)真值表:1|0=1 1|1=1 0|0=0 0|1=1。原创 2023-10-22 10:28:41 · 166 阅读 · 0 评论 -
嵌入式学习笔记(60)内存管理之堆
如果申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,但是进程自己又以为这段内存已经不用了,再用的时候又会去申请新的内存块,这就叫吃内存。它的工作原理是:先重新创建一个新的数组大小为要更改后的数组,然后将原数组的所有元素复制进新的数组,然后释放掉原数组,最后返回新的数组给用户。内存管理对OS来说是一件非常复杂的事,因为首先内存容量大,其次内存需求在时间和大小块上没有规律(OS上运行着几十、几百、几千个进程随时都会申请或者释放内存,申请或者释放的内存块大小随意)。原创 2023-10-21 10:14:22 · 191 阅读 · 0 评论 -
嵌入式学习笔记(59)内存管理之栈
我们在C语言中定义一个局部变量时(int a),编译器会在栈中分配一段空间(4字节)给这个局部变量用(分配时栈顶指针会移动给出空间,给局部变量a用的意思就是,将这字节的栈内存的内存地址和我们定义的局部变量名a给关联起来),对应栈的操作是入栈。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的(也就是随机值)。首先,栈是有大小的。队列的特点是入口和出口都有,必须从入口进,从出口出,所以先进去的必须先出来,否则就堵住后边的。原创 2023-10-20 17:50:15 · 152 阅读 · 0 评论 -
嵌入式学习笔记(59)内存管理之结构体
不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。这样包含了函数指针的结构体就类似于面向对象中的class,结构体中的变量类似于class中的成员变量,结构体中的函数指针类似于class中的成员方法。数组的优势:数组比较简单,访问使用下标,可以随机访问(就是可以通过下标随机访问需要访问的元素)。数组的缺陷:(1)数组中元素类型必须相同 (2)数组大小必须在定义时给出,而且一旦给出不能更改。C语言作为面向过程的语言,可以通过结构体内嵌指针实现面向对象的代码。原创 2023-10-19 09:41:29 · 132 阅读 · 0 评论 -
嵌入式学习笔记(58)C语言的内存操作
在很多情况下,我们定义的8位char变量,编译器会帮我们分配32位内存来存储这个char变量,也就是说浪费了24位的内存,但是效率高。CPU要访问一个int型数据,则首先取地址,这里的地址指的是int型数据单元的首地址,即4字节中的首字节的地址,然后就可以读取到这4个字节空间中所保存的数据。在程序运行中,CPU实际只认识内存地址,而不关心这个地址所代表的空间在哪里、怎么分布等这些实体问题,因为硬件设计保证了这个地址就一定能找到这个格子,所以内存单元的2个概念:地址和空间是内存单元的两个方面。原创 2023-10-18 09:59:31 · 162 阅读 · 0 评论 -
嵌入式学习笔记(57)LCD如何显示图像
(1)LCD驱动器一般和LCD显示面板集成在一起(本来是分开的,做面板的是只做面板的,譬如说三星、LG、台湾的友达、奇美都是做面板的;LCD驱动器芯片负责给面板提供控制液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于自己的数字接口,这个接口就是LCD屏幕的外部接口(第二节中讲到的接口)。(2)像素可以被单独控制,或控制其亮或不亮(单色屏)、或控制其亮度强弱(譬如亮50%,35%,这样叫灰度屏,以前的黑白电视机)、或控制其显示一定的颜色(这就是我们现在最常用的彩色显示屏)。原创 2023-10-16 09:10:21 · 367 阅读 · 0 评论 -
嵌入式学习笔记(56)LCD的接口技术
(3)TTL电平的缺陷就是不能传递太远,如果LCD屏幕和主机控制器太远(1米甚至更远)就不能直接TTL连接了,要进行转换。(2)SoC的LCD控制器硬件接口是TTL电平的,LCD这边硬件接口也是TTL电平的。(4)VCLK(像素时钟):LCD工作时需要主板控制器给LCD模组一个工作时钟信号,就是VCLK。(6)LEND(行结束标志,不是必须的):时序信号,非必须,譬如x210接口就没有。(3)VSYNV(垂直同步信号):时序信号线,为了让LCD能够正常显示给的控制信号。(2)HSYNC(水平同步信号)原创 2023-10-15 09:39:18 · 205 阅读 · 0 评论 -
嵌入式学习笔记(55)LCD简介
(2)液晶是一种材料,液晶这种材料具有一种特点:可以在电信号的驱动下液晶分子进行旋转,旋转时会影响透光性,因此我们可以在整个液晶面板后面用白光照(称为背光),可以通过不同电信号让液晶分子进行选择性的透光,此时在液晶面板前面看到的就是各种各样不同的颜色,这就是LCD显示。有些显示器(譬如LED显示器、CRT显示器)自己本身会发光称为主动发光,有些(LCD)本身不会发光只会透光,需要背光的协助才能看起来是发光的,称为被动发光。(4)液晶应用领域:电视机、电脑显示屏、手机显示屏、工业显示屏等····原创 2023-10-14 19:57:22 · 182 阅读 · 0 评论 -
嵌入式学习笔记(54)S5PV210的ADC控制器
(1)等待触摸屏转换完毕的方法有2种:一种是检查标志位,第二种是中断。第一种方法是同步的,第二种方式是异步的。(2)AD转换都是需要反复进行的,那么转完一次一般要立即开启下一次转换,所以需要有一种机制能够在一次转完时自动开启下一次转换。这个机制就叫start by read,这个机制的工作方法是:当我们读取本次AD转换的AD值后,硬件自动开启下一次AD转换。数字引脚和模拟引脚一般是不能混用的。(2)电阻式触摸屏本身工作时就依赖于AD转换,所以在210的SoC中电阻触摸屏接口本身和ADC接口是合二为一的。原创 2023-10-13 15:24:37 · 138 阅读 · 0 评论 -
嵌入式学习笔记(53)ADC的主要相关概念
(4)AD的模拟量程一样的情况下,AD精度位数越多精度越高,测出来的值越准。譬如2个AD,A的量程是0~50V,B的量程是0~0.5V,A是12位的,B是10位的,可能B的精度比A的还要高。这个时间需要多久,不同的芯片是不一样的,同一颗芯片在配置不一样(譬如说精度配置为10位时时间比精度配置为12位时要小,譬如说有些AD可以配转换时钟,时钟频率高则转换时间短)时转换时间也不一样。(1)AD转换输出的数字值是有一定的位数的(譬如说10位,意思就是输出的数字值是用10个二进制位来表示的,这种就叫10位AD)。原创 2023-10-12 15:11:07 · 221 阅读 · 0 评论 -
嵌入式学习笔记(52)ADC的引入
(2)数字的就是离散的,离线的就是不连续的。数字化就是离散化,就是把连续分布的模拟量按照一定精度进行取点(采样)变成有限多个不连续分布的数字值,就叫数字量。(1)模拟的就是连续的,现实生活当中的时间、电压、高度等都是模拟的(连续分布的,划分的话可以无限的更小划分)。(2)CPU本身是数字的,而外部世界变量(如电压、温度、高度、压力···)都是模拟的,所以需要用CPU来处理这些外部的模拟变量的时候就需要做AD转换。(4)计算机处理参量的时候都是数字化的,计算机需要数字化的值来参与运算。原创 2023-10-11 10:02:41 · 176 阅读 · 0 评论 -
嵌入式学习笔记(51)X210板载gsensor介绍
(2)I2C从设备地址本身是7位的,但是在I2C通信中发送I2C从设备地址时实际发送的是8位,这8位中高7位(bit7~bit1)对应的I2C从设备的7位地址,最低一位(LSB)存放的是R/W信息(就是说下一个数据时主设备写从设备读(对应0),还是主设备读从设备写(对应1))(3)重力加速度传感器、地磁传感器、陀螺仪等三个传感器结合起来,都是用来感测运动的速度、方位等信息的,所以现在有9轴传感器,就是把三者结合起来,并且用一定的算法进行综合得出结论,目的是更加准确。(2)可以用来设计智能手表的计步器功能。原创 2023-10-10 09:48:03 · 237 阅读 · 0 评论 -
嵌入式学习笔记(50)S5PV210的I2C控制器
(3)移位寄存器(shift register),将代码中要发送的字节数据,通过移位寄存器变成1个位一个位的丢给SDA线上去发送/接收。(1)时钟部分,时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。(3)第二级分频是得到最终I2C控制器工作的时钟,以I2CCLK这个中间时钟为来源,分频系数为[1,16]。(4)最终要得到的时钟是2级分频后的时钟,譬如一个可用的设置是:65000KHz/512/4=31KHz。(4)地址寄存器+比较器。原创 2023-10-09 22:25:31 · 106 阅读 · 0 评论 -
嵌入式学习笔记(49)由I2C学通信时序
如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没收到ACK,主设备就认为刚才给从设备发送的8位不对(接收失败)。(2)主设备在每个通信周期会先发8位的从设备地址(其实8位中只有7位是从设备地址,还有1位表示主设备下面是要写入还是读出)到总线(主设备是以广播的形式发送的,只要是总线上的所有设备其实都能收到这个信息)。(4)在某一通信时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。原创 2023-10-08 14:55:31 · 197 阅读 · 0 评论 -
嵌入式学习笔记(48)什么是I2C通信
(3)每一个I2C从设备在通信中都有一个I2C从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要知道自己将要通信的那个设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。(4)低速率:I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(一般几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程时要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率)。(2)主设备来负责调度总线,决定某一时间和哪个从设备通信。原创 2023-10-07 13:37:33 · 153 阅读 · 0 评论 -
嵌入式学习笔记(47)Nand的常见操作及流程分析
等待方法是SoC不断读取状态寄存器(这个状态寄存器有2种情况:一种是SoC的Nand控制器自带的,另一种是SoC通过发命令得到命令响应得到的),然后通过检查这个状态寄存器的状态位就能知道Nand接口电路刚才写的那一页数据写完了没、写好了没。当我们操作Nand芯片时,只要按照SoC的要求按时打开ECC生成开关,则当我们写入Nand芯片时SoC的Nand控制器的ECC模块会自动生成ECC数据放在相应的寄存器中,然后我们只需将这生成的ECC数据写入Nand芯片的带外数据区即可;(1)擦除时必须给块对齐的地址。原创 2023-10-06 10:55:23 · 354 阅读 · 0 评论 -
嵌入式学习笔记(46) NandFlash的结构
其中2K字节数据带内数据,是我们真正的存储空间,将来存储在Nand中的有效数据就是存在这2K范围内的(我们平时计算Nand的容量时也是只考虑这2KB);(1)Nand的页和以前讲过的块设备(尤其是硬盘)的扇区是类似的。Nand也是一样,不同的Nand的页的大小是不同的,也有512字节/1024字节/2048字节/4096字节等。总结:Nand的组织架构挺乱的,接口时序也不同,造成结果就是不同厂家的Nand芯片,或者是同一个厂家的不同系列型号存储容量的Nand接口也不一样。坏块是不可避免的,而且。原创 2023-10-05 16:41:07 · 322 阅读 · 0 评论 -
嵌入式学习笔记(45) NandFlash的接口
所以Nand是地址编排精确到字节,但是实际读写却只能精确到页(所以Nand的很多操作要求给的地址是页对齐的,譬如2K、4K、512K等这样的地址,不能给3K这样的地址)。Nand接口是一种公用接口,是一种标准,理论上来说外部SoC可以直接模拟Nand接口来读写Nand芯片,但是实际上因为Nand接口对时序要求非常严格,而且时序很复杂,所以一般的SoC都是通过专用的硬件的Nand控制器(这些控制器一般是作为SoC内部外设来存在的)来操控Nand芯片的。(1)Nand有8位数据位的,也有16位数据位的。原创 2023-10-04 11:16:13 · 346 阅读 · 0 评论 -
嵌入式学习笔记(44)S5PV210的SD卡启动实战
它的实现方式是:iROM启动,然后从SD卡的扇区1开始读取16KB的BL1然后去执行BL1,BL1负责初始化DDR,然后从SD卡中读取整个程序(BL1+BL2)到DDR中,然后从DDR中执行(利用ldr pc, =main这种方式以远跳转到iRAM中运行的BL1跳转到DDR中运行BL2)。(3)细节2:uboot在烧录到SD卡的时候,先截取uboot.bin的前16KB(实际脚本截取的是8KB)烧录到SD卡的block1~block32,然后将整个uboot烧录到SD卡的某个扇区中(譬如49扇区)原创 2023-10-04 11:15:25 · 205 阅读 · 0 评论 -
嵌入式学习笔记(43)S5PV210的SD卡启动详解
像我们x210开发板,板子贴片好的时候,内部inand是空的,此时直接启动无启动,因为此时inand是空的,所以第一启动失败,会转入第二启动,就从外部SD2通道的SD卡启动了。SteppingStone(启动基石)技术就是在SoC内部内置4KB的SRAM,然后开机时SoC根据OMPin判断用户设置的启动方式,如果是NandFlash启动,则Soc的启动部分的硬件直接从外部NandFlash中读取开头的4KB到内部SRAM作为启动内容。(2)BL1执行之后剩下的就是软件的事情了,SoC就不用再去操心了。原创 2023-10-03 10:15:33 · 232 阅读 · 0 评论 -
嵌入式学习笔记(42)SD卡的编程接口
(2)SD卡内部出了存储单元Flash外,还有SD卡管理模块,我们SoC和SD卡通信时,通过9针引脚以SD协议/SPI协议向SD卡管理模块发送命令、时钟、数据等信息,然后从SD卡返回信息给SoC来交互。(1)SD卡与SRAM/DDR/SROM之类的东西的不同:SRAM/DDR/SROM之类的存储芯片是总线式的,只要连接上初始化好之后就可以由SoC直接以地址方式来访问,但是SD卡不能直接通过接口给地址来访问, 它的访问需要按照一定的接口协议(时序)来访问。(1)SD协议是专门用来和SD卡通信的。原创 2023-10-03 10:13:56 · 206 阅读 · 0 评论 -
嵌入式学习笔记(41)SD卡启动详解
内存和外存的区别:一般是把这种RAM(random access memory,随机访问存储器,特点是任意字节读写,掉电丢失)叫内存,把ROM(read only memory,只读存储器,类似于Flash SD卡之类的,用来存储东西,掉电不丢失,不能随机地址访问,只能以块为单位来访问)叫外存。这些东西的本质还是NandFlash,内部由Nand的存储颗粒构成,再集成了块设备管理单元,综合了SD卡为代表的各种卡的优势和原始的NandFlash芯片的优势。这样做的好处就是不同厂家的SD卡可以通用。原创 2023-10-02 09:16:09 · 199 阅读 · 0 评论 -
嵌入式学习笔记(41)实时时钟RTC
(3)BCD码的作用在于可以将十进制数拆成组成这个十进制数的各个数字的编码,变成编码后就没有位数的限制了。当我们从寄存器BCDMIN中读取一个时间时(譬如读取到的是0x59),需要将之当做BCD码转成十进制再去显示(0x59当做BCD码就是59,转成十进制的59,所以显示就是59分)。(2)RTC是SoC中一个内部外设,RTC有自己独立的晶振提供RTC时钟源(32.768KHz),内部有一些寄存器用来记录时间(年月日时分秒星期)。(1)RTC中所有的时间(年月日时分秒星期,包括闹钟)都是用BCD码编码的。原创 2023-10-02 09:13:14 · 229 阅读 · 0 评论 -
嵌入式学习笔记(40)看门狗定时器
(4)典型应用情景是:我们在应用程序中打开看门狗设备,初始化好给它一个时间,然后应用程序使用一个线程来喂狗,这个线程的执行时间安全短于看门狗的复位时间。(1)PCLK_PSYS经过两级分频后生成WDT(watchdog timer)的时钟周期,然后把要定的时间写到WTDAT寄存器中,刷到WTCNT寄存器中去减1,减到0时(定时时间到)产生复位信号或中断信号。(5)补充:实战中有时候为了绝对可靠,我们并不会使用SoC中自带的看门狗,而是使用专门的外置的看门狗芯片来实现看门狗。原创 2023-10-01 09:51:46 · 221 阅读 · 0 评论 -
嵌入式学习笔记(39)蜂鸣器和PWM定时器编程实践
(5)据以上分析,只要用PWM波形的电压信号来驱动蜂鸣器,把PWM波形的周期T设置为要发出的声音信号的1/频率即可;(1)蜂鸣器里边有2个金属片,离得很近但没挨着。没电的时候两个金属片在弹簧本身的张力作用下分开彼此平行,有电的时候两边分别充电,在异性电荷的吸力作用下两个片挨着。(2)我们只要以快速的频率给蜂鸣器的正负极供电、断电,进行这样的循环,蜂鸣器的两个弹簧片就会挨着分开挨着分开···形成敲击,发出声音。(3)人耳能听见的声音频率是有限的(20Hz~20000Hz),我们实验时一般给个2KHz的频率。原创 2023-10-01 09:50:41 · 391 阅读 · 0 评论 -
嵌入式学习笔记(37) S5PV210的PWM定时器
(3)工作流程就是:我们事先算好TCNT寄存器中开始减的那个数(譬如300),然后将之写入TCNTB寄存器中,在启动timer前,将TCNTB中的值刷到TCNT寄存器中(有一位寄存器专门用来操作刷数据过去的),刷过去后就可以启动定时器开始计时;(2)S5PV210的5个PWM定时器的时钟源为PCLK_PSYS,timer0和timer1共同使用一个预分频器,timer2、3、4共同使用一个预分频器;可以选择的有1/1、1/2、1/4、1/8、1/16等。(1)叫定时器说明它本质上的原理是定时器。原创 2023-09-30 14:47:44 · 219 阅读 · 0 评论 -
嵌入式学习笔记(36)什么是定时器
(2)定时器内部有1个寄存器TCNT,计时开始时,我们会把一个总的计数值(譬如说300)放入TCNT寄存器中,然后每隔一个时钟周期(假设是1ms)TCNT中的值就会自动减1(硬件自动完成,不需要CPU软件区干预),直到TCNT中减为0的时候,TCNT就会触发定时器中断。(1)定时器与计数器。(1)定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器中断的ISR,从而去执行预先设定好的事件。原创 2023-09-30 14:45:33 · 221 阅读 · 0 评论 -
嵌入式学习笔记(35)外部中断
这个PEND寄存器的位就相当于是一个标志,如果发生了中断但是我们暂时忙来不及去处理时,这个位就一直是1(就是挂起),直到我有空了去处理了这个中断才会手工清除(写代码清除)这个挂起位表示这个中断被我处理了。边沿触发不关心电平的常规状态,只关心电平变化的瞬间(边沿触发不关心电平本身是高还是低,只关心变化是从高到低还是从低到高这个过程)。外部中断是SoC外部的设备,通过外部中断对应的GPIO引脚产生的中断。(2)电平触发就是说GPIO上的电平只要满足条件,就会不停的触发中断。电平触发分为高电平触发和低电平触发。原创 2023-09-30 14:43:27 · 519 阅读 · 0 评论 -
嵌入式学习笔记(34)S5PV210中断处理的编程实战
当发生中断时,硬件会自动把相应中断源的isr的地址从VICnVECTADDR寄存器中推入到VICnADDR寄存器中,所以我们第二阶段的第二步irq_handler中,只需要到对应的VICnADDR寄存器中去拿出isr地址,调用执行即可。思路是先根据中断号intnum判断这个中断属于VIC几,然后在用中断号减去这个VIC的偏移量,得到这个中断号在本VIC的偏移量,然后1<<x位,写入相应的VIC的INTENABLE/INTENCLEAR寄存器即可。4.第四步,isr执行完,中断现场恢复。原创 2023-09-28 09:57:10 · 107 阅读 · 0 评论 -
嵌入式学习笔记(33)S5PV210的第二阶段处理过程
(1)第一个过程,怎么找到具体是哪个中断:S5PV210中因为支持的中断源很多,所以直接设计了4个中断寄存器,每个32位,每位对应一个中断源。当中断发生时,在irq_handler中依次去查询4个中断源寄存器,看哪一个的哪一位被置1,则这个位对应的寄存器就发生中断,即找到了中断编号。210提供了很多寄存器来解决每个中断源对应isr的寻找问题,具体寻找过程和建立过程见下节,实现的效果是当发生相应中断时,硬件会自动将相应isr推入一定的寄存器中,我们软件只要去这个寄存器中执行函数就行了。原创 2023-09-14 10:32:18 · 213 阅读 · 0 评论 -
嵌入式学习笔记(32)S5PV210的向量中断控制器
(1)第一个阶段之所以能够进行,主要依赖于CPU设计时提供的异常向量表机制。第一个阶段的主要任务是从异常发生到响应异常并且保存/恢复现场、跳转到真正的异常处理程序处。可以将异常处理分为2个阶段来理解。第一个阶段是异常向量表跳转;第二个阶段是进入了真正的异常处理程序irq_handler之后的部分。(2)第二个阶段的目的是识别多个中断源中究竟哪一个发生了中断,然后调用相应的中断处理程序来处理这个中断。原创 2023-09-14 10:31:07 · 293 阅读 · 0 评论