| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> DSP学习笔记之系统时钟、定时器、GPIO篇 -> 正文阅读 |
|
[嵌入式]DSP学习笔记之系统时钟、定时器、GPIO篇 |
\qquad
写在前面,不管是C51、MSP430、32也好,DSP也好,总要有一个掌握的比较熟练,不能每次都复制粘贴别人的代码然后修修补补吧。不要再做Ctrl +C、Ctrl+V工程师。主要参考来自于TI的TMS283xx手册、普中DSP教程,C2000助手等。方便下载,资料整理到了一起 DSP学习F28335系统时钟学习时钟是学习一款控制器,不管是硬件还是软件方面最重要的部分. 1.时钟来源
\qquad 总的来说,这里OSC电路可以通过在X1和X2之间接入一个晶振来产生(并最好保持XCLKIN接地)。如果没有在X1和X2之间接入晶振,那么就需要保持X1接地,X2浮空,并且在XCLINK之间接入振荡器。注意晶振(Crystal)、共振器(Resonator)、振荡器(Oscillator)的区别。可以简单的认为晶振和共振器是无源晶振(需要接外部电路才可以起振),而振荡器是有源晶振。那么最简单的方式就是在X1和X2之间接入晶振或者共振器,然后利用28335内部电路使得晶振起振。
\qquad
时钟源进来后,首先必须将OSCOFF位置1,这样才能使得时钟源进入直接选择器和经PLL模块到选择器。在PLL模块这里有一个PLLOFF位是用来关断PLL的,选择不关断(默认),接下来就是倍频环节PLLCR寄存器,低四位用来设置倍频。经过倍频到选择器输出后,设置寄存器PLLSTS的第8位和第7位DIVSEL来设置分频系数,在倍频设值之前必须将分频系数置零。通常我们的150MHz是OSCCLK(30MHz)
×
\times
× PLLCR(10)/DIVSEL(2)=150MHz; 1.2.主振荡器失效检测
\qquad 如果VCOCLK信号丢失,PLL模块的输出就会进入默认的“缓慢模式”(不知道这样翻译对不对,原文:limp mode)频率,并保持增长。由于OSCCLK信号丢失,那么OSCCLK计数器就不在继续增加,者意味着VCOCLK计数器不能被周期性的清零,经过一段时间,VCOCLK计数器就会溢出。当VCOCLK溢出之后,检测信号丢失逻辑器就会reset CPU,外设和其他的设备的逻辑电平。这个reset信号被称为 M C L K R E S  ̄ \overline{MCLKRES} MCLKRES信号,这个信号只能由内部产生,外部的 X R S  ̄ \overline{XRS} XRS 不会被 M C L K R E S  ̄ \overline{MCLKRES} MCLKRES信号拉低。 1.3.时钟输出\qquad 上图是时钟输出的内部结构,时钟输出是直接从系统时钟来的,时钟输出可以是系统时钟,或者1/2的系统时钟,或者1/4的系统时钟,默认在上电后,时钟输出是系统时钟的1/4,或者是振荡频率的1/16;这个输出时钟信号可以给其他需要时钟信号的非片上外设提供时钟信号。 \qquad 复位之后就会有时钟信号输出,当reset是低电平时,XCLKOUT=1/4SYSCLKOUT,可以通过监测这个信号测试在debug状态下时钟是否正确。这个引脚没有上拉或者下拉电阻。从图中可以看出,如果不需要输出这个时钟信号,可以通过设置寄存器XINTCNF2的CLKOFF位为1来关闭这个信号。 1.4时钟注意事项:(a):当PLL工作在“缓慢模式”(limp mode)时,不要往PLLCR(倍频寄存器)中写值; (b):接外部时钟时,看门狗不起作用; (c):上电过程中不会带来limp mode; (d):当工作在limp mode时,不要进入halt的低功耗模式,这时候要等待内部重启直到外部时钟信号到来。 (e):改变PLL控制寄存器时要遵从正确的上电步骤和寄存器配置;上电后寄存就流程图如下: \qquad 1.检测MCLKSTS位是否为1(检测是否由信号丢失,如果置位MCLKSTS,软件内部就会采取类似于系统关闭等动作);2.检测PLLSTS的分频系数是否为0;3.设置PLLSTS寄存器的MCLKOFF位=1来禁止振荡器逻辑检测;4.设置倍频PLLCR的值;5.检测PLLSTSP寄存器的PLLOCKS是否等于1(表示PLLCR寄存器已经被写入并且PLL当前是否处于锁定状态位);5.将PLLSTS寄存器的MCLKOFF位=0来使能振荡器逻辑检测;6.这时候可以改变DIVSEL的值了; 2.外设时钟\qquad 这里的CLKIN就是前面产生的系统时钟。从这张图中可以很清晰的看到,外设SPI-A,SCI-A/B/C,McBSP-A/B,是挂在低速时钟上的(LSPCLK);外设ADC是挂在高速时钟上的;外设EPWM模块是直接与系统时钟相连(这是为了给pwm提供足够的精度),IIC也是挂在系统时钟上的;Ecan模块是系统时钟经过2分频(不可修改)的来的。 3.定时器
\qquad
这里不介绍看门狗,因为我们一般禁用看门狗就行,这样也不用去写一些喂狗代码。 \qquad 定时器也称为定时计数器,可以通过计数来计时,也可以通过计数产生PWM,想想32里面的计数模式,向上、向下和向上向下计数模式等,无非就是计数到某一个数值之前保持高或者低,然后到达那个数之后电平翻转。这和我们电力电子里面的三角波(向上向下计数)或锯齿波(向上或向下计数)和一个数值进行比较产生PWM很类似。定时计数器,既可以通过计数器来达到计时或产生PWM信号。DSP内部集成了6个ePWM模块,单论PWM产生个数而言,比f103zet6多,这个后续会介绍。
\qquad 定时器寄存器是连接到28335处理器的存储器总线;定时器的时序和处理器的时序保持一致。 \qquad 从上面的CPU的定时器可以看到,32位的计数器寄存器TIMH:TIM加载周期寄存器的数值PRDH:PDR,计数器每经过TPR[TDDRH:TDDR]+1(这里的 TPR[TDDRH:TDDR]是定时器分频系数)个系统时钟就会减一计数,当减一到0后就会产生一个定时器中断信号,产生的中断信号如下图: 4.寄存器查看\qquad 1.PLLSTS寄存器写入值;设置PLLCR的值为DSP28_PLLCR(10),设置DIVSEL为DSP28_DIVSEL(2)
\qquad 设置外设时钟(以前的一个小问题:由于SCI是挂在外部时钟上的,外部的uart波特率是250K,如果SCI还选择37.5MHz的画,两个字节就会出错,所以我将低速时钟设置成了150MHz,这样就可以保持传输数据不出错,但低速时钟能设置成150MHz吗?)
\qquad 设置输出时钟信号,这里将输出时钟信号设置成系统时钟的1/4,
\qquad 下面使能所有的时钟,熟悉一下由寄存器PCLKCR0控制的外设时钟;
\qquad 使能PCLKCR1寄存器外设时钟,这个寄存器主要是EPWM模块的使能
\qquad
使能PCLKCR3寄存器(没有PCLKCR2寄存器)时钟
GPIO学习1.1 GPIO 概述\qquad 通用输入输出口( General Purpose Input and Output GPIO)是一款控制中最基础的部分。 \qquad GPIO复用器(multiplexing,有的也翻译成多路选择器)用于选择共享引脚的操作,这个很好理解,控制器为了节省IO口,通常将一个IO映射寄存器将一个外设的引脚映射到其他引脚;而复用器是通过多路选择器的方式选择IO口的作用,DSP的引脚使用比32更灵活是因为他内部的硬件多路选择器,这个也可以通过寄存器设置。
\qquad
GPIO0~GPIO87都可以被设置成数字IO口(也就是常说的GPIO口),或者通过GPxMUxn寄存器(复用寄存器)连接到3个外设IO口中的其中一个。如果作为GPIO,通过GpxDIR寄存器(方向寄存器)来选择该引脚作为输出或者和输入IO口,同时你也可以通过GPxQSELn(量化寄存器),GPxCTRL(控制寄存器)来选择量化输入信号以移除不想要的信号,也就是常说的滤波。
\qquad
上图是GPIOA复用器的基本原理图;(a)当寄存器PCLKCR3的GPIOINENCLK位为0时(这个位是给GPIO模块提供时钟的),上图中的阴影部分被禁止,并且各个引脚都设置为输出模式,当引脚配置为输出模式时这可以减小功率损耗。清除GPIOINENCLK位将会重置同步和量化逻辑器,这样之前设置的值就没了。(b)GPxDAT禁止/读取都在相同的内存被访问。 1.2设置GPIO模式的步骤
\qquad
1.开始之前先禁止所有的外部IO口选择; 1.3输入限定(qualifications)
\qquad
输入限定的方式非常灵活,你可以通过配置寄存器GPxQSELn来位每一个GPIO口选择输入限定的类型。在GPIO输入的模式下,可以由只能和系统时钟同步来限定,也可以通过采样窗口来限定;在外设输入的模式下除了上述的两种限定方式,还可以通过异步的方式来限定。 1.4GPIO相关寄存器介绍
\qquad GPxDAT寄存器:GPIO数据寄存器在限定之后指示了IO引脚当前的状态。如果引脚被配置成GPIO且位输出状态,且这个位置1,那么这个寄存器会强制其输出高电平;如果这个位清零,则会强制输出0。如果引脚没有被配置成输出下GPIO模式(不是GPIO模式或者是输入下的GPIO模式),如果向相应位写操作,则 这个写入的值被锁存,但引脚会被驱动。复位的时候,所有的值都被清零。当使用这个寄存器去改变输出引脚的电平时,要注意不要改变其他引脚的电平。例如,想要通过向GPADAT写入0来改变GPIOA0的输出电平,当使用一个read-modify-write 指令时,如果其他IO口的信号电平在这个指令时改变就会出问题。当GPIO配置成输入的GPIO时,读取寄存器相应位的值可以反应出引脚的电平状态,如果是1,则该引脚处于高电平,反之就是地电平。为了方便的修改输出GPIO的电平,可以使用SET、CLEAR、TOGGLE寄存器。 2 寄存器查看
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:38:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |