Aguilera

  • 2020-12-01
  • 发表了主题帖: 升压和升降压直流-直流变换器助力无线充电设计

    将无线充电带入大众视野当数苹果与三星两大手机厂商:2015年,三星发布了支持无线充电的手机—Galaxy S6;2017年,iPhone8以及iPhone X成为苹果首款支持无线充电的手机。此后,华为、小米等国内手机厂商也纷纷试水无线充电,这项技术也一度成为中高端手机新趋势。 无线充电产品以其便利性,可靠性,安全性越来越受到消费者的追捧。除手机以外, 越来越多支持无线充电的TWS无线耳机,智能手表等可穿戴设备不断涌入市场。与此同时,不同种类的无线充电设备也逐渐融入我们的生活场景,如宜家推出配有无线充电底座的台灯,小米推出30W超级无线闪充充电器等。 无线充电系统主要由电源、无线充电发送器和无线充电接受器三部分构成。图1为整个系统的组成主件,图2所示为其电路示意图。无线充电系统是如何工作的呢?以下为其工作原理的简要介绍: 无线充电发送器(Tx)通常由一个 5V 至 20 V 的直流输入电源供电,这个电源来自AC/DC 电源适配器或 USB 端口。一些特殊应用(如手机反向无线充电)也可能为电池供电。 无线功率控制器可驱动半桥或者全桥变换器来传输能量,并通过与接收器的通讯来调节传输功率。 发送器线圈通过电磁感应传输电力,能量被耦合到无线功率接收器(Rx)中。接收器通过一个类似的线圈来接收能量,并通过整流及功率变换电路(如充电电路)为后级提供能量。 接收器可通过通信接口发送命令来调节充电电压,还可以在收到充电结束的指示后,完全终止功率传输。 图1. 无线充电系统   图2. 无线充电系统电路示意图 为提高无线充电系统的工作效率,无线充电发送器(Tx)中线圈所需母线电压Vbus可设计为随着传输功率的大小而 变化:满载充电时,传输功率最大,母线电压升至最高;待机状态时,传输功率最小,母线电压也随之降为最低。 前文提到过,无线充电发送器的电源Vin可能来自AC/DC电源适配器或USB 端口(5V 至 20 V),也可能为电池供电,有着较宽的电压范围。 为匹配不同的电源电压和发送器线圈所需母线电压,在Vin与Vbus之间可使用DC/DC变换器来调节电压,而DC/DC变换器拓扑主要取决于电源电压Vin和线圈所需母线电压Vbus之间的电位关系。 例如一款30W的无线充电器,输入电压Vin为12V 电源适配器提供,母线电压Vbus设计为在2V至20V范围内调节,此时就需要升降压变换器来满足Vin与Vbus之间的电压匹配。有些无线充电器设计为节省成本,选择牺牲待机功耗,在待机状态下发送线圈母线电压设计为输入端电压,则只需要升压芯片来满足充电时Vbus电压要求即可。 德州仪器升压和升降压方案在无线充电设备中的应用 德州仪器提供一系列的升压以及升降压产品,可满足各个功率范围的无线充电发送器的设计需要。下文将简要介绍德州仪器产品在不同应用场景中的最优方案。 德州仪器产品 升压变换器(可支持10W~20W无线充电) TPS61372, TPS61089, TPS61088, TPS61178 升压控制器(可支持20W~50W无线充电) TPS43061 升降压控制器(可支持20W~50W无线充电) LM34936   升压和升降压控制器在无线充电器中的应用 目前,市面上的无线充电器功率在5W~30W不等。由于消费者对无线充电的诉求多为高效快速,大功率无线充电器成为新的趋势。此外,支持给多种无线设备同时充电的无线充电器也以其良好的用户体验越来越受到消费者亲睐。图3所示为无线充电器同时给手机,手表和耳机进行无线充电的应用场景。                   图3. 无线充电器 图4为无线充电器电路示意图,为适应不同额定电压的适配器,输入电压范围设计为5V至20V。在待机状态下为减小待机功耗,输出电压可设计为低至2V;在满载下,输出电压需要升到最高设计值以获得最优的传输效率。如在30W无线快充中,升降压电路的最大输出电压一般设为20V左右。 图4. 升降压方案在无线充电器中的应用 德州仪器LM34936为四开关管的同步升降压控制器,内置2A MOSFET驱动,最大输出电压可至30V,封装小,效率高,适用于大功率无线充电器的设计需要。 如果为了降低成本,可选择升压控制器方案。德州仪器的同步升压控制器TPS43061较普通非同步升压方案可显著工作效率,减少热损耗,是大功率无线充电器设计的理想方案。 升压变换器在反向无线充电手机中的应用 近年来,反向无线充电功能也成为中高端智能手机的趋势之一。智能手机不仅仅作为一款通讯工具,也成为集多功能于一体的智能电子设备,可为TWS无线耳机,智能手表或其他手机进行无线充电,如图5所示。 图5. 支持反向无线充手机的应用场景 反向无线充电手机的电路示意图如图6,其中升压变化器可选择德州仪器的TPS61372或TPS61089。 图6. 升压方案在支持反向无线充手机中的应用 TPS61372在手机反向无线充应用中有以下显著优势: 宽范围电压输出最高可至16V,减小线圈电流,降低线圈损耗; 整体方案尺寸小,设计简单,BOM成本低 芯片采用小尺寸的WCSP封装,仅为1.57mm×1.52mm×0.5mm,如图7所示,特别适用于手机应用; 支持1.5MHz高开关频率,可有效减小外部电感电容的尺寸,降低成本; 外部元件少,设计简单 轻载下可选择PFM模式或者PWM模式,灵活满足客户对于轻载效率或者EMI设计要求。 具有真关断功能,当芯片处于不工作状态时,输入和输出端之间为真关断,减小待机功耗。 图8为典型应用示意图。                                                                                              图7. TPS61372封装示意图                                               图8. TPS61372升压应用电路图                                         对于更大功率的无线充电设计需求,则可选择TPS61089。   升压变换器在无线充电移动电源中的应用 支持无线充电的移动电源也越来越多的涌现出来,其无线充电路结构与手机中的类似,如上图6所示。目前,移动电源的无线充电功率在5W~20W不等,德州仪器升压变换器TPS61089, TPS61088, TPS61178可用于此应用。 图9. 无线充移动电源 TPS61089, TPS61088的最大输出电压都为12.6V,两者分别支持7A和10A的最大开关电流;TPS61178的最大输出电压为20V,能提供最大至10A的开关电流。德州仪器的这三款芯片为集成上下管的同步升压转换器,可满足5W~20W无线充移动电源的设计需要。

  • 2020-11-23
  • 发表了主题帖: 保险丝的选择

    一.正确选择保险丝的额定电流值 必须作如下考虑: ---UL规格保险丝过载能力弱,额定电流 In = Ir/ (Of *Ow)这儿 Ir是电路工作电流, Of =0.75,是保险丝的电流折减率,Ow是温度衰减, 衰减比例如下图,例如电路工作电流Ir=1.5A时,工作温度为40°C,至少应选择 额定电流值>=1.5/0.75/95%(A)的保险丝 二.根据在实际電路中产生的突波波形,计算出突波的I2t值。 再利用“脉冲循环承受能力”曲线图和保險絲的额定熔化热能值 (即保險絲的額定I2 t值)。 比如我使用一个能进行10000次冲击的保险丝,那我们首先根据实际突波波形算出的I2T,然后我们再根据使用次数(本次设计为10000次)就可以就可以计算出选用保险丝需要的的I2T值,比如实际测量I2T为Ir2t,根据使用10000次,If2t=Ir2t / 22% 三.除了I2T,也可以参看耐流时间曲线如下图: 四.快熔断和慢熔断的区别 慢熔断保险丝与快熔断保险丝的最大区别在于对瞬间脉冲电流的承受能力的不同。 也就是说两者可以抵抗开关机时浪涌电流的冲击而不动作,从而保证设备的正常运作. 因此慢熔断型保险丝往往又被称为耐浪涌保险丝。   从技术层面上来说,慢熔断保险丝具有较大的熔化热能值I²t,保险丝熔断所需要的能量较大,所以对于同样额定电流的保险丝来说,慢熔断比快熔断耐脉冲的能力要强很多。   由于慢熔断保险丝的I²t比同规格的快熔断保险丝要大,所以在电路发生过电流时的熔断时间也会比快熔断的要慢一些,那么会不会象有些人担心的保护性能差了呢?   经实验验证:不会!   因为一旦电路出现故障,过电流就不会自行消失,持续过电流的能量会大大超过保险丝的I²t,无论何种保险丝都会被熔断。   慢熔断和快熔断之间的时间差异对其保护要求来说是不很重要的,只有在被保护电路中有敏感器件需要保护的情况下,慢熔断才会对保护性能有所影响。   由于以上这些差异,慢熔断保险丝和快熔断保险丝会被应用在不同的电路中:   纯阻性电路(没有或很少浪涌)或需要保护IC等敏感贵重器件的电路中必须采用快熔断保险丝;   而容性或感性电路(开关机时有浪涌)、电源输入/输出部分最好采用慢熔断保险丝。   另外除了保护IC的电路外,大部分使用快熔断保险丝的场合都能够改用慢熔断保险丝,使其提高抗干扰能力。   反之在使用慢熔断保险丝的地方若改用快熔断保险丝,则往往会造成开机即断保险丝无法正常工作的现象。

  • 2020-11-22
  • 发表了主题帖: 串口通讯基于stm32的代码实现

    串口通讯是一种很常用的通讯方式,用的电缆数量少、操作简单。下面来看一下串口通讯的定义、原理及基于stm32的代码实现(带注释便于理解)。 具体内容如下: 一、通信接口 处理器与外部设备通信的两种方式: 并行通信: -传输原理:数据各个位同时传输。-优点:速度快-缺点:占用引脚资源多 串行通信: -传输原理:数据按位顺序传输。-优点:占用引脚资源少-缺点:速度相对较慢 串行通信,按照数据传送方向,分为:单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 串行通信的通信方式:**同步通信:**带时钟同步信号传输。如:SPI,IIC通信接口**异步通信:**不带时钟同步信号。如:UART(通用异步收发器),单总线 常见的串行通信接口: 二、STM32的串口通信接口 UART:通用异步收发器(universal asynchronous receiver and transmitter) USART:通用同步异步收发器(universal synchronous asynchronous receiver and transmitter) 其中: 通用同步异步收发器(USART) 小容量产品:是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。 中容量产品:是指闪存存储器容量在64K至128K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。 大容量产品:是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品:是指STM32F105xx和STM32F107xx微控制器。 除非特别说明,本章描述的模块适用于整个STM32F10xxx微控制器系列。 我使用的是 STM32F105xx,所以是互联型产品,包含3个USART和2个UART。(USART1/USART2/USART3/UART4/UART5) 三、UART异步通信方式引脚连接方法 -RXD:数据输入引脚。数据接收。 -TXD:数据发送引脚。数据发送。 串口交叉线 串口直通线 四、串口通信过程 五、STM32串口异步通信需要定义的参数起始位数据位(8位或者9位)奇偶校验位(第9位)停止位(1,15,2位)波特率设置 六、串口配置 串口设置的一般步骤可以总结为如下几个步骤: 1、串口时钟使能,GPIO时钟使能 2、串口复位 3、GPIO端口模式设置 4、串口参数初始化 5、开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6、使能串口 7、编写中断处理函数 下面, 我们就简单介绍下这几个与串口基本配置直接相关的几个固件库函数。 这些函数和定义主要分布在 stm32f10x_usart.h 和stm32f10x_usart.c 文件中。 1.串口时钟使能。 串口是挂载在 APB2 下面的外设,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1); 2.串口复位。 当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。 复位的是在函数 USART_DeInit()中完成: void USART_DeInit(USART_TypeDef* USARTx);//串口复位 比如我们要复位串口 1,方法为: USART_DeInit(USART1); //复位串口 3.串口参数初始化。 串口初始化是通过 USART_Init()函数实现的, void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。 第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针, 这个结构体指针的成员变量用来设置串口的一些参数。 一般的实现格式为: USART_InitStructure.USART_BaudRate = bound; //波特率设置;   USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式   USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位   USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位   USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None; //无硬件数据流控制   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式   USART_Init(USART1, &USART_InitStructure); //初始化串口 从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。 我们可以根据需要设置这些参数。 4.数据发送与接收。 STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。 STM32 库函数操作 USART_DR 寄存器发送数据的函数是: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 通过该函数向串口寄存器 USART_DR 写入一个数据。 STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 通过该函数可以读取串口接受到的数据。 5.串口状态。 串口的状态可以通过状态寄存器 USART_SR 读取。 USART_SR 的各位描述如图 9.1.1 所示: 这里我们关注一下两个位,第 5、 6 位 RXNE 和 TC。 RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式: 1)读 USART_SR,写USART_DR。 2)直接向该位写 0。 状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。 在我们固件库函数里面,读取串口状态的函数是: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 这个函数的第二个入口参数非常关键, 它是标示我们要查看串口的哪种状态, 比如上面讲解的RXNE(读数据寄存器非空)以及 TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE), 操作库函数的方法是: USART_GetFlagStatus(USART1, USART_FLAG_RXNE); 我们要判断发送是否完成(TC),操作库函数的方法是: USART_GetFlagStatus(USART1, USART_FLAG_TC); 这些标识号在 MDK 里面是通过宏定义定义的: #define USART_IT_PE ((uint16_t)0x0028)   #define USART_IT_TXE ((uint16_t)0x0727)   #define USART_IT_TC ((uint16_t)0x0626)   #define USART_IT_RXNE ((uint16_t)0x0525)   #define USART_IT_IDLE ((uint16_t)0x0424)   #define USART_IT_LBD ((uint16_t)0x0846)   #define USART_IT_CTS ((uint16_t)0x096A)   #define USART_IT_ERR ((uint16_t)0x0060)   #define USART_IT_ORE ((uint16_t)0x0360)   #define USART_IT_NE ((uint16_t)0x0260)   #define USART_IT_FE ((uint16_t)0x0160) 6.串口使能。 串口使能是通过函数 USART_Cmd()来实现的,这个很容易理解,使用方法是: USART_Cmd(USART1, ENABLE); //使能串口 7.开启串口响应中断。 有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是: void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 这个函数的第二个入口参数是标示使能串口的类型, 也就是使能哪种中断, 因为串口的中断类型有很多种。 比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 我们在发送数据结束的时候(TC, 发送完成) 要产生中断,那么方法是: USART_ITConfig(USART1, USART_IT_TC, ENABLE); 8.获取相应中断状态。 当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。 经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是: ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是: USART_GetITStatus(USART1, USART_IT_TC) 返回值是 SET,说明是串口发送完成中断发生。 七、串口程序完整代码 参看:USART串口通信配置 #include "stm32f10x.h"   u8 Uart1_Get_Flag = 0;   // 串口初始化函数   void My_USART1_Init(void)   {   GPIO_InitTypeDef GPIO_InitStrue;   USART_InitTypeDef USART_InitStrue;   NVIC_InitTypeDef NVIC_InitStrue;   // 1,使能GPIOA,USART1时钟   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);   // 2,设置PGIO工作模式-PA9 PA10复用为串口1   GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出   GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;//USART1_TX PA.9   GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;   GPIO_Init(GPIOA,&GPIO_InitStrue); //初始化 GPIOA.9   GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入   GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;//USART1_RX PA.10   GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;   GPIO_Init(GPIOA,&GPIO_InitStrue); //初始化 GPIOA.10   // 3,串口1初始化配置   USART_InitStrue.USART_BaudRate=115200;//波特率设置   USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制   USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式   USART_InitStrue.USART_Parity=USART_Parity_No; //无奇偶校验位   USART_InitStrue.USART_StopBits=USART_StopBits_1; //一个停止位   USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长为8 位   USART_Init(USART1,&USART_InitStrue);//初始化串口   // 4,打开串口1   USART_Cmd(USART1,ENABLE);//使能串口   // 5,使能串口1中断-接收数据完成中断   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断   // 6,设置中断优先级-主函数中设置中断优先级分组   NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;   NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//IRQ 通道使能   NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级 1   NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级 1   NVIC_Init(&NVIC_InitStrue);//中断优先级初始化   }   void USART1_Puts(char * str)   {   while(*str)   {   USART_SendData(USART1, *str++);   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);   }   }   // 中断服务函数   void USART1_IRQHandler(void)   {   u8 res;   if(USART_GetITStatus(USART1,USART_IT_RXNE))// 接收到数据   {   USART_ClearITPendingBit(USART1,USART_IT_RXNE);   res= USART_ReceiveData(USART1); // 获得串口1接收到的数据   Uart1_Get_Flag=1;   }   }   // 主函数   int main(void)   {   // 设置中断优先级分组位2 - 2位抢占2位相应   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 调用函数 初始化USART1相关引脚配置   My_USART1_Init();   if (Uart1_Get_Flag){   Uart1_Get_Flag = 0;   USART1_Puts(res);   }   return 0;   }

  • 2020-11-08
  • 发表了主题帖: 几个DSP高手的经验介绍

    一. 已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是ISA总线的,我从206开始240、2407A都作过产品,对5402、2812、5471在产品方案规划制定和论证时也研究过。由于方向所限对6X、8X系列没有接触。  发现在国内无论在公司或高校许多地方为了加快开发周期往往把一个产品开发分为硬件和软件两个相对独立部分,由不同的人完成。这在具有一定技术和管理基础的公司,由总设计师统一规划协调,分任务并行完成的情况下是可行的,也是符合现代产品开发规律的。但是在高校人员的流动很大,研究生的有效科研时间很短、基础差(许多研究生起步时对电熔、电阻、三极管的分类和选型都很困难,我也是这样过来的)更不用说系统规划设计了,况且许多老板自己也不太懂,师兄有自己的任务,他们搞明白时也毕业了。在许多高校做DSP就是找一个算法加到自己的主程序里,在板子上跑一下,基本达到效果就可以了,至于可靠性是次要的,产业化无从谈起,这已经算不错的了。  其实我觉得一个系统的完成,系统的规划是最重要的,在规划时对硬件设计的知识和认识是决定性的,它可以让你知道什么是可行的,什么是不可行的,当你同时具有软件设计能力时,就可以合理的分配系统功能,完成使用VHDL进行系统行为描述-—系统功能划分—— 系统子结构设计这样的自顶向下的设计规划流程,成为系统设计专家、项目经理,否则只是硬件工程师、软件工程师。无论作51、196、还是DSP都是这样。  下面分别谈谈我对硬件和软件设计的感受  硬件设计是系统设计的关键,国内和国外产品的差距往往是硬件设计水平高低决定的,任何软件设计思想没有可靠的物理载体都是空中楼阁,纸上谈兵。学校的研究生很多都想避开硬件设计,对于一个全新的设计与其说不屑不如说不敢。试想一下烧几个片子的压力要比跑飞几段程序的压力大的多,尤其是功率器件,一旦烧掉,弄不好火光冲天,人的自信都没了。况且改一次板周期长,经费高,还不知行不行。其实在国外实力一般的公司也是尽量避免硬件的更新设计,产品一旦定型往往通过软件升级,这是公司的发展策略,对个人而言物以希为贵,培养一个硬件设计师往往要比软件设计师时间长花费多。在设计dsp硬件时,开始设计最小系统板,系统按功能分板设计调试,注意分板电路的稳定性可能不如整板电路,要多加入抗干扰环节,分板间的引线包括电源线地线要短,尽量在10公分以内,实在不行加入光耦隔离、采用隔离电源。切记电源线、地线的干扰远比信号干扰对系统的危害大得多,又常常被人忽视。电路板工作正常的先决条件就是电源正常!当分板电路正常后再更居情况设计整板电路。在调试时发现的问题一定要找到原因解决,即使是飞线,割线,不要寄希望于下一板改了再看,除非原理性错误。每一个功能环节多准备几套方案。DSP的选型要根据系统功能而定,2000是一个功能比较全的控制器,但运算性能相对低,但目前大部分控制类、家电类包括中低层次的工业总线通信产品足够了,281X不错但太贵,而且开发技术不成熟。54XX更像一个协处理器,其实高端产品5471就很好,功能完*,但BGA封装对产品的开发有一定难度。如果没有从事过嵌入式系统开发的朋友其实可以从51看起,许多思想是共通的,51很经典没有哪一款微处理器像51那样使用持久和普遍。在硬件设计时更多的精力放在外围电路设计上,外围电路设计的灵活性要比DSP本身高得多,难度大得多。建议多考虑CPLD。  软件设计上,着眼点不要仅局限于某种算法和控制策略,而是软件系统框架的制定,即操作系统的选择和实现,算法和控制策略只是其中技巧性很强的子程序和子程序间参数相互关系,建议设计软件时能具有操作系统、数据结构和编译原理方面的知识,特别是使用C。对DSP的内部硬件结构一定要掌握,特别是中断结构和流程、流水线操作,不然飞都不知道怎么飞的。在语言选择上我当时是这么给自己规定的先编20个左右的汇编程序,每个代码量超过4K,使用语句范围覆盖全部语句的60%-70%,在此基础上使用C。现在发现用C构建程序的主体框架(操作系统)比较快而其不容易出错,(我现在正在用ASM根据UCOSII的思想重写自己的操作系统)但对系统实时性影响比较大的运算算法一般采用MATLAB——C——ASM的办法仿真调试优化,这里的优化不单单是利用优化器优化,而是根据数据的特点改变运算方法,以除法为例C里的/号其实掩盖了许多技巧,当除数为常数时就可以放大倒数移位相乘移位的办法进行,精度高速度快。这些办法只有掌握了ASM语言并用ASM语言思考才会熟练应用。另外我想告诉一些作算法特别是控制算法的朋友,千万不要随意评判一个算法的优劣,在程序中程序和代码优化的程度往往影响了控制效果好坏,而不是算法本身的思想。其实在实际中往往PID甚至PI、PD就够了,神经元、模糊、小波适用于研究和写论文,模糊在实际中用的多一点,主要是小日本用的比较成熟,我再恨日本人,这点也服气,小日本就是滑,许多物理现象搞不透,就用这法,还管用,题外话。  最后我想说的是,当我们面对市场要求时,产品往往考虑的是可靠性、性能、价格而不是你用的什么芯片,在满足性能的基础上结构越简单就越可靠,芯片越通用价格就越低,能用51就不用196,能用2407就不用2812,除非把芯片本身作买点利用高成本赢取高利润。无论2000还是5000、6000系列都有市场前景,关键是要做深做透  获取知识的方法、处理项目的能力是相通的,具体的说就是不要把目光盯在做硬件还是做软件上,用ASM还是C,要勤动手打好基础,提高自己对系统总体设计的能力,从系统的眼光看问题。为什么都是做DSP的有的毕业拿3000,有的5000、8000,除了运气和关系外,重要的是你对事物的认识深度和高度。我一直都记住这句话:有前途的人做什么都有前途,没前途的人做什么都没前途。  二. 与其说是钻在里面,毕业设计是搞240,在老师的压力做出了一点东西,这期间主要是对DSP的各种基础知识的熟悉与理解,对DSP的真正深入是在公司工作以后。当初进公司,因为正有一个项目需要用5410要我接手。说实话,在学校期间我5000的书都没有看过一眼,可没办法,只能靠自己了。不过好的是我2000DSP的基础很好。接过项目后,我第一个星期就全部看的是5000的指令,DSP的结构倒没怎么看,因为项目硬件已成型,主要是算法。这样,花了一个星期熟悉指令与项目相关的程序,第二个星期也就开始编程了。半个月以后我对5410也就用很熟了的,当然主要还是讲在算法方面。这个项目太概做了四个月吧,系统程序是我编写的,主要有如64位加减乘除乘方开方、及时域方面的一些算法。现在又做一个控制系统,用2407开发的,硬件主要有直交变频,并把2407的所有外设资源全部用到了。现在我可以这样自夸一句吧:TI的2000系列与5000系列的我都熟悉,要我去以此做个系统,没问题。上面是把我搞DSP的经历简单说了一下的吧,在这里我想对正在学及想学DSP的难兄们说一句的是,DSP并不是很难。当然,这个前提是你的基础要好,我单片机,接口都还行,当初就是从单片机改成DSP的。有了单片机的基础再去学2000第列的DSP(下面的DSP单指2000系列,另有说明为止),你就可以把DSP看成一个super microcontroller了。相比之下,DSP除了比单片机多了更丰的外设接口(SPI,SCI、CAN、PWM、CAP、QEP等等),他就是一块单片机,只不过在单片机来说你要另加芯片的工作,DSP全部把它做在一块芯片去了,我现在看DSP也真就这么简单。前面有人提到DSP主要是做算法,这句话有一定的片面性: TI有很多系列的DSP,现在主流的DSP主要为2000系列、3000系列、4000系列、5000系列、6000系列。除了2000与5000系列是定点DSP外,其余的均为浮点系列。 TI的2000系列主要长处是在用于控制系统,因为它的资源非常丰富,前面提到,在控制系统中用到的一些外设2000系列均在片内集成了。 TI的5000系列主要长处是用于数字信号的算法处理,这里所讲算法处理主要是指在数字信号处理时的一些算法,如FIR、IIR、FFT等等。5000系列的DSP的速度比2000快,2407最快只能到40M,2800系列除外,5410的DSP可以达到160M,如现在我们主要用来做数字信号方面的处理以及简单的静态图像处理等这样一些在资源需要处于中等的一些算法。 TI的6000系列主要是用在实时图像处理,这个就更则重于算法处理。一般的硬件很少自制,我们是用TI的DSK板再加上自主板相结合。 三. 使用C/C++语言编写基于DSP程序的注意事项 1、 不影响执行速度的情况下,可以使用c或c/c++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师”优化处理,例如:进行绝对值运算,可以调用fabs()或abs()函数,也可以使用if...else...判断语句来替代。 2、 要非常谨慎地使用局部变量,根据自己项目开发的需要,应尽可能多地使用全局变量和静态变量。 3、 一定要非常重视中断向量表的问题,很多朋友对中断向量表的调用方式不清楚。其实中断向量表中的中断名是任意取定的,dsp是不认名字的,它只认地址!!中断向量表要重新定位。这一点很重要。 4、 要明确dsp软件开发的第一步是对可用存储空间的分析,存储空间分配好坏关系到一个dsp程序员的水平。对于dsp,我们有两种名称的存储空间,一种是物理空间,另一种是映射空间。物理空间是dsp上可以存放数据和程序的实际空间(包括外部存储器),我们的数据和程序最终放到物理空间上,但我们并不能直接访问它们。我们要访问物理空间,必须借助于映射空间才行!!但是映射空间本身是个“虚”空间,是个不存在的空间。所以,往往是映射空间远远大于实际的物理空间,有些映射空间,如io映射空间,它本身还代表了一种接口。只有那些物理空间映射到的映射空间才是我们真正可访问(读或写)的存储空间。 5、 尽可能地减少除法运算,而尽可能多地使用乘法和加法运算代替。 6、 如果ti公司或第三方软件合作商提供了dsplib或其他的合法子程序库供调用,应尽可能地调用使用。这些子程序均使用用汇编写成,更为重要之处是通过了tms320算法标准测试。而且,常用的数字信号处理算法均有包括!! 7、 尽可能地采用内联函数!!而不用一般的函数!!可以提高代码的集成度。 8、 编程风格力求简炼!!尽可能用c语言而不用c++语言。我个人感到虽然c++终代码长了一些,好象对执行速度没有影响。 9、 因为在c5000中double型和float型均占有2个字,所以都可以使用,而且,可以直接将int型赋给float型或double型,但,尽可能地多使用int数据类型代替!这一点需要注意!! 10、 程序最后至少要加上一个空行,编译器当这个空行为结尾提示符。 11、 大胆使用位运算符,非常好用!! 12、 2003年6月份从ti的网站上下到了关于tms320c67x系列dsp的快速算法库,于是,tms320c5000和c6000全系列的快速算法库都问世了,这些算法库均可供c/c++语言直接调用,优化程度100%,实际编程时尽可能地使用(下载时可以同时下载到说明文档和ascii源程序,可以根据自己需要作出修改,修改前最好做个备份)。

  • 发表了主题帖: TI 适用于基于语音的应用的音频预处理系统参考设计

    该参考设计使用多个麦克风,波束成形算法和其他过程来在噪声和其他杂波中提取清晰的语音和音频。 语音激活的数字助理在易受噪声影响的环境中使用的应用程序的迅速增加,产生了对从嘈杂环境中提取清晰语音的系统的需求。 该参考设计使用麦克风阵列和复杂的信号处理来从嘈杂的环境中提取清晰的音频。 特性 用于音频预处理的单个数字信号处理器(DSP)SoC 带4个麦克风的线性麦克风板(LMB) 音频预处理软件 具有模块化组件的硬件/软件解决方案,可构建音频预处理解决方案以实现清晰的语音触发和识别

  • 发表了主题帖: USB 记忆棒开发套件之TMDX5535EZDSP 系列

    本帖最后由 Aguilera 于 2020-11-8 17:39 编辑    TMDX5535eZdsp 是一款由 USB 供电的小型超低成本 DSP 开发套件,其囊括了用于评估 C553x 系列(业界成本和功耗均最低的 16 位 DSP)所需的所有软硬件。该款超低成本套件可快速轻松地评估 C5532、C5533、C5534 以及 C5535 处理器的高级功能。该套件配备板载 XDS100 仿真器,能够实现全过程级调试 (Full course-level debug) 功能,同时还可支持 Code Composer Studio™ (CCStudio) 集成开发环境 (IDE) 4.x 版和包括 DSP/BIOS™ 内核的 eXpressDSP™ 软件。开发套件的全部内容包括 C5535 ezdsp 电路板、CCStudioIDE(修订版)4.x 、带麦克风的耳机、2GB 的微型 SD 卡、USB 音频类免费软件框架和人机交互设备 (HID) 应用以及 USB 音频类应用的全面创新功能演示。 TMS320C5532、TMS320C5533、TMS320C5534 和 TMS320C55835 是业内成本最低、功耗最低的 16 位处理器,可帮助显著节约能源并延长电池寿命。C553x 产品系列具有 200MIPS 性能、高达 320KB 的片上存储器以及高于同类器件的集成度(包含用于 FFT 计算的硬件加速器),可为各种信号处理应用提供基础,其中包括录音机、乐器、便携式医疗解决方案以及工业和安保应用中的其他消费类电子产品。 TMDX5535 eZdsp 的特性包括: 适用于 C5535 处理器的小型 DSP 开发套件 TMS320C5535 定点超低功耗 DSP 嵌入式 XDS100 仿真器 USB 2.0 高速 Micro SD 卡插槽,附 2 GB micro SD 卡 线性输入/MIC 输入、耳机输出音频插孔 60 引脚扩展连接器 96 x 16 像素 OLED 显示屏 随附 Code Composer Studio IDE 4.x 用于 USB 音频类和 HID 应用的软件框架 开包即用演示软件 CD-ROM 上提供完整文档及源代码 软件 完全的集成开发环境 (IDE)、高效优化的 C/C++ 编译器、汇编器、链接器、调试器、采用 CodeSense 技术的集成 CodeWright 编辑器,加快了代码创建速度、数据可视化,还有分析器和灵活的项目管理器 DSP/BIOS™ 实时内核芯片支持库 用于 USB 音频类和 HID 应用的免费集成软件框架,包括开包即用演示

  • 发表了主题帖: TMS320之C5000系列选型指南

            TMS320C5000™ 平台提供了业界功耗最低的广泛 16 位 DSP 产品系列,性能高达 300MHz (600 MIP)。这些产品针对强大且经济高效的嵌入式信号处理解决方案进行了优化,其中包括音频、语音、通信、医疗、安保和工业应用中的 便携式器件。待机功率低至 0.15mW,工作功率不到 0.15mW/MHz,是业界功耗最低的 16 位 DSP。即使像无空闲周期的 75% 双 MAC 和 25% 增 加操作这样的大活动量使用案例,包括存储器在内的核心的工作功率也不到 0.15mW/MHz。由于性能高达 300MHz,C5000 能够给便携式器件带来 复杂的数字信号处理功能,以支持一流的创新。

  • 发表了主题帖: TI C5000™ 超低功耗 DSP

    C5000™ 超低功耗 DSP 平台包含业界功耗极低的 16 位 DSP 产品组合,产品丰富多样,性能高达 300MHz (600 MIPS)。非常适用于音频、语音和视觉类便携设备及其他需要分析的超低功耗应用。

  • 2020-11-05
  • 发表了主题帖: TI DSP C6657学习之——编译静态库.lib

    熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll。引入库的目的一是减少代码的编译时间,二是只提供函数/方法接口,可以有效的保护源码不被泄露。下面将在DSP C6657上编译静态库.lib 工具 DSP C6657 EVM官方评估板 CCS8.1 win10 PC 编译静态库 思考 Visual Studio 2017上编译静态库static library的过程: 新建一个.h头文件(写函数的声明) 新建一个.cpp文件(写函数的具体实现) 在vs2017中的工程属性中,将编译输出改为static library 生成解决方法,编译出.lib库文件 测试,新建一个vs工程,将.h和.lib加入工程目录,在cpp中包含.h文件,直接调用函数。 DSP上编译静态库和Visual Studio上的区别 相同之处:都要编写.h,cpp文件,工程输出设置为static library。不同之处:采用不同的complier编译cpp,vs2017采用Microsoft C++编译器编译cpp,  DSP上采用gmake编译cpp。 DSP上编译静态库 step1:新建一个CCS Project 注意: 工程名称:DSP6657_CompleLib   step2:编写库文件的代码 我们先实现一个简单函数接口(返回2个整数之和): int add_test(int a,int b) .h文件--------函数的声明 /*  * add_test.h  *  *  Created on: 2018年8月22日  *      Author: weiPenghui  */ /*  * 测试编译静态库.lib文件  * 方法:  * step1:新建CCS工程时,将ToolChain设置为 static Library  * step2:编写.h,c文件  * step3:build生成.lib文件  *  * 总结:和windows上C/C++ lib编译的方法相似  */ #ifndef ADD_TEST_H_ #define ADD_TEST_H_ extern int add_test(int a,int b); #endif /* ADD_TEST_H_ */ .c文件----函数的具体实现 /*  * add_test.c  *  *  Created on: 2018年8月22日  *      Author: weiPenghui  */ #include"add_test.h" int add_test(int a,int b){     return a+b; } step3:编译生成lib Project->Build Project  在工程目录生成lib静态库: 至此,成功生成了.lib文件,很激动有木有! 测试运行 新建一个工程,取名:DSP6657_TestComplieLib。将上一步的.lib以及.h文件复制到测试工程的根目录。   /**  * main.c  */ #include<stdio.h> #include<stdlib.h> #include"add_test.h" /*  * 测试调用编译好的静态库.lib  * 方法:将静态库文件.lib,头文件.h加入工程  */ int main(void) {     int num1 = 10;     int num2 = 12;     int res = add_test(num1,num2);     printf("num1=%d,num2=%d,res=%d\n",num1,num2,res);     return 0; } Run起来... 运行结果:    

  • 发表了主题帖: C64x+ CACHE一致性问题分析

    在任何时刻,Core或者其它Master访问存储器中数据时,由于CACHE的存在造成不能够得到最近更新过的数据,就会出现CACHE一致性问题。 在一个特定的时间范围内,各级CACHE和它的下一级存储器中的内容不一致是正常的。因为CACHE的作用是在一段时间内将低速存储器中的内容自动搬运到高速的CACHE中重复使用。当CACHE中的空间被后续的数据占用的时候,才将CACHE中的内容进行失效或者回写的操作。在失效或者回写之前,CACHE中的内容可能与物理存储器中的内容是不一致的。这种临时性的不一致是正常的,上述CACHE一致性问题的描述不包含此类正常情况。 CACHE的引入是为了提高Core存取数据的效率,所以出现CACHE一致性问题一定与Core对存储器的访问有关。Core对存储器的访问分为两类: 1. Core读代码或者数据; 2. Core写代码或者数据。 据此,CACHE的一致性问题分为两个大类:Core读一致性问题和Core写一致性问题。在下面两个小节中,分别描述了这两种情况的模型: 3.1 Core读一致性模型 图 3给出了Core读一致性的模型。在这个模型中,CACHE一致性问题的存在取决于图中虚线箭头指示的第二步操作能否在Core从CACHE中重新读数据之前完成。如果不能,则会造成Core读取的数据不是其它Master更新后的数据,而是原来CACHE中的内容,从而导致一致性的问题。 图 3 Core读一致性模型 L1P CACHE对L2内存或者DDR2外存中的代码进行缓存。当Core第一次对L2或者DDR2中的代码进行读操作的时候,由于代码不在L1P CACHE中,CAHCE硬件会将L2或者DDR2中的代码读到L1P CACHE中。Core可以得到最新的代码,不存在一致性的问题。此后,如果其它Master更新L2或者DDR2中的代码,然后Core再次读取此部分代码时,会发现相应的代码已经存在L1P CACHE中,此时Core会直接从L1P CACHE中读取代码。由于Core不能得到最新的代码,就出现了Core读一致性的问题。 L1D Core读一致性问题的原理和L1P相同,只是L1D缓存的是L2或者DDR2中的数据。 L2 CACHE对DDR2中的代码/数据进行缓存,当Core第一次对DDR2中的代码/数据进行读操作,这时代码/数据不在L2 CACHE中,需要进行L2 CACHE的加载,Core可以得到最新的代码/数据。之后,其它Master对DDR2中的代码/数据进行更改,Core重读此部分代码/数据的时候,Core读到的是L2 CACHE中的内容而不是DDR2中最新的代码/数据,因此也存在Core读一致性的问题。 3.2 Core写一致性模型 图 4给出了Core写一致性的模型。在这个模型中,CACHE一致性问题的存在取决于图中虚线箭头指示的第二步操作能否在其它Master从存储器中读数据之前完成。如果不能,会造成其它Master从存储器中读到的数据是原来的数据而不是Core更新过的数据,从而导致一致性的问题。 图 4 Core写一致性模型 当Core对L2或者DDR2中的代码/数据进行写操作的时候,如果代码/数据已经在L1 CACHE中,新的代码/数据会被更新到L1 CACHE中。当其它Master从L2或者DDR2中读代码/数据的时候,会直接从L2或者DDR2中读取相应的内容,如果L1 CACHE中新的代码/数据未被更新到L2或者DDR2中,则其它Master读取的不是更新后的内容,就会出现Core写一致性的问题。 同样,Core更新过的代码/数据有可能只是缓存在L2 CACHE中,其它Master从DDR2中读取的内容不是更新后的内容,同样会出现Core写一致性的问题。 3.3 C64x+一致性分析 在C64x+上的CACHE一致性问题,需要根据放置代码/数据的相应位置进行分析。由于在C64x+平台上,L1P、L1D和L2内存既可以作为CACHE又可以作为存储器使用,因此,在分析一致性问题的时候,需要考虑以下几种情况 Case1. 代码在L1P存储器中; Case2. 代码在L2存储器中; Case3. 代码在DDR2存储器中; Case4. 数据在L1D存储器中; Case5. 数据在L2存储器中; Case6. 数据在DDR2存储器中。 对于Case1,由于代码直接在L1P存储器中,不需要进行CACHE,所以不会存在一致性的问题。 对于Case2和Case3,涉及到L1P CACHE,存在代码的更新能否被Core读到的问题。代码的更新分成两种情况:一是Core在运行过程中对代码进行修改;二是其它Master对代码的修改。这两种情况下,都会存在CACHE读一致性问题,需要由软件来维护。 对于Case4,数据直接在L1D存储器中, Core始终能够读到其它Master更新到L1D内存中的内容,Core写过的数据也能够被其它Master直接从L1D内存中读到。所以不会存在一致性的问题。 对于Case5,数据在L2存储器,按照上面的分析,会存在CACHE读和写一致性的问题。在C64x+平台上这种情况下的一致性问题会由硬件自动维护。 对于Case6,也会存在CACHE读和写一致性的问题,这种情况需要软件进行CACHE一致性的维护。

  • 发表了主题帖: C64x+ 存储器组织结构

    TI对高性能C64x核进行了改进,使其性能大大提升,称之为C64x+DSP核。基于C64x+核开发的DSP芯片,所有部件都以交换网络(SCR)为核心连接起来。SCR上的部件分为两类:Master和Slave。Master包括Core、EDMA以及串行高速IO(sRIO),EMAC等外设。Master可以直接通过SCR发起到Slave的数据传输。Slave包括每一个Core的内存,DDR2外存以及其它不能直接发起数据传输的外设,Slave之间的数据传输,需要通过DMA协助完成。各款基于C64x+DSP的数据手册上详细描述了SCR的配置和Master、Slave的情况。 C64x+系统的存储器框图如图 1所示。存储器被分成了三级:第一级是L1,包含数据存储器(L1D)和代码存储器(L1P);第二级是代码和数据共用存储器(L2);第三级是外部存储器,主要是DDR2存储器。L1P、L1D和L2的CACHE功能分别由相应的L1P控制器、L1D控制器和L2控制器完成。表 1总结了C64x+平台上可用的CACHE情况。 图 1 C64x+存储器框图 表 1 C64x+ CACHE特性   C64x+平台上L1P用来存储或者缓存代码;L1D用来存储或者缓存数据。L1P和L1D大小都是32K字节,可以分别配置0K、4KB、8KB、16KB或者32KB作为CACHE,其余作为代码或者数据RAM。作为CACHE的部分,用来缓存L2和DDR2的数据或代码。作为RAM的部分,可以存储关键的代码或者数据使得Core能够以很高的速度 C64x+平台上L2 存储器可用于存储代码和数据。L2上最大可以分配256K字节CACHE来缓存DDR2中的数据或代码。L2中其余部分作为RAM存储代码和数据。 图 2描述了Core访问存储器内容的操作流程。在这个访问流程中,Core对于存储器的访问总是先从离Core最近的一级存储器开始,如果命中,Core可以直接得到代码/数据,否则代码/数据会被加载到前几级的CACHE中,从而Core可以得到要处理的代码/数据。在这个动态访问过程中,各级CACHE中的内容和下一级存储器中的内容可能存在不一致,这种瞬态的不一致不会造成问题。但是,如果Core或者其它Master不能得到另外一方对存储器内容更新后的内容,就会出现CACHE一致性问题。 图 2 Core访问存储器流程

  • 发表了主题帖: C64x+ CACHE一致性维护操作

    出现CACHE一致性问题时,为了保证Core或者其它Master在进行数据操作的时候能够得到最新的数据,需要进行CACHE的一致性维护操作。CACHE一致性问题维护在设计中,有两种处理方式:硬件自动维护和应用程序进行维护。 下面具体分析以上几种情况在C64x+平台上如何进行CACHE一致性问题处理: 4.1 硬件维护的CACHE一致性 在C64x+平台上,硬件会对Case5的情况自动进行数据一致性维护。分析需要分为读写两类操作进行,图 5和图 6分别描述了Core对L2上的数据进行读和写的情况。 图 5 Core读L2数据的情况 图 6 Core写L2数据的情况 其它Master要对L2中的内容进行更新操作时,L2控制器会根据被更新数据的地址判断相应的地址是否在L1D CACHE中,如果在L1D CACHE中,硬件会自动将更新的数据拷贝一份到L1D CACHE中。当Core重新对L2中的这部分数据进行处理的时候,如果要读取的数据已经在L1D CACHE中,Core可以直接从L1D CACHE中得到更新过的数据。如果要读取的数据不在L1D CACHE中,L1D控制器会自动从L2加载数据,Core也可以得到更新后的数据。过程如图 5中的1和2所示,这样就可以解决一致性的问题 其它Master要对L2中的内容进行读操作的时候,L2控制器会判断要读取的数据地址是否在L1D CACHE中,对于在L1D CACHE中的数据,硬件会自动从L1D CACHE中读取最新的数据。对于不在L1D CACHE中的数据,说明L2中的数据已经是最新的数据,可以直接从L2中读取。通过这样的处理,可以保证其它Master读到Core更新后的数据,从而可以解决一致性的问题。过程如图 6中的1和2所示。 4.2 软件维护的CACHE一致性 在C64x+平台上,Case2、Case3和Case6的情况需要软件进行的一致性维护操作以保证Core或者其它Master可以得到最新的数据。 4.2.1 C64x+软件一致性维护实现 C64x+平台上由软件控制的一致性维护操作包含三种:CACHE数据失效、CACHE数据回写和CACHE数据回写并失效。启动维护操作需要配置相应的基地址和计数寄存器,当计数寄存器中的值变为0时表示操作完成。TI提供的芯片支持库中也提供了相应的API来完成相应的功能。各种操作涉及的各级CACHE的一致性操作控制寄存器列在表 2中。 WB:全局回写寄存器 INV:全局失效寄存器 WBINV:全局回写并失效寄存器 IBAR: 部分失效基地址寄存器 IWC:部分失效计数寄存器 WBAR:部分回写基地址寄存器 WWC:部分回写计数寄存器 WIBAR:部分回写并失效基地址寄存器 WIWC:部分回写并失效计数寄存器 表 2 C64x+ CACHE一致性维护寄存器     例如,需要对L2 CACHE进行部分回写操作,需要将回写的DDR2的地址配置到L2WBAR,同时将需要回写的数据32-bit长度写到L2的计数寄存器L2WWC中,当L2WWC中的值变为0之后,表示回写操作已经完成。

  • 发表了主题帖: TI DSP TMS320C6678、Xilinx K7 FPGA XC72K325T的高速数据处理核心板

    一、板卡概述    该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6678和一片Xilinx FPGA K7 XC72K325T-1ffg900。包含1个千兆网口,1个FMC HPC接口。可搭配使用ADFMC子卡、图像FMC子卡等,用于软件无线电系统,基带信号处理,无线仿真平台,高速图像采集、处理等。 TMS320,C6678,K7,FPGA,XC72K325T,高速数据处理核心板,软件无线电系统,基带信号处理,无线仿真平台,高速图像采集,高速图像处理 二、技术指标 以xilinx 公司K7系列FPGA XC72K325T和TI公司的TMS320C6678为主芯片。 具有千兆以太网输出功能(DSP/FPGA各一个)。 DSP支持256M X64bit,FPGA支持256MX32bit,使用芯片MT41J256M16RE-15E IT。 DSP以太网具有在线可编程下载功能 FPGA与DSP接口的连续数据吞吐量大于:64bitX64k/4ms HPC高速信号接口。 三、芯片介绍   1.DSP芯片介绍   TMS320CC6678是TI推出的新一代DSP芯片,它的内核、外设接口和内部互联的能力比C64x系列的DSP有了非常大的提高。首先,它具有八个处理器核C66x,并且C66x核同时具备320GMAC的定点和160GFLOP的浮点处理能力。然后,其外设集成了新一代的SRIO2.1、PCIe2.0和HyperLink等高速接口。另外,内部互联也采用新的TeraNet开关互联技术,具有非常高的速率。   2. FPGA芯片介绍   Xilinx 公司Kintex7系列FPGA XC7K325T-1FFg900I 为主芯片,XC57K325T 具有Logic Cells 326080个,最大RAM模块4000 Kb,DSP Slices840个,CMT时钟管理10个 RocketIO GTX 16个,总IO bank 10个,最大使用IO数500个。   FPGA外挂1组DDR3,容量为256Mx32bit。     四、物理特性:   尺寸:   工作温度:0℃~ +55℃ ,支持工业级 -40℃~ +85℃   工作湿度:10%~80% 五、供电要求:   双直流电源供电。整板功耗 50W。   电压:板卡工作电压 12V 5A 。   纹波:≤10% 六、应用领域   高速图像采集、处理、雷达、软件无线电、图像数据采集、广播电视等。 七、子卡配用  

  • 2020-11-04
  • 发表了主题帖: CCS中给工程加入C66x CSL库和头文件

    CCS中给工程加入C66x CSL库和头文件 下载CSL头文件和库。 下载后解压缩进行安装,我安装的位置为:C:\ti\C6xCSL,装好后“/include/”文件夹下面是CSL头文件,“/lib_3x/”文件夹下面是CSL库。 在CCSv5中使用CSL库 这里以DM642的McBSP为例。首先建立一个空工程,建立方法可见之前的日志。 在main.c中将下列代码拷入(省略)。 其中“#define CHIP_DM642 1”要写到include相应CSL库之前,否则在csl.h中会找不到芯片定义,从而报错。 接下来要在工程设置中对build和link加入头文件和库的地址: 分别操作: 在Project-Properties-Build-C6000 Compiler-Include Options:(Add dir to #include search path)中加入C6xCSL的位置,例如 "C:\ti\C6xCSL\include"。 在Project-Properties-Build-C6000 Linker-File Search Path: (Include library file or command file as input)中加入cslDM642的库地址,例如"C:\ti\C6xCSL\lib_3x\cslDM642.lib" 还应在.cmd文件中自定义好要存放程序段的内存单元,即在SECTION中定义.csldata的位置,添加cmd文件操作:   对于寄存器的配置,可采用例如:MCBSP_FMKS(SPCR, FREE, NO)的形式,MCBSP_FMKS在文件csl_mcbsphal.h中被定义。此时如果CCS5对于相应语句标记报警,可采用以下的方式: go to Window->Preferences->General->Editors->Text Editors->Annotations and uncheck all three checkboxes for "C/C++ Indexer Markers".

  • 发表了主题帖: C6000系列DSP的GPIO之CSL库

    使用CSL库的API函数配置DSP显然比逐一配置寄存器方面且容易理解。下面介绍一下如何使用CSL库把DSP的GPIO4配置成中断模式。         第一步:使能GPIO模块         使能之前,首先要解除锁,即向PERLOCK寄存器写入0x0F0A0B00,然后把PERCFG0寄存器中GPIO对应位置1。代码如下: <span style="font-family:'Microsoft YaHei';">Bool   gpioEn;   CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK,DEV_PERLOCK_LOCKVAL, UNLOCK);       CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE);      do {          gpioEn = (Bool)CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,                                     DEV_PERSTAT0_GPIOSTAT);   } while (gpioEn != TRUE);   </span>     第二步:初始化GPIO模块   <span style="font-family: 'Microsoft YaHei'; ">CSL_Status                    status;   CSL_GpioContext               pContext;   status   =     CSL_gpioInit(&pContext);</span>         第三步:打开GPIO模块 第四步:使能GPIO管脚作为中断源的功能 第五步:配置GPIO-PIN4的属性:方向,中断触发方式

  • 发表了主题帖: C6000系列DSP的GPIO框图

    首先看一下GPIO的框图: 通过查看GPIO框图,我们可以得出许多信息: DIR寄存器控制GPIO管脚是输入还是输出,其中,对应bit置0表示该管脚配置为输出管脚;对应bit置1表示该管脚配置为输入管脚。 若一个GPIO管脚配置为Output,给SET_DATA寄存器对应位置1,将使该管脚输出高电平,给CLR_DATA寄存器对应位置1,将使该管脚输出低电平。需要注意的是:向SET_DATA和CLR_DATA中写入0无作用。 若一个GPIO管脚配置为Input,可以通过读取IN_DATA寄存器中的对应位来获得管脚的状态。且向SET_DATA和CLR_DATA中写入0无作用。 若一个GPIO管脚配置为中断&EDMA事件模式,此时可以忽略该管脚的Input/Output配置。可以通过置位SET_RIS_TRIG和SET_FAL_TRIG寄存器的相应bit把GPIO管脚配置为中断/事件触发方式。如下图所示: 由于C64+的CPU无法直接访问RIS_TRIG和FAL_TRIG寄存器,若要访问中断模式的配置状态,可以通过读取SET_RIS_TRIG(SET_FAL_TRIG)或者CLR_RIS_TRIG(CLR_FAL_TRIG)来获取。

  • 发表了主题帖: TI-DSP家族

    (1)、产业价值 DSP的产业价值体系,也是目前的嵌人式行业,甚至可以扩展为集成电路行业的价值体系。该产业的最基本核心是基本 集成电路器件,如TI的DSP,TI提供了完整的文档资料与技术支持,甚至提供了各个行业应用的相关解决方案,以及外围 配套支持硬.件,但对于DSP广泛使用,这显然还不够,因为TI不可能应用自己的芯片投入到所有DSP涉及的专业领域内。 (2)、TI-DSP架构 在DSP器件之上,T1还提供了众多外围接口芯片以及电源转换等芯片,除此之外TI与第三方提供了DSP与其余外设接口的 设备驱动程序、协议栈,有效组织利用DSP资源的BIOS与操作系统。在BIOS与操作系统之上,TI与其第三方合作伙伴还提 供开发、演示与可编程系统,其中包括了开发板、最小系统板、CCS开发工具、仿真烧写器、仿真软件等,进一步还会提 供一些常用的标准应用算法以及例程,而后客户在此基础上,可以利用专业应用开发应用系统,进一步进行系统集成。 上述价值体系如下图所示,看似复杂,但是在DSP产业化过程中逐步完善形成。 实际操作中如果分工明确、沟通清晰,并不存在太多障碍。 TI在DSP上的成功归功于系列革新举措以及持续不断的投人,有效地推进了DSP的产业化进程。 在这里插入图片描述(3)、TI-DSP家族 TI公司现在主推的处理器中,C2000系列可以认为是MCU控制器也可以认为.是DSP,其性能特点如上所述。其余DSP系列 特点如下: ①C5000系列(定点、低功耗) C54X、C54XX、C55X,相比其他系列的主要特点是低功耗,所以最适合个人与便携式上网以及无线通信应用,如手机、 PDA.GPS等应用。处理速度在80~400 MIPS之间。C54XX和C55XX一般只具有McBSP同步串口、HPI并行接口、定时 器.DMA等外设。值得注意的是C55XX提供了EMIF外部存储器扩展接口,可以直接使用SRAM,而C54XX则不能直接使用。 两个系列的数字I/O都只有两条。 ②C6000系列 C62XX、C67XX、C64X,该系列以高性能著称,最适合宽带网络和数字影像应用。32bit, 其中:C62XX和C64X是定点系 列,C67XX是浮点系列。该系列提供EMIF扩展存储器接口。该系列只提供BGA封装,只能制作多层PCB。且功耗较大。同 为浮点系列的C3X中的VC33现在虽非主流产品,但也仍在广泛使用,但其速度较低,最高在150 MIPS。 ③Integra DSP+ ARM处理器包括以下系列。 a、OMAP系列:OMAP处理器集成ARM的命令及控制功能,另外还提供DSP的低功耗实时信号处理能力,最适合移动上网设备和多媒体家电。其中OMPA-L1X处理器基于C674x+ARM9架构,与TMS320C674x和C640X产品系列中各种器件引脚兼容。 b、TMS320C6A816x处理器,基于C674X + ARM Cortex- A8架构,具有最高性能单核浮点和定点DSP处理器(速度高达1.5GHz),集成有高带宽外设、3D图形和显示引擎。非常适合用于开发需要密集信号处理、复杂数学函数以及影响处理算法、实现图形用户界面(GUI)、网络连接、系统控制以及多种操作系统下的应用处理等。 ④达芬奇(DaViniei)视频处理器 达芬奇技术是一种专门针对数字视频应用、基于信号处理的解决方案,能为视频设备制造商提供集成处理器.软件和开发 工具,以降低产品成本,缩短产品上市时间。达芬奇视频处理器最早是在2005年推出的,早期该处理器采用了ARM+DSP+ CP(Co- Processor协处理器)的SOC架构。目前,新型主流达芬奇视频处理器基本都采用DSP(C64+ )内核或DSP+ ARM架 构,包括TMS320DM646x. TMS320DM644Xx,TMS320DM643x、TMS320DM643x. TMS320DM647/TMS320DM648、 TMS320DM37x、TMS320DM3x几个系列。 ⑤C6000高性能多核DSP 高性能多核DSP只包括TMS320C66x系列,该系列初期融合了定点与浮点功能,最多集成8个C66X内核,主频最高1.25 GHz,可提供320000MMACS性能。该平台性能相当强劲,非常适合测试与测量、医疗成像、工业自动化、军事或高端成 像等市场的应用。

  • 发表了主题帖: DSP仿真器为什么必须连接目标系统(Target)?

    的仿真器同单片机的不同,仿真器中没有DSP,提供IEEE标准的JTAG口对DSP进行仿真调试,所以仿真器必须有仿真对象,及目标系统。目标系统就是你的产品,上面必须有DSP。仿真器提供JTAG同目标系统的DSP相接,通过DSP实现对整个目标系统的调试。 仿真工作正常对于DSP的基本要求 1) DSP电源和地连接正确。 2)DSP时钟正确。 3)DSP的主要控制信号,如RS和HOLD信号接高电平。 4)C2000的watchdog关掉。 5)不可屏蔽中断NMI上拉高电平。 CCS或Emurst运行时提示"Can't Initialize Target DSP" 1) 仿真器连接是否正常? 2)仿真器的I/O设置是否正确? 3)XDSPP仿真器的电源是否正确? 4)目标系统是否正确? 5)仿真器是否正常? 6)DSP工作的基本条件是否具备。 建议使用目标板测试

  • 2020-10-22
  • 发表了主题帖: 6种C语言常用转换工具函数

    C语言常用的一些转换工具函数! 1、字符串转十六进制 代码实现: void StrToHex(char *pbDest, char *pbSrc, int nLen) {   char h1,h2;   char s1,s2;   int i;     for (i=0; i<nLen/2; i++)     {         h1 = pbSrc[2*i];         h2 = pbSrc[2*i+1];         s1 = toupper(h1) - 0x30; //toupper 转换为大写字母         if (s1 > 9)             s1 -= 7;         s2 = toupper(h2) - 0x30;         if (s2 > 9)             s2 -= 7;         pbDest[i] = s1*16 + s2;     } } 2、十六进制转字符串 代码实现: void HexToStr(char *pszDest, char *pbSrc, int nLen) {     char    ddl, ddh;     for (int i = 0; i < nLen; i++)     {         ddh = 48 + pbSrc[i] / 16;         ddl = 48 + pbSrc[i] % 16;         if (ddh > 57) ddh = ddh + 7;         if (ddl > 57) ddl = ddl + 7;         pszDest[i * 2] = ddh;         pszDest[i * 2 + 1] = ddl;     }     pszDest[nLen * 2] = '\0'; } 或者 u16 Hex2StringArray (u8 *pSrc,  u16 SrcLen, u8 *pObj) {     u16 i=0;     for(i=0;    i<SrcLen;   i++)     {         sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i));     }     *(pObj + i * 2) = '\0';     return  (i * 2); } 效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2” 3、字符串转十进制 代码实现: 第一种,如果带负号 这个就是atoi函数的实现: int my_atoi(const char *str) {     int value = 0;     int flag = 1; //判断符号     while (*str == ' ')  //跳过字符串前面的空格     {         str++;     }     if (*str == '-')  //第一个字符若是‘-’,说明可能是负数     {         flag = 0;         str++;     }     else if (*str == '+') //第一个字符若是‘+’,说明可能是正数     {         flag = 1;         str++;     }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0     else if (*str >= '9' || *str <= '0')     {         return 0;        }     //当遇到非数字字符或遇到‘\0’时,结束转化     while (*str != '\0' && *str <= '9' && *str >= '0')     {         value = value * 10 + *str - '0'; //将数字字符转为对应的整形数         str++;     }     if (flag == 0) //负数的情况     {         value = -value;     }     return value; } 效果:字符串:”-123” 转为 -123 第二种,如果不带负号: void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen) {     int i;     int tmp=0;     if(nLen > 10)         *pbDest = 0;     tmp = 1;     *pbDest = 0;     for (i=nLen-1; i>=0; i--)     {         *pbDest += tmp*(*(pbSrc+i)-'0');         tmp = tmp*10;     } } 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: //m^n函数 //返回值:m^n次方. u32 NMEA_Pow(u8 m,u8 n) {     u32 result=1;        while(n--)result*=m;        return result; } //str转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num(u8 *buf,u8*dx) {     u8 *p=buf;     u32 ires=0,fres=0;     u8 ilen=0,flen=0,i;     u8 mask=0;     int res;     while(1) //得到整数和小数的长度     {         if(*p=='-'){mask|=0X02;p++;}//是负数         if(*p==','||(*p=='*'))break;//遇到结束了         if(*p=='.'){mask|=0X01;p++;}//遇到小数点了         else if(*p>'9'||(*p<'0'))   //有非法字符         {                ilen=0;             flen=0;             break;         }            if(mask&0X01)flen++;         else ilen++;         p++;     }     if(mask&0X02)buf++; //去掉负号     for(i=0;i<ilen;i++) //得到整数部分数据     {           ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');     }     if(flen>5)flen=5;   //最多取5位小数     *dx=flen;           //小数点位数     for(i=0;i<flen;i++) //得到小数部分数据     {           fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');     }     res=ires*NMEA_Pow(10,flen)+fres;     if(mask&0X02)res=-res;              return res; } 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456 4、十进制转字符串 代码实现: 如果只是单个十进制转字符串,使用sprintf函数就可以了。 如果是十进制数组: u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj) {     u16 i=0;     for(i=0;    i<SrcLen;   i++)     {         sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));     }     *(pObj + i * 2) = '\0';     return  (i * 2); } 效果:十进制数组13 14转为字符串“1314” 5、u8、u32转换 举个栗子:ASCII码里 这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001 而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001 将u32数转换成u8数组 注意:这里是字符数组,不是字符串 字符串是以空字符(\0)结尾的char数组 void U32ToU8Array(uint8_t *buf, uint32_t u32Value) {     buf[0] = ((u32Value >> 24) & 0xFF);     buf[1] = ((u32Value >> 16) & 0xFF);     buf[2] = ((u32Value >> 8) & 0xFF);     buf[3] = (u32Value & 0xFF); } 效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’} u8数组转u32 void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value) {     *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0); } 效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50 6、大端小端 最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端? 1、转为大端 为大端: pPack[0] = (u8)((len >> 8) & 0xFF); pPack[1] = (u8)(len & 0xFF); 为小端: pPack[0] = (u8)(len & 0xFF); pPack[1] =  (u8)((len >> 8) & 0xFF); 效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。 大端为: pPack[0] (0x11 ) pPack[1] (0x22) 小端为: pPack[0] (0x22) pPack[1] (0x11)

  • 2020-10-11
  • 发表了主题帖: TMS320F280049之移相控制(Phase-Shift Control)-库函数实现

    原理介绍         F280049C的PWM模块功能强大,可以比较容易的实现移相控制。 本节主要向大家讲述用DSP如何编程实现移相控制,如下图所示为移相全桥变换器的移相控制示意图,其中EPWM1A和EPWM1B为占空比50%的互补信号,EPWM2A和EPWM2B也为占空比50%的互补信号。通过控制EPWM1A和EPWM2B的移相角来实现移相控制。          如上图标注所示,控制上以PWM1的计数时基为基准信号,在PWM1的计数器为零(宏:EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO)时PWM1发出同步脉冲SyncOut,同时配置PWM2的同步信号来源为Syncln(宏:EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN)。相关的宏定义如下所示: typedef enum {     //! sync pulse is generated by software     EPWM_SYNC_OUT_PULSE_ON_SOFTWARE  = 0,     //! sync pulse is passed from EPWMxSYNCIN     EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN = 0,     //! sync pulse is generated when time base counter equals zero     EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO = 1,     //! sync pulse is generated when time base counter equals compare B value.     EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B = 2,     //! sync pulse is disabled     EPWM_SYNC_OUT_PULSE_DISABLED = 4,     //! sync pulse is generated when time base counter equals compare D value.     EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C = 5,     //! sync pulse is disabled.     EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D = 6 }EPWM_SyncOutPulseMod   当PWM1的时基计数到零数发出同步脉冲,此时,PWM2接收到同步脉冲后将相位寄存器TBPHS中的值加载到时基计数器TBCTR中。也就是说,当PWM1从零开始计数时,PWM2此时从TBPHS寄存器中的值开始计数。因此,PWM1和PWM2实现了移相,改变TBPHS寄存器中的值可以改变移相控制的移相角。

统计信息

已有633人来访过

  • 芯币:5843
  • 好友:--
  • 主题:1766
  • 回复:116
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


Mr-kk 2020-5-26
你好,我是一名学生,看了你的F2812DSP的最小系统设计这篇文章,想请问一下您有没有pcb相关的文件可以分享的嘛,非常感谢
查看全部