A. 超频是什么,怎么弄
如何超频【一】超频原理 为了更好的超频,超频原理不可不学。以超频最有效果的CPU 为例,目前CPU的生产可以说是非常精密的,以至于生产厂家都无法控制每块CPU到底可以在什幺样的频率下工作,厂家实际上就已经自己做了次测试,将能工作在高频率下的CPU标记为高频率的,然后可以卖更高的价钱。但为了保证它的质量,这些标记都有一定的富余,也就是说, 一块工作在600MHZ的CPU,很有可能在800MHZ下依然稳定工作,为了发掘这些潜在的富余部分,我们可以进行超频。 此外,我们还可以借助一些手段来使CPU稳定工作在更高的频率上,这些手段主要是两点:增加散热效果、增加工作电压。 对于电脑的其它配件,依然利用这样的原理进行超频,如显示卡、内存、 甚至鼠标等等。 好了,你已经开始着急了,我要超频,得怎幺来呢?该如何下手? 【二】超频准备 别着急,超频之前要做一些准备,这些准备将使你超频可以顺利进行。磨刀不误砍柴工,多准备一点没坏处。 CPU散热风扇 —— 非常关键的超频工具,一定要买好风扇,绝对很值得! 导热硅脂 —— 增加CPU和风扇散热片之间的热传递,很有用的东西,价格便宜。 导热硅胶 —— 一般用来往芯片上粘贴小的散热片,给主板芯片降温、显卡芯片降温、给内存芯片降温用。 小散热片 —— 辅助降温用,主要用来给发热略大的芯片降温。 【三】超频CPU 最有效果的超频,莫过于超频CPU了,而且现在的CPU大多数都是可超的,我们就多说一说如何超频电脑的CPU。 电脑的CPU工作频率为主频,它是由外频和倍频的乘积决定的,超频CPU,超倍频是最佳方案。但有的厂家为 防止我们超频,将CPU的外频锁定了(这更证实了超频的合理性),如Intel大部分的CPU都是锁了外频的。那幺对于这种CPU,我们也只能通过提升外频来进行了。这种提升可能有局限,但可以带来更大的好处。 目前的主流CPU有两家:Intel的和AMD的。 1、Intel,CPU当之无愧的龙头老大,它生产的CPU始终占有相当大的市场。 2、AMD,CPU厂商中的后起之秀,也占有相当的市场份额。 知道了自己的电脑是何种CPU之后,我们要查找它的最高可超频率,以便确定超频的目标,可超频率可以在《各种CPU超频编号大集合》中查到. 大家所使用的电脑中大多数都是用的这两种CPU,当你确定了自己的CPU型号之后,还要确定CPU的核心工艺 和出厂日期。对于超频来说,越先进的核心工艺就越好超,同一型号的CPU,出厂日期越*后的也越好超。如.18微米的内核工艺,则理论上最多能到1.2G左右。要想上再高的频率只有用更好的工艺生产。 超频CPU正式开始,分为以下几步: 【1】更换好的散热片:这步要看原来的CPU风扇和散热片是否优良,优质的风扇价格一般都在50元以上,这笔投资尽量要保证。对于超频非常有用。在换上优质风扇的同时,注意在CPU与风扇散热片底座的接触部分涂抹导热硅脂,这样可以提高散热速度。 【2】提升CPU倍频:此法目前仅适合K62和Duron以及T bird的CPU,如果是Duron和T bird还要用铅笔来破解倍频,很多文章有介绍,这里不再赘述。超倍频需要主板支持修改倍频,选购主板的时候要十分注意。 【3】提升CPU外频:提升外频可以带来系统性能的大幅度提升,对于PIII处理器,目前的一般都是100外频,只有超到133左右,在散热优良而还可以加电压的时候,甚至可到150以上。但在这时,需要您的电脑的内存、显卡可以工作在如此之高的频率之下。因此相对来说,100外频的PIII处理器,是超外频比较理想的CPU。此法跟提升CPU倍频的方法一起用,效果最好。当然,这需要您的主板支持外频的调节,有的主板支持逐兆调节,就是专门为了超外频而设计的。 【4】增加电压:增加电压带有一定的危险性,建议不采用,如确实需要增加电压来增加超频后的稳定性,则要一点一点的加,并监视温度以策安全。对于Intel的CPU,稍微加一些电压效果是明显的;对于AMD的CPU,可以多加一些电压。这里要提到的是主板要支持更改电压,否则超频余地不会太大。如果是需要转接卡的话,要注意选择或更换可以调节电压的转接卡为上策。 【5】软件超频:软件超频是利用超频软件来进行的,例如技嘉的主板,就有可以软件超频的型号。这些软件超频的例子会在以后的文章中介绍。 一般的来说,超频CPU只要按照以上的步骤,应该可以做到超频成功的,至于超频的幅度,就取决于您的机器 的各个配件的质量了,值得注意的是:超频会缩短CPU的寿命,如果您想让现在的机器能使用个十年八年的, 还是不要超频为好。不过现在电脑的更新换代实是快,10年对于电脑来说,太漫长了…… 【四】超频显卡 对于狂热的超频爱好者来说,任何一个超频的机会也不容错过,显卡是电脑中第二个可以超频的对象,自然也倍受青睐,超频显卡也要看显卡的芯片核心工艺,越先进的越耐超。 超频显卡除了超频核心频率以外,还可以超频显存频率,为什幺市面上出现了很多使用5.5ns的显存的显卡呢? 就是因为显存的反应时间越小,可超的频率就越高,6ns显存一般也能超到200M,5.5ns自然可超到更高。超频显存可能会带来很多热量,我们可以在显存上粘贴散热片来缓解这个问题。 【五】超频鼠标 不要奇怪,超频鼠标是指让鼠标的刷新率增加,不信你快速晃动鼠标,你会发现其实鼠标的光标也不是连续的,一般的PS2鼠标刷新率是80HZ,也就是说1秒钟画出80个光标。当然,刷新率是越高越好的,这样可以使得光标显示效果细腻,改变刷新率是通过软件更改的,目前有一款软件叫PS2PLUS,它可将PS2鼠标的刷新率刷到200!拿市面上随处可见的普通的双飞燕2D鼠标来试验,当运行刷新软件将刷新率调整到200MHZ的时候,鼠标变得非常好用,点击准确,移动平滑,感觉跟100多元的罗技鼠标相当啦!不花钱升级了鼠标,何乐而不为!但要注意该软件好象不能用在windows2000下,且不能改变USB鼠标的刷新率,好在USB鼠标的刷新率已经是120了,基本够了。在前文提到的网址可以下载该软件。 【六】超频内存、硬盘 千万别有误会,超频内存和硬盘,其实是不太可能的,我们所说的超频,其实是指提升了CPU的外频之后,总线频率上升了带来的内存、硬盘的工作频率的提高,因为这两样东东可改变的东西更少了,几乎就不能做什幺手脚,所以最好也不要进行超频工作。前一阵子有的文章介绍可以超频硬盘转速,这也是骗人的空谈,没有理论基础。至于内存的CAS=2和=3之分,效果也是很小的,可忽略不计。 【七】超频测试 成功的超频,应该禁得起严格的测试,一般是系统正常运行,软件运行稳定,运行各种测试软件表示性能确实稳定,无其它故障出现即可。 【八】几种超频性能很好的CPU介绍 很多朋友的超频经历告诉我们,如下的几款CPU超频性能很好: 1)PIII550E、PIII650E比较好超。 2)ron,生产日期*后的比较好超。 想来现在主要也只有这几种东西可以超频了,如果您已经成功的超频了,并且很稳定,那幺恭喜您已经完成了少花钱升级的目标,但如果您达不到您的目的或者出现了超频失败,也不用灰心丧气,我们来看看超频失败的几种现象。 【超频失败现象小结】 现象一:系统可以启动,但运行大的软件的时候死机,而且时快时慢。 分析和解决:此时您的系统已经达到瓶颈,若不能略微降低CPU主频,则应该利用提升电压、增加散热效果等手段来使之稳定下来。 现象二:电脑可以启动,但进不了操作系统。分析和解决:您的电脑处在不能启动的边缘,您应该降低超频幅度以求得稳定。 现象三:电脑不能启动,完全黑屏。分析和解决:超的太高了,导致CPU运算频繁出错而无法正常工作,别太贪心,少超一点啦。 现象四:系统可以启动,但屏幕时而出现斑块花点。分析和解决:显卡顶不住了,可考虑降低显卡的超频幅度或者总线的超频幅度。 现象五:系统其它板卡工作不正常。但系统稳定。分析和解决:您的主板设计不良,导致超频之后的电磁干扰增加,影响板卡的工作稳定性,可以换到距离比较远的 插槽重新试验,或者更换抗干扰能力强的板卡。 最后,还要重申超频的原则,是合理超频,适度超频,如果因为一味追求超频而使系统不稳定,那倒不如不超频,稳定使用它比较舒服。毕竟电脑是让我们来使用的,而不是做试验的,您说是吗?愿广大玩家超频成功。
B. 请问:K10架构的双核U,具体指什么意思
AMD昨天在德国慕尼黑举行了一次会议,由AMD欧洲、中东及非洲销售与市场技术主管Giuseppe Amato详细介绍了即将到来的K10架构处理器。AMD执行副总裁兼首席销售与市场运营官Henri Richard曾将其称为K8L,这一说法也广为流传,但现在,AMD官方已将其定名为K10。
K10将引入共享三级缓存,同时每个核心拥有自己的一级缓存和二级缓存。如果处理器请求的数据存在于一级缓存中,则直接载入;如果在任何一个二级缓存中,则直接或者通过交叉开关载入一级缓存,并将二级缓存中的原数据标记为无效,这也是AMD的独特设计;如果在三级缓存中,则数据载入后仍然存在,其他核心还能继续访问,从而实现共享。
K10的整合内存控制器(IMC)将有一些新特性。在使用多个内存模组的情况下,如果BIOS设置和主板能够配合,IMC就能通过64-bit通道访问内存,使用ECC错误校验的话则是72-bit。如此一来,读取和写入数据就能同步进行,也能提高四核心环境下无序访问的效率。该功能仅限于Socket AM2+和Socket F+接口处理器,Socket AM2和Socket F则使用普通的128-bit双通道模式。
由于K10四核心采用分离式能耗设计,IMC也可以根据各个处理器核心独立自定频率和电压。这样一来,处理器超频的时候就无需顾及内存频率,对超频爱好者来说无疑是个好消息。同样的,这一功能也只出现在Socket AM2+和Socket F+平台。
Amato还提及了一系列节能技术,可让AMD四核心的热设计功耗保持在目前双核心的水平。与目前的K8和Intel Core 2不同,在K10中各个处理核心可以运行在独立的频率,AMD称之为“P-States”,空闲的核心可以降低频率甚至完全关闭,负载的则全速运行。K10还将配备新的热传感器,以便改善过热保护。
Amato指出,虽然K10更有利于超频,但AMD不鼓励这么做,而且AMD可以通过PLL确认处理器的损坏是否是超频所致,是的话则不予质保。
AMD当然没有忘记Intel的FSB前端总线。Intel的四核心互相通信绕道外部FSB,而K10四核心还是使用内部的交叉开关,全部在处理器之内完成,并且已经为八核心做好准备,代号“Montreal(蒙特利尔)”,具体发布时间暂未确定。首款发布的K10四核心代号“Barcelona(巴塞罗那)”,65nm工艺,4MB三级缓存,2008年升级为“Shanghai(上海)”,45nm工艺,6MB三级缓存,二者均兼容现有的Socket F平台
C. 什么内存没有寄存器或缓存
就是普通的DDR2 667啊,所有的普通内存都是没有ECC校验和寄存器的,只有服务器用的内存才有,所以你可以放心购买。内存的牌子也就那么几个。
D. Barcelona核心介绍
Intel最早的Pentium M处理器引入了一项名为“dedicated stack manager”(专注堆栈管理器)的新特性,正如其名字所暗示的一样,专注堆栈管理器专门处理所有的X86堆栈操作(例如push, pop, call, return等)。它将这些伐数据集中处理而无需其他执行单元参与,这尤其简化了CPU整数执行单元的工作,加快了整数执行单元的处理速度。
AMD在Barcelona中也引入了类似的技术,AMD称之为Sideband Stack Optimizer(边带堆栈优化器)。有了边带堆栈优化器,处理器中的伐指令不再需要经过3路编码,也不再由整数执行单元处理,这加快了堆栈的处理速度,也同时加快了整数执行单元的处理速度。
在Intel Core微构架中一个重要改进是OOOE乱序执行:当装载指令队列发生等待时,处理器可以将队列后方处于等待的指令优先装载并执行,而不是一直等待到堵塞结束。平均而言,约30%的指令会发生一定时间的堵塞,这一乱序执行模式的引入,使新构架CPU性能有了明显的提高。AMD的K8构架并不支持OOOE乱序执行指令,所以即使K8构架有优秀的内置内存控制器,也依然被对手的Core构架击败。正视这一技术上的落后,AMD在K8L构架的首款芯片Barcelona上及时改进为OOOE技术,这一改进必将为K8L构架的性能带来极大的提高。
Barcelona将可以乱序执行指令,同样也可以在前一指令尚未处理完成时,装载并用空载单元处理下一指令,即使这两条指令需要读取不同的内存地址。Barcelona拥有3个地址生成单元,可以完成3个寄存指令每周期,而Core构架每周期只能执行1次-K8L构架的寄存速度要比Core构架强大3倍。
K8L构架中加入了新的SSE4指令扩展:SSEEXTRQ/INSERTQ指令和MOVNTSD/MOVNTSS指令。前者可以将多条指令合并为一条指令执行,后者用来计算流量寄存指令。Intel也会将在稍候发布的Penryn处理器中加入。
Intel Xeon服务器所有使用的FB-DIMM内存一大优势是,可以同时执行读和写命令到AMB,而在标准的DDR2内存中,你只能同时进行一个操作,而且读和写的切换会有非常大的损失。如果是一连串的随机混合执行的话,将会带来非常严重的资源浪费,而如果是先全部读然后再转换到写的话,就可以避免性能的损失。K8内存控制器就采用读取优先于写的策略来提高运行效率,但是Barcelona则更加智能化。
但是读取的数据会被先存放在buffer中,而不采用先直接执行写,但当它的容量达到了极限就会溢出,为了避免这种情况,在此之前才对读写之间进行切换,同时可以带来带宽和延迟方面效率的提高。K8核心配备的是128-bits宽度的单内存控制器,但是在Barcelona中,AMD把它分割成两个64-bit,每个控制器可以独立的进行操作,因此它可以带来效率上的不小提升,尤其是在四核执行的环境下,每个核心可以独立占有内存访问资源。
Barcelonas中集成的北桥部分(注意不是主板北桥)也被设计成更高的带宽,更深的buffers将允许更高的带宽利用率,同时北桥自身已经可以使用未来的内存技术,比如DDR3。
内存控制器的预取功能是运用相当广泛、十分重要的一项功能。预取可以减少内存延迟对整体性能的负面影响。当NVIDIA发布nForce2主板时,重点介绍的就是nForce2芯片组的128位智能预取功能。Intel在发布Core 2处理器之时也强调了CORE构架每核心拥有三个预取单元。
K8构架中每个核心设计有2个预取器,一个是指令预取器,另一个是数据预取器。K8L构架的Barcelona保持了2个的数量,但在性能上有了较大的改进。一个明显的改进是数据预取器直接将数据寄存入L1缓存中,相比K8构架中寄存入L2缓存的做法,新的数据预取器准确率更高,速度更快,内存性能及CPU整体性能将得益于此。
受工艺技术方面的影响,AMD处理器的缓存容量一直都要落后于Intel,AMD自己也清楚自己无法在宝贵的die上加入更多的晶体管来实现大容量的缓存,但是勇于创新的AMD却找到了更好的办法——集成内存控制器。
处理器整合内存控制器可以说是一项杰作,拥有整合内存控制器的K8构架仅依靠512KB的L2缓存就能够击败当时的对手Pentium 4。直到现在的Athlon 64 X2也依然保持着Intel 2002年就已过时的512KB L2缓村。
现在Core 2已经拥有了4MB的L2缓存,看来Intel和AMD之间的缓存差距还将保持,因为Barcelona的L2缓存依然是512KB。相比之下,Intel四核的Kentsfield芯片拥有8MB的L2缓存,而2007年末上市的新型Penryn芯片将拥有12MB的L2缓存。
Barcelona的缓存体系和K8构架有一定的相似之处,它的四颗核心各拥有64KB的L1缓存和512KB的L2缓存。从简化芯片设计的角度来看,四核心共享巨大的L2缓存对K8L构架而言并不合适,所以AMD引入了L3缓存,得益于65nm工艺,Barcelona在一颗晶圆上集成四颗核心外,还集成了一块2MB容量的L3缓存。也就是说L3缓存与4颗内核同样原生于一块晶圆,其容量为最小2M起跳。同L2缓存一样,L3缓存也是独立的,L1缓存的数据和L3缓存的数据将不会重复。
Barcelona的缓存工作原理是:L2缓存是作为L1缓存的备用空间。L1缓存储存着CPU当前最需要的数据,而当空间不足时,一些不是最重要的数据就转移到L2缓存中。而当未来再次需要时,则从L2缓存中再次转移到L1缓存中。新加入的L3缓存延续了L2缓存的角色,四颗核心的L2缓存将溢出的数据暂时寄存在L3缓存中。
L1缓存和L2缓存依然分别是2路和16路,L3缓存则是32路。快速的32路L3缓存不仅可以更好的满足多任务并行,而且对单任务的执行也有着较大积极作用。尤其在3D运用方面,2MB的L3缓存将对性能产生极大的推进作用。
虚拟化技术在未来将有着更广泛的应用,以往是服务器处理器的标志,现在也渐渐被更多桌面处理器所支持。在虚拟技术方面,Barcelona也有了很大的改进,由于采用了更快的虚拟地址转换算法,在拥有多个客户操作系统的虚拟软件堆栈中,有一个内存地址转换必须处理,客户系统向系统管理程序的地址转换,因为每个客户系统拥有独立的内存管理,
据AMD表示,在此之前这个转换过程都是通过软件来实现的,并且是基于一个叫shadow paging的技术,而Barcelona提供的是硬件级加速转换,AMD把它称为Nested Paging。根据推算大约系统管理程序所消耗的75%的时间是用于shadow paging,转换的地址是在Barcelonas TLBs中被缓存的,而且AMD指出Nested Paging并不需要太复杂的设定,这对于软件开发商来说就变得非常简单。
处理器的功耗问题开始被越来越多的人重视,目前的Intel四核的功耗非常高,而Barcelona的四个核心工作电压都一样,同时内部的北桥单元则使用独立的电压计划,可以根据另外一个工作情况在0.8V到1.4V之间改变,它们的电压可以独立管理,这将提高功耗效率。独立的核心虽然共享同样的电压,但是每个核心都拥有自己的PLL电路,所以它们可以根据负载情况,运行在不同的频率下。
Barcelona每个核心支持五个独立的p-states(频率等级)转换,改变只是在频率上,p-states完全是硬件控制的,所以我们不需要驱动就可以开启这个功耗管理特性,同时AMD也增加了clock gating(时钟频率比)的数量,配合最新的65nm工艺,保证AMD首款四核处理器的功耗表现和目前的双核Opteron一样。
E. 项目 数据 内存模块 模块容量 512 MB (1 rank, 4 banks) 模块位宽 64 bit 存取方式 DDR SDRAM 内存速度 PC
你的板子和我的一样,我的U是赛扬331。这个板子品牌是soltek(硕泰克)威盛的芯片,集成威盛的V3显卡。这个板子最高支持DDR2 533的二代内存,建议加个同样品牌的512内存,或者直接换个1G的,记住,DDR2 800也可以用,只不过被认成533来用,1G的800内存才不到200块钱,值得一试。 还有,建议上一个AGP 8X的独显,我加个ATI 9550,上网可以,一般的非大型游戏(穿越火线,QQ飞车)这类游戏都可以玩,呵呵,望楼主采纳!
F. 本人想用stm32的DAC输出固定电压值,,有人之前调试过这个项目吗我急需例程。求解救。
玩了几天模拟电路,因做程控放大电路,需要输出可调电压,于是转战STM32上来了,采用DMA通道输出DAC,输出为一正弦波。
DAC配置略显简单,由于悟性不够,部分原因还是不懂。DMA通道传送DAC时,选取DAC_Channnel2程序很好使,而改为DAC_Channnel1时,相应地址等均作改变,但是就是没有波形输出,无果。
选用TIM2作定时器触发,TIM2在APB1上,最高频率36MHz,预分频系数为1时测出正弦波形频率经换算频率为72MHz,而预分频系数为2时,换算频率为36MHz,正常情况应该相等的,不明所以。查询资料,有博客上说,采用默认库配置,TIM2最高频率可以为72MHz,不理解。于是更改程序,自己配置时钟,预分频系数为1时依然为72MHz,而预分频系数为2时,频率为36MHz,无果
//purpose: DA转换,DAC1->PA4管脚输出转换后的模拟值 ,DAC2->PA5
// 产生正弦波频率= 主频/(TIM_Prescaler+1)/TIM_Period/产生一个正弦波的点数
#include "stm32f10x.h"
#define DAC_DHR12R2_Address 0x40007414 //相应地址通过数据手册和参考手册去查询
/* Init Structure definition */
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
const uint16_t Sine12bit[32] = { //数据源用来产生波形
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
uint32_t DualSine12bit[32];
uint32_t Idx = 0;
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void TIM_Configuration(void);
void DAC_Configuration(void);
void DMA_Configuration(void);
void GPIO_Configuration(void);
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/
// System Clocks Configuration
RCC_Configuration();
/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically
connected to the DAC converter. In order to avoid parasitic consumption,
the GPIO pin should be configured in analog */
GPIO_Configuration();
TIM_Configuration();
DAC_Configuration();
for (Idx = 0; Idx < 32; Idx++)
{
DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]); //双通道输出正弦波
}
DMA_Configuration();
/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_2, ENABLE);
/* TIM6 enable counter */
TIM_Cmd(TIM6, ENABLE);
while (1)
{
}
}
/**
* @brief Configures the different system clocks.
* @param None
* @retval None
*/
void RCC_Configuration(void)
{
//时钟配置,不使用库默认时钟配置
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟=AHB 1/2时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC时钟=PCLK2 1/4
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟*9
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC时钟= PCLK2/4
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
// DMA2 clock enable
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* GPIOA Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* TIM2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
}
void TIM_Configuration(void)
{
// Time base configuration
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 25-1; //计数周期25
TIM_TimeBaseStructure.TIM_Prescaler = 1-1; //预分频系数1
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
// TIM6 TRGO selection */
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); //触发源更新
}
void DAC_Configuration(void)
{
// DAC channel1 Configuration
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; //DAC触发 TIM6触发
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用内部波形发生器
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //关闭外部输出缓存
DAC_Init(DAC_Channel_1, &DAC_InitStructure); //用DAC输出波形,传输的数据比较多,所以采用DMA传输可以节省CPU的开支
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
// Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_Cmd(DAC_Channel_2, ENABLE);
}
void DMA_Configuration(void)
{
DMA_DeInit(DMA2_Channel4); //将dma的通道寄存器设为默认值
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address; //定义dma外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 32; //dma缓存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器 递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据宽度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式,数据传输数目为0时,自动恢复配置初值
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //通道未被设置成内存到内存模式,与循环模式相对
DMA_Init(DMA2_Channel4, &DMA_InitStructure); //将DMA_InitStructure中指定的参数初始化dma的通道寄存器
// Enable DMA2 Channel4
DMA_Cmd(DMA2_Channel4, ENABLE); //使能通道
}
/**
* @brief Configures the different GPIO ports.
* @param None
* @retval None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically
connected to the DAC converter. In order to avoid parasitic consumption,
the GPIO pin should be configured in analog */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; //一旦DAC通道使能,相应的GPIO PA4,PA5自动与DAC的模拟输出相连,
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //为了避免避免寄生的干扰和额外的功耗,PA4 置成模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
想输出固定电压,将数组里的数都变成一个数就可以了
转自http://haoxi.spaces.eepw.com.cn/articles/article/item/97855
望采纳。
G. STM32结构体地址偏移问题
STM32学习笔记——测试闪灯程序
Created on: 2012-10-28
Author: zhang bin
学习笔记
for STM32F103C8
redesigned by zhang bin
2012-10-28
versions:V-0.1
All Rights Reserved
//所使用的是STM32F103C8共有48个管脚,共有两组GPIO,为GPIOA和GPIOB,每组有从0到15共16个引脚
//注意对STM32F103C8的操作和对库函数的使用,在使用时,要时刻参考《STM32F10xxx使用手册》和《STM32的函数说明》这两个文档
#include "stm32f10x_lib.h"
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO配置的结构体变量 包括GPIO引脚,引脚速度,引脚模式
ErrorStatus HSEStartUpStatus; //枚举类型,错误状态变量定义 存储外部高速时钟HSE状态
void RCC_Configuration(void); //RCC配置函数 RCC:复位和时钟控制
void NVIC_Configuration(void); //NVIC配置函数 NVIC:嵌套向量中断控制器
void Delay(vu32 nCount);
int main(void)
{
#ifdef DEBUG
debug();
#endif
RCC_Configuration(); //系统时钟配置函数
NVIC_Configuration(); //NVIC配置函数
//使能APB2总线外设时钟 APB1,APB2两条连接总线的外设。具有多个预分频器用于配置AHB的频率,高速APB(APB2)和低速APB(APB1)
//区域。AHB和高速APB的最高频率为72MHz,低速APB的最高频率为36MHz
//APB2是的I/O脚可达18MHz的反转速度
//AHB到APB(1,2)桥,该桥用来连接所有的APB设备
//两个AHB/APB桥在AHB和两个APB总线之间提供完全同步地方连接。APB1被限制在36MHz,APB2工作在全速状态(根据设备的不同
//可以达到72MHz)
//有些外设连接到APB1上,有些外设连接到APB2上,具体的情况参看使用手册。
//所以在外设使用前,要先调用函数使能相应总线的时钟
//通用输入/输出GPIO 备用输入/输出AFIO
//IO端口寄存器必须以32位字的方式访问,不允许以半字或者字节的方式访问
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能相应的外设的时钟
//这里使能GPIOA,GPIOB和备用IO (AFIO)的时钟
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //关闭调试 端口重新映射 使用仿真器调试时,不能用此语
//下面是GPIO的设置,注意方法
//配置相应的IO。注意配置IO功能时,使用的是GPIO配置的结构体。前面已经定义了GPIO的结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 选择所有脚 #define GPIO_Pin_All ((u16)0xFFFF)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置成推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出模式下 I/O输出速度 50M HZ
GPIO_Init(GPIOA, &GPIO_InitStructure); //用定义的结构体初始化PA口
GPIO_Init(GPIOB, &GPIO_InitStructure); //用定义的结构体初始化PB口
while (1)
{
GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB)); //写一个字数据到PB口 写入的数据是当前GPIOB读取的值然后取反
//就相当于把GPIOB的值取反
Delay(0x8FFFFF); // 延时
GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB)); //写一个字数据到PB口 把GPIOB的值取反
Delay(0x8FFFFF); // 延时
}
}
//复位和时钟设置函数 注意配置的方法
void RCC_Configuration(void)
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
//打开外部高速晶振
RCC_HSEConfig(RCC_HSE_ON); //设置外部高速晶振HSE RCC_HSE_ON:打开HSE晶振,RCC_HSE_OFF:关闭HSE晶振
//RCC_HSE_Bypass:HSE晶振被外部时钟旁路
//等待外部高速时钟准备好
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振,返回错误状态。前面已经定义了ErrorStatus枚举类型的变量
//HSEStartUpStatus,SUCCESS:HSE晶振稳定且就绪,ERROR:HSE晶振未就绪
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准备好
{
//开启FLASH的预取功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能或失能预取指缓存,FLASH_PrefetchBuffer_Enable:预取指缓存使能
//FLASH_PrefetchBuffer_Disable:预取指缓存失能
//FLASH延迟2个周期
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器代码延时时钟周期数,可以设置FLASH_Latency_0:0延时周期,
//FLASH_Latency_1:1延时周期,FLASH_Latency_2:2延时周期
//配置AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟是系统时钟SYSCLK的多少分频,这里设为1分频,还可以指定2,4,8,16,64,128,256,512
//分频
//配置APB2(PCLK2)钟=AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟APB2是AHB的多少分频,这里设为1分频,还可以指定为2,4,8,16分频
//配置APB1(PCLK1)钟=AHB 1/2时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟APB1是AHB的多少分频,这里设为2分频,还可以指定为1,2,4,8,16分频
//配置PLL时钟 == 外部高速晶体时钟*9 PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟及倍频系数 第一个参数设置PLL的输入时钟源
//可以有RCC_PLLSource_HSI_Div2:HSI时钟频率除以2,RCC_PLLSource_HSE_Div1:HSE时钟频率,RCC_PLLSource_HSE_Div2:
//HSE时钟频率除以2
//第二个参数设置PLL的倍频系数,可以是2~16倍频,这里设为9倍频
//警告:必须正确设置软件,使PLL输出时钟频率不超过72MHz
//使能PLL时钟
RCC_PLLCmd(ENABLE); //使能或失能PLL,参数可以取ENABLE或DISABLE,如果PLL被用于系统时钟,那么它不能被失能
//等待PLL时钟就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //检查指定的RCC标志位设置与否,输入参数为待检查的RCC标志位
//其取值情况详见《STM32的函数说明(中文)》P211.返回值为RCC_FLAG的新状态,SET或RESET
{
}
//配置系统时钟 = PLL时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟SYSCLK,输入参数用于指定用作系统时钟的时钟源
//可以为:RCC_SYSCLKSource_HSI:选择HSI作为系统时钟,RCC_SYSCLKSource_HSE:选择HSE作为系统时钟,RCC_SYSCLKSource_PLLCLK
//选择PLL作为系统时钟
//检查PLL时钟是否作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08) //函数RCC_GetSYSCLKSource()返回用作系统时钟的时钟源。
//返回值可以是:0x00:HSI作为系统时钟,0x04:HSE作为系统时钟,0x08:PLL作为系统时钟
{
}
}
}
//嵌套向量中断控制器配置函数
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //设置向量表的位置和偏移,第一个参数指定向量表的位置在RAM还是在
//程序存储器flash中,取值可以是NVIC_VectTab_RAM:向量表位于RAM, NVIC_VectTab_FLASH:向量表位于FLASH。第二个参数为
//向量表基地址的偏移量,对于FLASH,该参数值必须高于0x08000100,对于RAM,必须高于0x100.它同时必须是256(64*4)的整数倍
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
#ifdef DEBUG
//assert_failed编写于文件main.c或其他用户C文件中
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif
H. 新编译的dll不生效dll缓存
系统故障。用户新下载的dll不能进行缓存时系统出现故障导致的。dll是延迟锁相环的简称,该技术是在PLL技术上改进得到的,被广泛应用于时序领域中。
I. ZYNQ7000 启动流程解析
存放在ZYNQ芯片内部ROM不可更改,用于找到FSBL并启动它(从SD或者QSPI或者NAND),ug585第六章
用于引导U-Boot
用于引导Linux Kernel
petalinux工具可以构建2和3还有内核
BOOT.BIN包括fsbl,bitstream,用户程序(uboot)
image.ub包括了kernel(devicetree DTB和rootfs通过设置可选包不包含在ub内)
主要是分析下FSBL工程的main函数
调用ps7_init函数
主要是对PS端配置信息进行初始化操作,包括MIO,PLL,CLK and DDR
我们在vivado软件中可以通过图形化的方式对ZYNQ PS端外设进行相关配置,那么这些配置信息会写入到hdf文件,SDK(或petalinux)会对hdf文件进行解析并生成对应的寄存器配置表,然后FSBL工程中会通过ps7_init函数将寄存器配置表写入到对应的寄存器中,完成对MIO/PLL/CLK/DDR等外设的硬件配置。
先调用Xil_DCacheFlush函数完成刷DCache缓存的操作,然后再调用Xil_DCacheDisable禁用DCache缓存。
调用RegisterHandlers函数
调用DDRInitCheck函数
调用InitPcap函数
处理器配置访问端口
这个寄存器记录ZYNQ的启动方式(QSPI、SD、NAND、Nor、JTAG)
可以通过MIO3 MIO4 MIO5这三个引脚去配置ZYNQ的启动方式
ZYNQ上电复位的时候,会将这三个引脚的电平状态保存在BOOT_MODE寄存器当中。
每一种启动方式会有不同的处理方式。
第一、先初始化对应的flash设备
第二、再将MoveImage函数指针指向Flash设备的读写函数实体
调用LoadBootImage函数
FSBL的主要工作是启动U-Boot(终极目标),也要将bitstream文件加载到PL端。
找到U-Boot、bitstream
在读取U-Boot拷贝DDR中对应的加载地址,读取bitstream加载到PL端
调用FsblHandoff(HandoffAddress)
启动完U-Boot之后,FSBL的使命的就完成了。