当前位置: 首页 > news >正文

新乡网站建设设计公司深圳精品网站建设公司

新乡网站建设设计公司,深圳精品网站建设公司,做网站的色彩搭配的小知识,做卡盟网站赚钱吗碎碎念#xff1a;好久不见#xff0c;甚是想念#xff01;本期带来的是有关ZYNQ7020的内容#xff0c;我们知道ZYNQ作为一款具有硬核的SOC#xff0c;PS端很强大#xff0c;可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器#xff0c;之后发布的Part… 碎碎念好久不见甚是想念本期带来的是有关ZYNQ7020的内容我们知道ZYNQ作为一款具有硬核的SOCPS端很强大可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器之后发布的Part2将基于具体项目出发实现PS端单核进行六路不等长占空比的PWM输出~ 虽然最后对我自己毕业好像没有什么帮助QAQ但是毕竟花费了一些时间阅读手册等内容还是打算记录一下供大家参考。 目录 1 TTC原理分析 1.1 主要特点 1.2 结构框图 1.3 功能描述 1.3.1 操作模式 1.3.2 事件定时器/脉宽计数器Event Timer操作 1.4 寄存器概述 1.5 编程模型 1.5.1 计数器使能的步骤 1.5.2 计数器停止的步骤 1.5.3 计数器重启的步骤 1.5.4 事件计数器(脉宽计数器)使能的步骤 1.5.5 清除中断和确认的步骤 1.6 计数器时钟输入的选择 2 SDK分析 2.1 工程建立 2.2 案例分析 1.设置中断系统SetupInterruptSystem() 2.设置Ticker定时器SetupTicker()  3.设置PWM定时器SetupPWM() 4.逐渐修改占空比WaitForDutyCycleFull() 5.停止计数器XTtcPs_Stop() 1 TTC原理分析 这一部分我们直接按照UG585的思路进行分析和介绍由于原文的内容本身是英文理解起来还是需要一些经验尽管更推荐去阅读原文部分。 TTC包含了三个独立的定时器分别是上图中的Timer/Clock 0、Timer/Clock 1、Timer/Clock 2。从左下角可以看到在PS端包含两个TTC分别是TTC0和TTC1因此两个TTC共包含6个独立的定时器。TTC控制器可以通过修改nic301_addr_region_ctrl_registers.security_apb [ttc1_apb]这个寄存器的位来实现对于安全模式(secure mode)和非安全模式(non-secure mode)的切换。对于这两种模式的内容可以参考下面 传送门 Secure mode and Non-secure mode 这两种模式来源于ARM TrustZone技术ARM在CPU的常规模式之外引入了一种称为“安全模式”的特殊CPU模式建立了“安全世界”和“正常世界”之间的的概念。默认情况下安全世界访问正常世界的所有状态反之则不然。由于ARM基本使用的都是基于存储映射的结构我的理解是通过这两种模式的分隔来实现对于重要寄存器的保护。 1.1 主要特点 每个TTC有如下特点 1.三个独立16位预分频器和16位的向上/向下计数器。向上01234...  向下9876... 2.可选的时钟源输入内部PS总线时钟CPU_1x内部时钟PL外部时钟MIO 3.对于TTC内部每一个counter都各自有一个中断 4.在一定间隔内的溢出中断或者计数匹配到设定的值时会发出中断 5.产生波形输出可以通过MIO或者PLEMIO 1.2 结构框图 通过上面的结构框图对于TTC中第一个计数器Timer/Clock 0的时钟输入、波形输出信号的多路控制是通过slcr.MIO_PIN_xx寄存器实现的默认情况下使用EMIO接口。 1.3 功能描述 每个预分频模块Pre-scaler都可以独立设置为使用PS内部总线时钟或者外部时钟来自MIO或者PL。对于外部时钟输入通过使用SLCR寄存器来选择具体的信号输入。预分频模块可以将输入时钟在/2和/65536之间进行分频当如分频寄存器为0的时候会对时钟进行二分频之后输出给后面的计数器。 计时器可以设置为增计数、减计数并且通过设置间隔寄存器的值可以控制计数的范围。同时可以比较三个匹配寄存器的值和计数器一个TTC包含3个计数器Counter和3组匹配寄存器的值产生中断信号。 中断模块组合了各种类型的中断:计数器间隔中断Interval Interrupt、计数器匹配中断Match Interrupt、计数器溢出中断Overflow Interrupt、事件计时器溢出。每种类型都可以单独启用。 1.3.1 操作模式 一个TTC中的每个计数器模块都可以独立编程并以以下两种模式中的任何一种运行。 间隔模式Interval mode: 通过修改计数器控制寄存器Counter Control register的DEC位可以控制计数器的计数方向是1还是-1。通过修改间隔计数器Interval mode的值可以控制计数的范围是0到间隔计数器的值。当计数值经过0的时候会产生一个计数器间隔中断Interval Interrupt。当计数器的值等于匹配计数器Match register值的时候会产生一个匹配中断Match Interrupt。 溢出模式Overflow mode: 计数器在0x0000和0xFFFF之间连续的1或者-1变化并通过修改计数器控制寄存器的DEC位来控制计数的方向。当计数值经过0的时候会产生一个溢出中断Overflow Interrupt。当计数器的值等于匹配计数器值的时候会产生一个匹配中断。 1.3.2 事件定时器/脉宽计数器Event Timer操作 从名字脉宽计数器可以推断出其功能是对外部输入信号的脉宽进行测量原理有一些类似电机差分编码器的M法测速。 事件定时器内部有一个对用户不可见的16位内部计数器Internal Counter该计数器被CPU_1x的时钟控制其满足如下两个条件 1.当外部脉冲的非计数阶段被重置为0 2.在外部脉冲的计数阶段开始增加 修改事件定时器控制内部计数器的行为主要通过三个位来控制 1 E_En bit 使能位等于0时将内部计数器复位到0并停止计数 2 E_Lo bit 指定外部脉冲的计数相位 3 E_Ov bit 指定如何处理当内部计数器溢出时如何处理。      当为0的时候溢出导致E_En置为0 当为1的时候溢出导致内部计数器继续循环计数 在另一个寄存器的控制下可以决定溢出时是否产生中断而与E_Ov bit本身的值无关。 当外部计数脉冲的计数相位结束的时候会使用内部计数器的非零计数值对事件寄存器Event Register的值进行更新。因此这个值展示了外部脉冲的宽度。由于内部计数器被CPU_1x的时钟控制因此脉冲宽度是由CPU_1x的时钟周期数来衡量的。 当外部计数脉冲的计数相位阶段如果内部计数器由于溢出被重置为0那么事件寄存器将不会被更新并保持上次非溢出计数操作的旧值。 1.4 寄存器概述 功能 名称 概述 时钟控制 时钟控制寄存器 控制预分频器选择时钟输入选择边沿 计数器控制寄存器 使能计数器设置操作模式设置计数方向使能匹配使能波形输出 状态 计数器数值寄存器 返回计数器的当前值 计数器控制 间隔寄存器 设置间隔值 匹配寄存器1 匹配寄存器2 匹配寄存器3 设置匹配值一共有3组对应了一个TTC内部的3个Counter这种说法不准确其实每个Counter都有自己的一组三个匹配寄存器 中断 中断寄存器 显示当前中断状态 中断使能寄存器 使能中断 事件 事件控制计时器寄存器 使能事件计时器停止计时器设置计数相位 事件寄存器 显示外部脉冲的宽度即内部计数器的计数值 1.5 编程模型 1.5.1 计数器使能的步骤 选择时钟输入源设置预分频值(slcr.MIO_MUX_SEL registers, TTC Clock Control register)进行这一步前需要保证TTC处于不使能状态(slcr.MIO_MUX_SEL registers, TTC Clock Control register)设置间隔值(Interval register)这一步骤是可选的仅在间隔模式进行设置匹配值(Match registers)这一步是可选的如果匹配是使能状态则需要设置使能中断(Interrupt Enable register)这一步是可选的如果需要中断则需要使能设置波形输出的使能状态设置匹配的使能状态设置计数的方向设置模式使能计数器 (TTC Counter Control register)这一步开启计数器 1.5.2 计数器停止的步骤 读取当前计数器控制器的值设置DIS位为1保持其他位不变将上面修改了DIS位的数值写回计数器控制器 1.5.3 计数器重启的步骤 读取计数器控制器的值设置RST位为1保持其他位不变将上面修改了DIS位的数值写回计数器控制器 1.5.4 事件计数器(脉宽计数器)使能的步骤 选择外部脉冲源(slcr.MIO_MUX_SEL registers)所选择的外部脉冲的脉宽将会被时钟CPU_1x的周期所衡量设置计数溢出时的处理选择外部脉冲的电平使能事件计数器select external pulse level这一步开始测量选择的外部脉冲的脉宽高电平或者低电平使能中断(Interrupt Enable register)这一步是可选的如果需要中断则需要使能读取测量到的脉冲宽度(Event register)注意当计数溢出发生的时候返回来的脉宽计数值是不准确的。具体可以看前文对事件计数器的叙述 1.5.5 清除中断和确认的步骤 读取中断寄存器将会自动读取并清除中断寄存器中的所有位1.6 计数器时钟输入的选择 下面展示了如何设置SoC选择对于TTC0中Counter/timer 0 的时钟源使用的是一组if else 语句来实现。 if slcr.MIO_PIN_19[6:0] is 1100000, use MIO pin 19 else if slcr.MIO_PIN_31[6:0] is 1100000, use MIO pin 31 else if slcr.MIO_PIN_43[6:0] is 1100000, use MIO pin 43 else use EMIOTTC0CLKI0 TTC0 的 Counter/timer 1只能使用EMIOTTC0CLKI1 TTC0 的 Counter/timer 2只能使用EMIOTTC0CLKI2 下面展示了如何设置SoC选择对于TTC1中Counter/timer 0 的时钟源使用的是一组if else 语句来实现。 if slcr.MIO_PIN_17[6:0] is 1100000, use MIO pin 17 else if slcr.MIO_PIN_29[6:0] is 1100000, use MIO pin 29 else if slcr.MIO_PIN_41[6:0] is 1100000, use MIO pin 41 else use EMIOTTC1CLKI0 TTC1 的 Counter/timer 1只能使用EMIOTTC1CLKI1 TTC1 的 Counter/timer 2只能使用EMIOTTC1CLKI2 IMPORTANT当选择MIO引脚或EMIOTTCxCLKIx作为时钟源时如果时钟停止运行相应的计数值寄存器将保留旧值而不管时钟已经停止的事实。在这种情况下必须谨慎。这句话理解为时钟停止运行这件事可能是很容易被忽略的。 2 SDK分析 2.1 工程建立 在任意一个ZYNQ工程中进行如下配置 这里对TTC0和TTC1都打上对勾在Block Design就会多出6个Pin脚。为下一期的6占空比PWM输出做准备~ 右键每一个Pin脚设置Make External 之后在xdc文件中对输出的引脚进行绑定即可。 同时可以在Clock Configuration看到时钟的频率这里显示TTC1和TTC2的时钟源都是来自CPU_1x的内部时钟频率是133.333333MHz 至此Block Design部分就设置完毕了。 首先修改完Block Design之后需要先点F6进行Validate Design操作验证Block Design的正确性。 之后点击Generate Output Products生成输出。 下一步点击左侧的Generate Bitstream输出比特流文件。 之后点击File-Export-Export Hardware将硬件信息导出。 之后点击File-Lauch SDK新建一个空的工程。这一步的流程可以参考正点原子的领航者ZYNQ系列视频的嵌入式开发系列 打开Vivado工程对应的SDK文件后我们可以在左侧找到所提供的一些ttc参考文件 我们只需要关注xttcps.h这个头文件即可他是PS中TTC模块驱动头文件给出了比较详细的函数定义 同时也可以找到一些示例文件 这里主要对第一个案例进行代码的讲解。 2.2 案例分析 这里需要读者自行打开上述的案例文件~由于不需要额外硬件设置可以直接在SDK中看到上述内容。 这里我们针对这一文件简单介绍一下ttc的设置流程。 这个文件内部给出了利用TTC产生中断的案例共分成了几个步骤。 1.设置中断系统SetupInterruptSystem() Line547552初始化中断控制器 Line562注册中断处理 Line569使能中断 2.设置Ticker定时器SetupTicker()  需要注意的是SetupTicker里面包含了信息的初始化对单个定时器的设置中断的设置。相当于将这几部分结合在了一起。 该函数从Line257开始这里引用了一个数据结构TmrCntrSetup定义在Line100 typedef struct {     u32 OutputHz;    /* Output frequency */     XInterval Interval;    /* Interval value */     u8 Prescaler;    /* Prescaler value */     u16 Options;    /* Option settings */ } TmrCntrSetup; 并且Line261调用了Line131定义的数组  static TmrCntrSetup SettingsTable[2] {     {100, 0, 0, 0},    /* Ticker timer counter initial setup, only output freq */     {200, 0, 0, 0}, /* PWM timer counter initial setup, only output freq */ };  可以看到这个数组分别用来设置Ticker timer和PWM timer的状态分别包括输出频率间隔值预分频系数输出选项设置。 对于输出选项的设置是在Line267通过或操作来实现具体的可选参数可以看xttcps.h中的定义 回到xttcps_intr_example中Line267定义当前模式为间隔模式同时设置了不输出波形。如果这里设置输出波形那么当计数器值等于匹配值的时候会将输出进行翻转实现波形输出。 之后在Line275调用了SetupTimer函数实现对单个定时器的具体设置。这一函数定义在Line469。注意信息的传递是通过TTC_TICK_DEVICE_ID来实现的。 主要实现的功能就是初始化设备XTtcPs_LookupConfig、XTtcPs_CfgInitialize将SetupTicker中的设置传递过来分别包括设置选项模式XTtcPs_SetOptions、计算间隔值XTtcPs_CalcIntervalFromFreq、设置间隔值XTtcPs_SetInterval、设置预分频系数XTtcPs_SetPrescaler 设置完成后就获得了设置好的设备TtcPsTick。 回到SetupTicker中Line285实现对中断控制器的设置将设备以及中断处理函数进行定义。 中断处理函数TickHandler定义在Line592首先在Line599获取中断的类型之后在Line600清除中断。在Line602对中断的类型进行判断这里检测的是XTTCPS_IXR_INTERVAL_MASK其定义以及其他类型的中断我们可以在xttcps_hw.h找到这里面定义了六种中断类型 当检测到对应类型的中断我们就利用TickCount对间隔终端出现的次数进行累加处理。 回到SetupTicker中在Line294和Line300进行了中断的使能操作之后在Line305设置开启定时器。 3.设置PWM定时器SetupPWM() 这个相信也是很多人比较关注的部分。 Line328实现一些设置信息主要是将前面的数组第二个元素存储过来。 Line334设置间隔模式、匹配模式、并使能wave的输出这里就保证了当计数值与匹配值相同的时候输出信号就会发生翻转。从而可以利用间隔值设置PWM的周期利用匹配值设置PWM的占空比。 Line342同样调用SetupTimer来实现对单个定时器的具体设置具体说明可以看上面的部分。这一函数定义在Line469。注意信息的传递是通过TTC_PWM_DEVICE_ID来实现的。 主要实现的功能就是初始化设备XTtcPs_LookupConfig、XTtcPs_CfgInitialize将SetupPWM中的设置传递过来分别包括设置选项模式XTtcPs_SetOptions、计算间隔值XTtcPs_CalcIntervalFromFreq、设置间隔值XTtcPs_SetInterval、设置预分频系数XTtcPs_SetPrescaler 设置完成后就获得了设置好的设备TtcPsPWM Line352通过调用XScuGic_Connect实现对中断控制器设备ID中断处理函数以及匹配值指针的设置。 中断处理函数PWMHandler定义在Line637当检测到中断信号是间隔中断也就是表示输出了一个周期就会在Line653调用XTtcPs_SetMatchValue进行匹配值的设置在代码注释中提到匹配寄存器0是特殊的如果输出被使能当匹配值与计数值相等时会修改输出的极性。 但是这个地方的注释是容易被误解的TTC定时器的三个匹配寄存器功能是不一致的并不是都可以用于波形的输出在ZYNQ官方实例中register0被指定为Special也就是当计数器与register0的匹配值相等时会触发特殊中断事件并翻转输出电平。经试验表明对于同一个Counter来说register1和register2并不会影响PWM输出的翻转但是由于每个TTC中有三个Counter其实可以设置三个register0的值来实现三个不同占空比PWM的输出。 回到SetupPWM中在Line361和Line367进行了中断的使能操作之后在Line372设置开启定时器。 4.逐渐修改占空比WaitForDutyCycleFull() 这个函数定义在Line397主要是通过当每一次循环输出一次PWM波之后TickHandler函数会在Line607将PWM_UpdateFlag更新为TRUE之后会在WaitForDutyCycleFull中满足if的条件从而修改全局变量MatchValue的值。通过中断处理函数PWMHandler中的Line643就实现了MatchValue对MatchReg的赋值从而在Line653可以修改MatchReg的值进而就修改了占空比。 整体逻辑只要抓住下面三点1.间隔模式中断在PWM周期结束更新flag2.修改占空比检测flag修改全局变量改变占空比3.PWM输出中断处理函数也是间隔模式中断将匹配值设置进去。 5.停止计数器XTtcPs_Stop() 这里直接在Line236和Line238调用了XTtcPs_Stop实现了计数器的停止。 这就是本期的全部内容啦如果你喜欢我的文章不要忘了点赞收藏关注分享给身边的朋友哇~
http://www.eeditor.cn/news/124605/

相关文章:

  • 兰州网站建设lst0931免费的室内装修设计软件
  • 购物商城网站制作网上购物商城系统设计
  • 网站描述怎么写比较好wordpress 主题预览空白
  • 手机站点cn百度网站免费电话
  • 房地产公司如何网站建设wordpress 导入网页
  • 定制网站建设制作代写1000字多少钱
  • 阿里巴巴外贸平台中文长沙优化网站建设
  • 汕头网站快速排名优化试玩网页游戏
  • 大型网站开发的主流语言从哪些方面评价一个企业的网站建设
  • 网站流量用什么表示耐克网站建设的历程
  • 游戏网站开发什么意思豆瓣网站是怎么建设的
  • 怎么判断网站是否被收录广州站
  • 帝国建站系统网站空间过期
  • 网站建设基础ppt看啥网一个没有人工干预的网
  • 株洲网站排名优化价格成都市建设厅官方网站
  • 公司注销后 网站备案做网站需要会什么 知乎
  • 内江市网站建设培训wordpress 商家 用户
  • 广州网站改版设计新版wordpress头像
  • 网站建设项目经理如何用微信做网站
  • 深圳外贸网站优化哪家好南昌seo推广外包
  • 网站名称需要用注册吗湖南网站建设 莫道
  • 网站应当实现那些功能 流程如何设计西安创意网站建设
  • 培训机构 网站建设wordpress 可以上传存储附件
  • 织梦网站logo怎么换网站建设是否包含等保
  • 索莱宝做网站推广普通话内容50字
  • 漳州微网站建设公司推荐工程师招聘网站
  • 外外贸网站推广方案免费模板素材软件
  • 专业的句容网站建设广告营销案例100例
  • 上饶建设银行网站正规代加工在哪里找
  • 深圳网站建设就q479185700顶上沧州大型企业网站建设