这次使用这个DMAC的Multi-buffer传输功能,将两个缓冲区的内容拷贝至一个连续的缓冲区中. 一. DMAC 在M4中,DMA控制器(DMAC)比外设DMA控制器(PDC)要复杂,但是功能更加强大. 为适应不同的传输要求,DMAC 可以进行灵活的自定义配置,甚至配备了一个FIFO缓存.比如可以为源设备和目标设备分别设定传输时,地址的变动方式(递增.递减或固定):以及一次传输的数据量(字节.半字或字). DMAC有4个通道,每个通道可以进行一个传输任务.进行传输的设备可分为“内存”及“非内…
DMAC也可以和外设进行数据交互.之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作.而且由于DMAC有内部的缓冲区,实现起来更为简单. 一. USART设置 因为之前已经做过相关的实验,这里不再重复.需要注意的是,要注意JP11的跳线,以选择正确的协议(RS232).另外,如果使用硬件握手协议的话,注意设置PC端串口通信软件的线路控制信号. 另外,由于不再使用手动的缓冲区和PDC,所以不需要进行相关的设置.同时,也不用再使用USART的接收超时功能. 二. DMAC…
浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel Studio 6中,开发板使用的工程模板中默认就完成了这两部分工作,但这次仍然对设置的方法进行介绍,同时简单测试一下FPU的效率. 一. 编译器设置 AS6.1 SP2中,使用的编译器为arm-none-eabi-gcc.exe,版本为4.7.3.其中“none”表示没有指定操作系统,“eabi”…
很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转换的结果通过UART打印出来.同时,也简单介绍了校准的方法. SAM4E芯片中,ADC是由AFEC管理的.同时,AFEC可以使用一个多路复用器以选择需要转换的信号的通道,也可以通过平均多次ADC转换的结果以提高转换精确度. 一. 电路图 通过顺时针方向旋转该变阻器,PB1引脚电压将变大,其电压变化范…
DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算.Cortex-M4中,配置了一些强大的部件,以提高DSP能力.同时CMSIS提供了一个DSP库,提供了许多数学函数的高效实现. 这次就先做一个简单的尝试,求两个向量的数量积. 一. 硬件 MAC单元 MAC(Multiply-ACcumulate,乘积累加),是DSP中常用的一种运算.Cortex-M4配置了一个32位的MAC单元,它能在1个周期里实现最高难度为32位乘32位再加64位的运算,或是两…
网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍. 一. MAC.PHY和MII IEEE 802.3是现在常用的以太网标准,它定义了物理层(Physical Layer, PHY)和介质访问控制层(Media Access Control, MAC)的标准.另外,在OSI模型中,MAC则处于数据链路层的底层. 而在硬件实现上,M4使用的GMAC…
在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hello World!”,现阶段目标是点亮LCD的背光,学习目标是了解怎么样使用ASF提供的模块. 一. ASF Wizard 新建一个项目,根据所使用的开发板选择模板. 然后可以通过ASF Wizard进行所需模块的配置. 默认情况下,已经选择了两个模块.在之前我们以前使用过了其中Generic bo…
为得到更高的带宽,需要使用更高的波特率.UART波特率的计算已经介绍过了,现在就尝试下调整外设的时钟频率.可以有多种方法调整外设时钟(MCK)的频率,这里先介绍先主要时钟(MAINCK)的设置,其中包括外部晶振的使用. 外设的时钟(MCK)可以在慢时钟(SLCK).主要时钟(MAINCK)和MAINCK经锁相环升频后的时钟PLLACK三者中选择,并可以对选择的时钟进行分频.重置时,MCK使用的时钟为MAINCK,且不分频. MAINCK可以选择使用一个嵌入的快速RC振荡器,或是一个晶体振荡器产生…
让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高端点的技术:中断.还有就是会介绍一下在CMSIS里怎么使用中断. 一.电路 二.实现思路 第一个LED的闪烁还是用之前使用的空循环吧,别把世界弄得太复杂了. 第二个LED的闪烁就稍微自动化一点了:使用一个定时器,让它在到了需要切换引脚电平的时候通知我们一下.这样做的好处就是我们只需在定时器通知时关注…
之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确.现在就使用实时定时器(RTT)来进行更为精确的计时.RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单. RTT内部有一个计数器,并且可以配置这个计数器的时钟.通过配置以及计算,就可以得出经过一段时间后,该计数器的增加值.和之前一样,我们使用空循环来完成延迟,只是延迟退出的条件变为“计数器增加了一个特定的值”. 一. RTT配置 为实现这个功能,需要配置的主要就是分频数了.RTT的时钟可以选择对慢时钟(SCLK,32.7…
最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只有英文手册了.用的板子是SAM4E16E.IDE用的是Atmel Studio.既然是学习单片机,就没有使用asf框架,而是直接采用访问寄存器的方法了. 第一个程序就是控制板子上一个LED灯的闪烁了. 一.电路 通过查看电路图,可以发现有一个蓝色的LED灯连接在PA0引脚上.我们可以通过改变PA0输…
CAN协议具有良好的可靠性,在工业中应用广泛.这次就先熟悉CAN的基本功能. 开发板有两个CAN,每个CAN有8个信箱.这次内容是从CAN0的信箱0发送数据到CAN1的信箱0. 除本次使用的功能外,CAN还有远程帧.强大的错误处理功能. 一.电路 CAN总线上的逻辑数值是用显性电平和隐性电平表示的.“显性”的意思是指在同时传输显性电平和隐性电平时,总线上呈现的是显性电平.显性电平表示逻辑“0”,隐性电平表示逻辑“1”. 在使用CAN的过程中,需要使用一个CAN收发器进行电平的转换与解释.开发板使…
交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() 和printf() 函数进行PC和开发板的交互. 一. C标准函数库 与硬件相关的功能,最终都需要直接访问硬件.这一点,C的标准函数库的实现面对众多的硬件设备,已经无能为力了. Atmel Studio使用的C标准库的实现疑似为Newlib. 在工程的 ASF\sam\utils\syscalls\…
这次大概介绍了一下NAND Flash,以及在ASF中使用它的方法. 一. 接线 这个开发板搭载了一个256 MB,8位的NAND Flash(MT29F2G08ABAEA).引脚接线如下: 偷个懒,直接上引脚复用的图.其中PC14表明该NAND FLASH需要作为SMC的外设0使用.通过使用NANDOE和NANDWE引脚说明需要使用芯片的NAND Flash控制逻辑.另外,PC18复用为输入引脚,用以查询芯片的状态. 二. NAND Flash 组织结构与寻址 NAND Flash的容量较大.…
开发板上配了一个电阻触摸屏,它的控制器是ADS7843,使用SPI进行通信.这次实现的功能是通过SPI接口与该控制器交互,获取触摸屏点击的坐标,并显示在LCD上.略为难点的是SPI作为同步时钟的一种,需要判断时钟的极性以及相位. 为了突出主题,就没有对电阻屏进行校准,显示的是控制器原始的输出值. 一. 电路图 PA12.PA13和PA14引脚的外设A为SPI相关引脚,PA11为SPI的NPCS0.即,该控制器连接在SPI的片选设备0. 二.ADS7843简介 和该控制器交互过程大概如下: 根据设…
在上个例子中,已经在ASF添加了ILI93xx模块,并做好了相关的声明.这次就做好SMC的配置,然后使用ASF提供的API在屏幕上打印出”Hello World!”字样. 一. 电路图 开发板的LCD连接器的接线如图所示.这些连线均按照SMC相应引脚的功能进行了连接,这样的意图很明显就是要让SMC来和LCD进行交互. 有两个引脚需要注意: PD18引脚的外设A是NCS1,即让LCD连接至SMC的片选设备1中. RS线表示“寄存器选择”,根据该引脚的不同电平,会选择访问不同的寄存器.而PC19引脚…
清楚了UART的用法之后,现在来研究一下USART的用法.和上一次差不多,这次也通过USART的串口来实现和PC的通信.和上一次不同的是,USART本身就有接收超时的功能,所以这次就不用TC了. USART和UART相比,功能多了许多,可以配置的选项也更多.虽然最主要的差别是USART可以实现同步通信,但PC的串口没有这个功能,所以我们就先不拿这个功能开刀了. 一. 思路 实现思路和上一次使用UART的PDC差不多,区别只是这次直接使用USART的接收超时功能,而不用TC. 二. 电路图 使用的…
使用PDC进行数据的收发能减少CPU的开销.这次就使用PDC进行UART数据的接收与发送,同时,也利用TC也实现了PDC的接收超时. PDC是针对外设的DMA控制器.对比DMA控制器,它更为简便,与相应外设的结合也更为紧密.比如说,要配置PDC时,首先要启用相应的外设的时钟:同时PDC收发的状态是通过外设上的寄存器反映出来的:甚至中断也是通过相应外设产生的. 使用PDC时,只需设置好传输时内存的地址,以及传输长度,就可以在外设和内存之前进行数据传输了.而SAM4的PDC甚至还提供了一个类似FIF…
为使用更更高的波特率,则需要更更高的外设时钟的频率.这个时候就需要用到锁相环(PLL)了.锁相环可以对输入的时钟进行分频.升频后进行输出.MCK可以使用的锁相环为PLLA,而PLLA的输入时钟为MAINCK. 本节将配置MCK频率为120 MHz,UART波特率为115200 Hz. 一. PLLA的限制 使用PLLA时需要考虑到它的限制,不然配置失败了也不好找原因. 对输入输出时钟频率的限制 PLLA的输入时钟范围需在3—32 MHz之间(PLLA对输入时钟可以进行预分频),输出时钟需要在80…
通信还是比让LED灯闪烁实用得多的. 这次试试使用UART,实现开发版和PC间的通信.功能比较简单,就是把PC发向开发版的内容发送回去.这次主要介绍一下UART的配置,至于通信,则使用较为简单的不断查询UART状态寄存器的循环实现. 一. 准备工作 UART作为异步串口通信协议的一种,所以必须先要准备一根串口线.用串口线将PC的串口和开发板的DBGU口连起来. 同时,在PC上需要准备好串口通信软件. 二. 电路 DBGU有两个引脚分别与PA10和PA9相连,这两个复用引脚的外设A即为UART0.…
RTT主要用做一个全局的定时器,而且不太通用.现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC). TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输出.同样,它可以产生一系列的中断.这一次将使TC以一个固定的周期产生中断,以达到定时的目的. 一. TC配置 1. 在PMC中使能TC时钟. 2. 时钟选择. TC的每个通道内部都有一个32位的计数器.可以为这个计数器选择一个时钟,使其以固定频率步进.为使LED的闪烁频率较低,需要选择较小的时钟周期…
现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起:弹起时灭掉. 主要目的是学习GPIO的输入及中断. 一. 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳线是接通的. 可以看到,当按钮按下时,引脚接地.即若引脚接个上拉电阻,则在按钮弹起状态下,引脚处于高电平状态:而在按钮按下时,则处于低电平状态. 这次使用的按钮是BP3,即PA20引脚:LED为蓝色LED,即PA0. 二. 最简单的办法 在开发版重置时,所有的引脚就默认接了上拉电阻. 所以,直接使用…
PWM在高频情况下,一个很好的用处就是通过控制占空比来控制输出的功率,比如控制风扇转速.LED灯的亮度等.这次就利用PWM的中断功能,动态改变脉冲的占空比,来实现呼吸灯的效果. 一.实现思路 PWM可以选择让计数器在周期结束产生中断(在周期中央对齐时,可能选择在周期中央也产生中断),并且可以在运行的时候动态地调整占空比.周期.极性等属性.所以可以在中断处理函数中动态地改变占空比以改变LED灯的亮度. 这次也将使用通道0和引脚PA0. 二.PWM设置 这里需要用到较高频率的时钟,所以选择使用主时钟…
两个LED灯虽然可以闪了,但是总是需要CPU的参与.现在尝试使用一种更为自动化的方法:让脉宽调制(PWM)控制器输出具有一定周期和占空比的方波,以此控制LED灯的亮灭. 一.实现思路 依然使用蓝色和琥珀色的LED灯.开发板上能启用四个PWM通道,每个通道能输出两个互补的方波.我们会启用其中的一个通道,然后让这个通道的两个输出分别控制一个LED灯.但是由于这两个引脚上不存在同一通道的输出,所以需要第三个引脚辅助. 我们将使用PWM的通道0. 1.    PWMH0输出至引脚PA0(外设A). 2.…
JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这个,和我们的字符流基本上没有什么差别,我们来拷贝mp3,看例子 // 通过字节流的缓冲区拷贝图片 public static void copyMp3() { try { FileInputStream fi = new FileInputStream("audio.mp3"); Buff…
Most crossword puzzle fans are used to anagrams - groups of words with the same letters in different orders - for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their letters, you c…
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变.当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用.数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组…
转自单片机系统与标准PC键盘的接口模块设计 概述     在单片机系统中,当输入按键较多时,在硬件设计和软件编程之间总存在着矛盾.对于不同的单片机系统需要进行专用的键盘硬件设计和编程调试,通用性差,使项目开发复杂化.标准PC键盘在工艺与技术上都已相当成熟,而且工作稳定,价格低廉.本设计实现了一个接口模块,它将标准PC键盘发出的位置扫描码,变换为标准的ASCII码和OEM扫描码或Windows虚拟键代码,再以并行或串行方式传送给上位单片机. 接口模块的特点     该模块在PC键盘与上位单片机之间…
NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实例.NHibernate2.0.NHibernate2.0教程.NHibernate之旅.NHibernate工具 我的NHibernate全部文章在http://www.cnblogs.com/lyj/category/129155.html 导游 NHibernate是把Java的Hiberna…
JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了,而且收到的好评也不错,于是就一直坚持了下来,非常感谢各位小伙伴哦! JAVA之旅合集 JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程…