fish001

  • 2020-02-14
  • 发表了主题帖: 低功耗蓝牙无线传感器

        如今,科技发展迅猛,各种设备让世界变得更加智能。新技术的不断出现,不仅改进了现有技术,还创造了新的细分市场。蓝牙技术的进步使得智能蓝牙(低功耗蓝牙BLE)应运而生。按照蓝牙技术联盟(SIG)的定义,BLE是一种低功率、短距离、低数据速率的无线通信协议。BLE的分层协议栈能以低功耗高效传输少量数据,使其成为电池供电应用的首选无线协议,如需要定期提取和处理数据的低功耗传感器网络接口等。本文将重点介绍如何在数据变化不频繁的传感器应用中,有效地利用BLE维持低功耗无线运行。        目前,全球正进入一个各种系统都需要采集和交换数据的物联网(IoT)时代。在传感器以无线方式连接,形成网络并实现设备间数据交换的物联网中,BLE发挥着至关重要的角色。主机设备可以是能够监测和控制所有网络节点的智能手机。此类物联网(IoT)应用包括日常活动追踪以及家庭自动化功能,如高效住宅照明、温度和湿度监测与控制、远程控制消费类电子设备等。   低功耗蓝牙的功率模式        如果传感器采用电池供电,功耗受限且必须持续很长时间的话, BLE将成为最佳连接选择。比如,一个测量温度及湿度的低功耗传感器, 其参数是缓慢变化的,此类传感器可以与能够处理并将数据传输到主机设备的BLE集成型处理器连接。BLE子系统的操作频率不高,例如每百毫秒一次,而且在其他时间处于低功耗模式。赛普拉斯PSoC4 BLE等BLE型器件可提供多用户可配置的功耗模式,从而优化独立于处理器工作模式的BLE子系统(BLESS)的运行。使开发人员能够降低功耗,并使单块电池的使用寿命达到数年之久。        这五种系统功率模式分别为:主动、睡眠、深度睡眠、休眠和停止模式。三种BLESS功耗模式分别为主动、睡眠和深度睡眠模式。BLESS模式在系统功率为1.3微安的深度睡眠模式下始终启用。BLE子系统可以在BLESS Active模式下发送和接收数据。它能保持空闲状态,并在BLESS睡眠模式和深度睡眠模式下维持连接。这些功耗模式独立于系统的功耗模式,因此开发人员能够灵活地为系统和BLESS分别选择最高效的配置。在此基础上,我们可以建立一个电流需求极低、通常由纽扣电池供电的完整系统。   例如,1秒广播间隔的平均耗电量只有26微安。而1秒连接间隔的平均耗电量更低,只有17微安。   传感器和低功耗蓝牙        传感器可以大致分为模拟和数字两种。典型的模拟传感器包括用于监测烟雾、气体、环境光线、人员感应等的传感器。数字传感器包括监测温度、湿度、压力、加速度等的传感器。当BLE子系统与应用处理器集成时,传感器可以采用多种不同的方式进行连接。例如,可以将模拟传感器馈送到前端具有电压输出器的SARADC。数字传感器无需进行模拟转换,因此可以通过任何通信接口(如I2C、SPI或单线接口)采集数据。集成的定时器、计数器、脉宽调制器和通用数字模块(UDB)均可用于实现自定义逻辑以进一步处理传感器数据。最终,经处理或所接收的数字数据可以通过BLE接口发送,并由内置BLE功能的手机或任何其他客户端设备进行监测。随着资源可用性和成本的不断变化,可选择不同系列的BLE集成处理器(如PSoC 4 BLE)以适应各种应用。   无线传感器网络         无线传感器网络通常作为网状网络和枢纽网络(见图1)。枢纽网络包括可以放置在相同位置的所有传感器。每个传感器需要连接到单个BLE外围设备(服务器)来处理数据并将其发送到BLE中央设备(客户端)。网状网络采用可以远程定位传感器的拓扑结构。网格中的每个节点都需要连接到BLE外围设备(服务器),所有这些外围设备都可以连接到BLE中央设备(客户端)。   图1:传感器网络拓扑结构     网状网络中枢网络 枢纽网络        内置BLE功能的处理器的灵活性和丰富资源,使传感器能够与单一BLE设备连接。图2是使用PSoC Creator的典型配置。PSoC Creator是一个用于围绕PSoC架构开发应用程序的IDE。图中显示的是模拟和数字传感器接口以及BLE子系统。该配置展示的是用于感测烟雾、光照强度、温度、湿度和压力的典型工业数据监测系统。配置中的每个组件都有一个关联的应用程序编程接口(API),开发人员可根据需要访问这些组件。每个组件还有一个与其相关的数据表对组件的可用配置进行说明。   图2:PSoC Creator项目 – 包含所有必要组件的顶级设计         BLE组件在其GAP层中被配置为从设备。这使任何BLE设备(如BLE手机)都可以扫描此设备,在BLE从设备包含其名称广播时被BLE手机连接。此外,在其GATT层中,BLE设备被配置为具有自定义配置文件的GATT服务器。下面将讨论BLE低功耗特性在该组件内启用。名为“Sensor Service”的单一服务具有5种不同的特性,用于采集每个传感器的数据。每个特性都具有通知功能,可以将传感器数据作为通知发送。   BLE中的一切都作为“-活动”处理。BLE堆栈提供处理这些事件的“定义”。以下代码片段展示了其中一部分活动的运行。   CyBle_Start(AppCallBack);   void AppCallBack(uint32 event, void* eventParam)   {   CYBLE_API_RESULT_T apiResult;   switch (event)   {   case CYBLE_EVT_STACK_ON: /* This event is received when the component is Started */   /* Enter into discoverable mode so that remote devicecansearch it. */   apiResult = CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);   if(apiResult != CYBLE_ERROR_OK)   {   /* Error */   }   break;   case CYBLE_EVT_GAPP_ADVERTISEMENT_START_STOP:   if(CYBLE_STATE_DISCONNECTED == CyBle_GetState())   {   CySysPmHibernate(); /* Enter Hibernate Mode for Low Current */   }   break;   case CYBLE_EVT_GAP_DEVICE_CONNECTED:   break;   case CYBLE_EVT_GAP_DEVICE_DISCONNECTED:   /* Put the device into discoverable mode so that a remote can search it. */   apiResult = CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);   if(apiResult != CYBLE_ERROR_OK)   {   /* Error */   }   break;   /* GATT Events */   case CYBLE_EVT_GATT_CONNECT_IND:   break;   case CYBLE_EVT_GATT_DISCONNECT_IND:   break;   }   }   图3:BLE组件配置     一旦两个设备实现连接,就能使用连接间隔不同的通知发送数据。应用程序接口“CyBle_ProcessEvents()”应置于while(1)循环中,且必须在每个连接间隔中至少调用一次。我们也可以调用在同一while循环中将数据作为通知发送的函数。以下函数可用于将温度数据的一个字节作为通知发送。这也适用于其他传感器特性。   voidSendTempNotification(uint8TempData)   {   CYBLE_API_RESULT_T bleApiResult;   CYBLE_GATTS_HANDLE_VALUE_NTF_T TempHandle;   TempHandle.value.val = &TempData;   TempHandle.value.len = 1;   TempHandle.attrHandle = CYBLE_SENSORSERVICE_TEMPERATURE_CHAR_HANDLE;   do   {   bleApiResult = CyBle_GattsNotification(cyBle_connHandle, &TempHandle);   CyBle_ProcessEvents();   }while((CYBLE_ERROR_OK != bleApiResult) && (CYBLE_STATE_CONNECTED == cyBle_state));   }   如上文所述,处理器和BLE子系统(BLESS)具有独立的低功率模式。举个例子 ,如果设备断开连接,我们可以将处理器设置为休眠或停止模式以降低功耗。在广播和连接间隔之间,我们可以利用BLESS深度睡眠模式,甚至连所使用的各个组件(如ADC、I2C等)也可以进入各自的低功率模式并在需要时唤醒。因此,开发人员能够根据整个系统的实际需要,对功率进行非常细致的控制。有关详细的低功率代码片段,请参见低功耗蓝牙应用的低功率设计与电池寿命估算。   while(1) 循环如下:   while(1)   {   /* Process all the generated events. */   CyBle_ProcessEvents();   /* To achieve low power in the device */   LowPowerImplementation();   /***********************************************************************   * Wait for connection established with Central device   ***********************************************************************/   if(CyBle_GetState() == CYBLE_STATE_CONNECTED)   {   CyBle_ProcessEvents();   SendTempNotification(Temperature);   }   }       目前具有BLE功能的手机可以扫描这一传感器网络设备,并使用各种特性来监视每个传感器的数据。一些处理器制造商还提供手机端的BLE连接软件。例如,赛普拉斯提供了一个名为CySmart的应用程序,该应用程序可以安装在您的安卓或Apple设备上,并协助您监控BLE传输。   BLE 信标       蓝牙信标的广播信号可以被附近的智能设备捕捉。对于此类应用,只需要将BLE组件配置为广播器的GAP,这样系统就可以发送广播信息。信标的功耗应该较低,也可以得益于集成的处理器/BLE设计。太阳能低功耗蓝牙信标和无线传感器节点可显示正在使用的BLE信标。      BLE在消费类、工业和嵌入式应用等许多市场中的发展势头良好。该项技术成功的一个关键因素是它能够在低功耗的情况下运行。BLE技术使开发人员能够设计出由电池供电、使用寿命更长,对用户更加友好的应用。

  • 发表了主题帖: 光电传感器内部结构小介绍

    我们在使用光电开关的时候,通常在使用手册上会看到传感器的工作原理为BGS,那么BGS是什么呢?它是依赖于什么工作的呢?今天小编就带大家一起学习学习。   所谓的BGS原理英文全称是background suppression 即背景抑制的意思,所谓的背景抑制就是指传感器工作时可以设定其开关的触发点,当被测物处于动作范围以外时(即处于背景处时),无论被测物的颜色有多亮或者反广性有多高,传感器都不会动作。即BGS原理的传感器可以有效地抑制黑白色差(黑白漂移)。   光电传感器三角测量原理详解   BGS内部图   那么什么是黑白色差呢?简单的说就是普通漫反的传感器,比如你设定时学习的是黑色物体,假定设定黑色目标物的感应距离为50毫米,那么当传感器检测白色的物体时实际动作距离可能会达到80毫米,这种传感器适合于在暗色的物体中寻找白色的物体,但是当用于生产中检测不同颜色的物体到位检测时,这个有黑白色差的普通漫反射就不可以了。此时就需要BGS原理的了。   背景抑制漫反射原理使用的基础是三角测量原理。使用这个原理的传感器也有两个镜头,,一个发射,一个接收,在其检测物体反射回的光的时候,不仅可以检测返回的光的强度,还可以检测返回光的角度,如下图所示:在光线发射方向上,不同位置处目标物反射的光打到接收镜头上的角度是不同的,这个接收镜头是个聚焦透镜,会把同一位置反射回来的光聚焦到接收芯片上的某一点,也就是说,芯片上聚焦点的位置其实反映的是被测物位置的信息。这个时候,芯片会把位置的信息变换为电信号给到处理器。一般情况下,开光量的传感器和测距类的传感器都有用到三角测量原理的,不同的是开关量的传感器接收芯片是比较粗糙的二极管阵列,而测距类的传感器接收芯片是CCD芯片或者CMOS芯片。       综合来说,BGS原理的传感器采集的是物体的距离信息,而与物体的表面反光度关系不大。

  • 2020-02-13
  • 发表了主题帖: msp430F5438A 的中断初步

    对于单片机系统,中断是非常重要的一个特性,也是很值得去研究的。 中断的定义:出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。 MSP430F5438A的很多部分都可以产生中断,比如IO口(只有P1,P2口),ADC,Timer_A 等,但是当多种中断在同时等待时,它们之间内部的优先级决定了哪个中断应该先被处理,哪个中断应该后处理。中断处理优先级和中断向量BASEADDRESS如下所示:   暂时只检测只有一个中断的情况,即不用考虑中断优先级的情况。以ADC12_A为中断源. ADC12_A的中断标志位寄存器可以记为ADC12IFGx,ADC12IFG0是ADC12IFGx的最低位,当ADC12MEM0装载了转换结果后,这个位置1,而当ADC12MEM0存取后,这个位被重置,它也可以由软件重置。 在IAR_workbench 里面写入以下代码: #include "msp430x54x.h" volatile unsigned int result; // Needs to be global in this example,Otherwise, the compiler removes it // because it is not used for anything. void InitADC12_A() { ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;// Turn on ADC12, set sampling time ADC12CTL1 = ADC12SHP+ADC12CONSEQ_0; // Use sampling timer, single ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_3; // ref+=Veref=2.5V, channel = A3 ADC12IE = ADC12IE0; // Enable ADC12IFG.0 ADC12CTL0 |= ADC12ENC; // Enable conversions } #pragma vector=ADC12_VECTOR __interrupt void ADC12ISR (void) { switch(__even_in_range(ADC12IV,34)) { case 0: break; // Vector 0: No interrupt case 2: break; // Vector 2: ADC overflow case 4: break; // Vector 4: ADC timing overflow case 6: // Vector 6: ADC12IFG0 result = ADC12MEM0; // Move results __bic_SR_register_on_exit(LPM4_bits); // Exit active CPU, SET BREAKPOINT HERE case 8: break; // Vector 8: ADC12IFG1 case 10: break; // Vector 10: ADC12IFG2 case 12: break; // Vector 12: ADC12IFG3 case 14: break; // Vector 14: ADC12IFG4 case 16: break; // Vector 16: ADC12IFG5 case 18: break; // Vector 18: ADC12IFG6 case 20: break; // Vector 20: ADC12IFG7 case 22: break; // Vector 22: ADC12IFG8 case 24: break; // Vector 24: ADC12IFG9 case 26: break; // Vector 26: ADC12IFG10 case 28: break; // Vector 28: ADC12IFG11 case 30: break; // Vector 30: ADC12IFG12 case 32: break; // Vector 32: ADC12IFG13 case 34: break; // Vector 34: ADC12IFG14 default: break; } } void main(void) { InitADC12_A(); WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer ADC12CTL0 |= ADC12SC; // Start convn - software trigger __bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts __no_operation(); // For debugger } 在A3口接入电压为1.407V,然后debug,在debug页面发现:   所以成功转换,而且通过中断将结果写入了result里面。 中断的作用说到底只是用来实现突发事件的检测和运行,例如我们也可以实现,运用ADC12的中断实现P11.0上的红色LED灯实现点亮的操作。 #include "msp430x54x.h" volatile unsigned int result; // Needs to be global in this example,Otherwise, the compiler removes it // because it is not used for anything. void InitADC12_A() { ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;// Turn on ADC12, set sampling time ADC12CTL1 = ADC12SHP+ADC12CONSEQ_0; // Use sampling timer, single ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_3; // ref+=Veref=2.5V, channel = A3 ADC12IE = ADC12IE0; // Enable ADC12IFG.0 ADC12CTL0 |= ADC12ENC; // Enable conversions } #pragma vector=ADC12_VECTOR __interrupt void ADC12ISR (void) { switch(__even_in_range(ADC12IV,34)) { case 0: break; // Vector 0: No interrupt case 2: break; // Vector 2: ADC overflow case 4: break; // Vector 4: ADC timing overflow case 6: // Vector 6: ADC12IFG0 result = ADC12MEM0; // Move results P11OUT &= ~BIT0; //light red LED __bic_SR_register_on_exit(LPM4_bits); case 8: break; // Vector 8: ADC12IFG1 case 10: break; // Vector 10: ADC12IFG2 case 12: break; // Vector 12: ADC12IFG3 case 14: break; // Vector 14: ADC12IFG4 case 16: break; // Vector 16: ADC12IFG5 case 18: break; // Vector 18: ADC12IFG6 case 20: break; // Vector 20: ADC12IFG7 case 22: break; // Vector 22: ADC12IFG8 case 24: break; // Vector 24: ADC12IFG9 case 26: break; // Vector 26: ADC12IFG10 case 28: break; // Vector 28: ADC12IFG11 case 30: break; // Vector 30: ADC12IFG12 case 32: break; // Vector 32: ADC12IFG13 case 34: break; // Vector 34: ADC12IFG14 default: break; } } void main(void) { InitADC12_A(); WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer ADC12CTL0 |= ADC12SC; // Start convn - software trigger P11DIR |= BIT0; //设置P11.0为输出 P11OUT |= BIT0; __bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts __no_operation(); // For debugger } 结果成功实现了A4通道的转换,将结果写到了result里面,并且点亮了红色LED灯。

  • 发表了主题帖: msp430F5438A 的ADC 研究

    由于项目中需要使用到ADC模块,那么就有必要对ADC模块进行研究了。 这是msp430F5428A datasheet首页上面对于ADC的描述: 12-Bit Analog-to-Digital Converter (ADC) – Internal Reference  – Sample-and-Hold – Autoscan Feature – 14 External Channels, 2 Internal Channels ADC12_A (Link to User's Guide) The ADC12_A module supports fast 12-bit analog-to-digital conversions. The module implements a 12-bit SAR core, sample select control, reference generator, and a 16-word conversion-and-control buffer. The conversionand- control buffer allows up to 16 independent ADC samples to be converted and stored without any CPU intervention. 也就是说ADC12_A可以同时转换16路的模拟信号。(没有cpu的介入) 把Msp430f5438A的ADC12_A的重要特点总结如下: (1) 转换速率可以为200K/s (2)12bit转换 无错码 (3) 由软件或计数器控制着的采样时间和保持时间 (4)内部有参考电压1.5V,2.0V及2.5V (5)可以使用外接参考源,是否选择外部参考源由寄存器决定。 (6)有单沟道采样,重复单沟道采样,序列采样,重复序列采样4种模式可选(Single-channel, repeat-single-channel, sequence (autoscan), and repeat-sequence (repeated autoscan) conversion modes) (7)16位转换结果存储寄存器ADC12MEMx,和ADC12转换结果存储寄存器ADC12MCTLx。 写下列程序:   void main(void)   {   WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer   ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;// Turn on ADC12, set sampling time   ADC12CTL1 = ADC12SHP+ADC12CONSEQ_0; // Use sampling timer, single   ADC12MCTL0 =ADC12SREF_2 + ADC12INCH_3; // ref+=Veref=2.5V, channel = A3   // ADC12MCTL1 = ADC12INCH_2+ADC12EOS; // ref+=AVcc, channel = A9, end seq.   ADC12IE = 0x02; // Enable ADC12IFG.1, end channel   ADC12CTL0 |= ADC12ENC; // Enable conversions ADC12CTL0 |= ADC12SC; // Start convn - software trigger }    当在A3脚上加电压为1.404 V, 在debug界面观测到的为: 也就是说转换结果为08B3,对应电压为 [(8*256+11*16+3)/4096]*2.5V=1.359V  所以ADC成功将A3口上的信号转换为数字量并存储在ADC12MEM0中。

  • 发表了主题帖: msp430的时钟源设计

    现在项目中,需要使用msp430单片机作为控制端,所以,要先对msp430的时钟源进行了解和分析。 msp430拥有unified clock system (统一时钟系统), -FLL(锁频环) for frequency stablization -VLO(内部时钟源) -内部参考源(REFO) -32kHZ晶振 -高达32MHz的高频时钟 The clock system is supported by the Unified Clock System (UCS) module that includes support for a 32-kHz watch crystal oscillator (或者时钟XT1低频态 XT1 LF mode), an internal very-low-power low-frequency oscillator (内部低频低功耗振荡器VLO), an internal trimmed low-frequency oscillator (内部平衡低频晶振REFO), an integrated internal digitally controlled oscillator 内部数字控制振荡器(DCO), and a high frequency crystal oscillator (高频晶振XT1 HF mode or XT2). The UCS module is designed to meet the requirements of both low system cost and low power consumption. The UCS module features digital frequency locked loop (FLL)hardware that, in conjunction with a digital modulator, stabilizes the DCO frequency to a programmable multiple of the selected FLL reference frequency. The internal DCO provides a fast turn-on clock source and stabilizes in less than 5 μs. The UCS module provides the following clock signals: • Auxiliary clock (ACLK), sourced from a 32-kHz watch crystal, a high-frequency crystal, the internal lowfrequency oscillator (VLO), the trimmed low-frequency oscillator (REFO), or the internal digitally controlled oscillator DCO. • Main clock (MCLK), the system clock used by the CPU. MCLK can be sourced by same sources made available to ACLK. • Sub-Main clock (SMCLK), the subsystem clock used by the peripheral modules. SMCLK can be sourced by same sources made available to ACLK. • ACLK/n, the buffered output of ACLK, ACLK/2, ACLK/4, ACLK/8, ACLK/16, ACLK/32.   因为不接外部晶振,所以本文主要是就DCO的设置进行研究。 msp430F5438A datasheet上给出的设置是: 可以见,DCORESL的频率调节范围大致如下: DCORSEL = 0的调节范围约为0.20~0.70MHZ; DCORSEL= 1的调节范围约为0.36~1.47MHZ; DCORSEL = 2的调节范围约为0.75~3.17MHZ; DCORSEL = 3的调节范围约为1.51~6.07MHZ; DCORSEL = 4的调节范围约为3.2~12.3MHZ; DCORSEL = 5的调节范围约为6.0~23.7MHZ; DCORSEL = 6的调节范围约为10.7~39.7MHZ; DCORSEL = 7的调节范围约为19.6~60MHZ。 可以看出有重叠的部分,理解了这些,就可以理解Ti官方代码了: if (fsystem <= 630) // fsystem < 0.63MHz UCSCTL1 = DCORSEL_0; else if (fsystem < 1250) // 0.63MHz < fsystem < 1.25MHz UCSCTL1 = DCORSEL_1; else if (fsystem < 2500) // 1.25MHz < fsystem < 2.5MHz UCSCTL1 = DCORSEL_2; else if (fsystem < 5000) // 2.5MHz < fsystem < 5MHz UCSCTL1 = DCORSEL_3; else if (fsystem < 10000) // 5MHz < fsystem < 10MHz UCSCTL1 = DCORSEL_4; else if (fsystem < 20000) // 10MHz < fsystem < 20MHz UCSCTL1 = DCORSEL_5; else if (fsystem < 40000) // 20MHz < fsystem < 40MHz UCSCTL1 = DCORSEL_6; else UCSCTL1 = DCORSEL_7; DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。 DCO模块有两个输出时钟信号,级DCOCLK和DCOCLKDIV,其中,倍频计算公式如下: DCOCLK = D*(N+1)*(REFCLK/n) DCOCLKDIV = (N+1)*(REFCLK/n) 其中: n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为0,也就是不分频; D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频; N可以通过UCSCTL2中的FLLN来设定,默认值为31。   为了验证上述的陈述,可以编写以下代码: P1DIR |= BIT0; P1SEL |= BIT0;                                                           //1口输出辅助时钟 UCSCTL3 |= SELREF_2;                                               // FLLref = REFO 为32.768K UCSCTL4 = SELM__DCOCLKDIV + SELS__DCOCLKDIV + SELA__DCOCLKDIV;// 时钟来源:主系统时钟来源DCOCLKDIV;子系统时钟来源DCOCLKDIV;辅助系统时钟来源DCOCLKDIV UCSCTL5 |= DIVM__1 + DIVS__1 + DIVA__1; // 分频:主系统时钟1分频;子系统时钟1分频;辅助系统时钟1分频 所以由计算,DCOCLKDIV =32*32.768K = 1.048576M,也就是ACLK的时钟源(不分频) 根据测试结果我们可知T接近1ms,所以DCOCLKDIV差不多为1M,符合计算结果。 那么如果我要设置别的频率又该怎么办呢? 比如我现在需要大约5M的频率,那么由计算得知,当N=151时,大致满足要求。 那么代码写为: P1DIR |= BIT0; P1SEL |= BIT0;                                                           //1口输出辅助时钟 UCSCTL3 |= SELREF_2;                                               // FLLref = REFO 为32.768K UCSCTL4 = SELM__DCOCLKDIV + SELS__DCOCLKDIV + SELA__DCOCLKDIV;// 时钟来源:主系统时钟来源DCOCLKDIV;子系统时钟来源DCOCLKDIV;辅助系统时钟来源DCOCLKDIV  UCSCTL1 = DCORSEL_4                                          //   5M < Fdco < 10M UCSCTL2 |= FLLD__1 + 151;                                    //DCOCLKDIV=5M 为 Fdco/2    UCSCTL5 |= DIVM__1 + DIVS__1 + DIVA__1; // 分频:主系统时钟1分频;子系统时钟1分频;辅助系统时钟1分频 运行,用示波器测P1.0的输出信号。 测出来的信号周期约为200ns,所以输出的ACLK信号就是约为5M,所以实验证实了想法。   以上大致就是MSP430F5438A芯片DCO的部分的全部内容。

  • 2020-02-12
  • 发表了主题帖: 初学28335入门总结

    这个时候回过头来看整个DSP的程序框架已经很清晰了,对于工程项目中哪些文件需要哪些文件不需要也不会那么迷惘。 再次惠顾一下main函数及整个程序框架: .h类型的头文件:对每个寄存器的地址进行声明,因为我们编写程序的时候不想写成0X0056(寄存器地址)=0x0001(数据);这样太不方便。 2、下面的文件作用:这是TI为我们搭建好的平台框架。要了解它我们从main函数去看: 在main函数里边第一步InitSysCtrl()系统初始化,该函数就在DSP2833x_SysCtrl.c,可以根据自己的需要关开相应的时钟。 第二步:InitGpio()在DSP2833x_Gpio.c中,可以根据自己需要更改相应的GPIO管脚属性; 第三步:中断相关: // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts     DINT;   // Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared.   // This function is found in the DSP2833x_PieCtrl.c file.    InitPieCtrl();     // Disable CPU interrupts and clear all CPU interrupt flags:    IER = 0x0000;    IFR = 0x0000;   // Initialize the PIE vector table with pointers to the shell Interrupt  // Service Routines (ISR).   // This will populate the entire table, even if the interrupt // is not used in this example.  This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c.    InitPieVectTable();   // Interrupts that are used in this example are re-mapped to // ISR functions found within this file.      EALLOW;  // This is needed to write to EALLOW protected registers    PieVectTable.ECAP1_INT = &ecap1_isr;    EDIS;    // This is needed to disable write to EALLOW protected register 第四步:初始化外设:但是DSP2833x_InitPeripherals.c这个文件没有找到,所以要用到的外设只能逐个初始化。 // Step 4. Initialize all the Device Peripherals: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals();  // Not required for this example   InitEPwmTimer();    // For this example, only initialize the ePWM Timers    InitECapture(); 外设的初始化函数在相应的文件中有写好的初始化函数,可以直接调用。所以可以看到以上的文件的作用。  

  • 发表了主题帖: 分析一下tms320c6455烧毁原因

    开发一块dsp板卡,含有两片tms320c6455,一片xilinx的fpga xc5vlx85-ff668.外设有 (1)IO扩展芯片max6957,5v,通过74lvc16t245和fpga相连;(2)uart,rs-422,直接和 fpga联;(3)dds,ad9850,直接和fpga联,输出通过74lvc16t245变成5v。74lvc16t245 是一种采用双电压供电的总线收发器。(4)adc,直接和fpga连接;(5)dac,直接和fpga 相连接。dac有三种电压,3.3,+/-15v.因为调试电源是5v,所以把dac供电的3.3v也断了( 通过拆掉磁珠),15v不上电。dac的io脚和fpga相连。(6)can,sja1000。通过74lvc16t245 将5v的sja1000和fpga相连。(7)其他外设包括sd卡等,没有焊接。 ---------------------------------------------------------------------------------- 芯片的供电:5v转的3.3v全pcb使用一个,dsp和fpga 都用;1.0v的fpga核电单独由5v转来; fpga的2.5v电源是3.3v转来(这个我有成功的板子开发出来)、fpga的flash的1.8v电源是5v转来; 两片dsp的1.8vddrii的电压、1.2v的核心电压都是各自通过pth5000由5v转化而来。电源考虑了 上电时序。dsp的rocketio供电由各自的1.8v转化而来,也是独立供电。dsp之间通过rocketio互联。 ---------------------------------------------------------------------------------- 板子制作完成后,为保证焊接效果,机器贴片焊接。仅此花了好几千。 ----------------------------------------------------------------------------------- 调试:第一个晚上,将pcb上缺少的件自己处理了一下,然后上电,测试了dsp fpga都正常。 千兆网、ddrII、逻辑下载、dsp烧写和boot都正常,电流消耗约2.5-2.8 A之间,dsp加载程序 与否产生电流消耗差别,千兆网启动与否产生电流消耗差别。 第二天调试了整整一天,完成了(1)IO扩展芯片max6957,5v,通过74lvc16t245和fpga相连; (2)uart,rs-422,直接和fpga联;(3)dds,ad9850,直接和fpga联 三个外设的测试。 中间开开关关,程序烧写擦除,不记得进行了多少次。电流消耗一直正常。 ------------------------------------------------------------------------------------ 第三天,问题来了。5v上电后,电流正常,短暂时间后(别人上的电,我不在,说不清时间,可 能几十秒)电流突然跳变成10A左右。断电,测试发现:使用万用表二极管档测试(1)5v和地之 间嘟嘟响,数字只有2(这个值的准确单位可能不能称为ohm,所以就只写数字了),(2)dsp和5v 插座近的哪一个的1.8v和gnd 1.2v和gnd都嘟嘟响,数字都是4-5。 [正常的5v和gnd之间 数字起码要好几百,万用表不会响;1.8v-gnd 显示300-400;1.2v-gnd显示 30-40]。 特别指出:pcb 芯片没有任何烧毁的痕迹,即使最后查出短路的245芯片,也没有烧毁的痕迹! ------------------------------------------------------------------------------------- 为解决问题,排除法,拆电容,拆芯片。       发现:5v的短路拆了某一个0402的电容后由2变成了11;拆到一个74lvc8t245时,发现其5v供电的vcc和gnd有一片的值是11,这个验证了是这个芯片导致的。去除后5v与gnd测量恢复正常。拆掉pcb上的74lvc16t245时发现,所有这个芯片和3.3v相连端的vcc-gnd用万用表二极管档测量都是开路,和5v相连端都是几十到上千。新的芯片的所有vcc和gnd都是开路。也就是说pcb上的74lvc16t245和5v相连接的vcc和gnd有损坏的现象。查电源。0-30v/0-30a的开关型直流电源。电源上电瞬间使用示波器测试,发现:                     6.5-7v                   |\                   | \                   |  \_______5v__________                   |                      |             0v_______|上电位置 ,三角形下边长约1s。 使用滑线电阻测量负载变化,电流从0.5a变化到10a,从3a变化到10a,电压波动不大。 在电阻两端并联钽电容330uf多个,模拟pcb板卡的上电系统,测试电流变化时波动不大。 ------------------------------------------------------------------------------------- 现在的问题是: (1)将245损坏的原因归因于电源对不对?是不是初始上电这个尖角导致的?245的极限供电电压是 6.5v。 (2)DSP的1.2v和1.8v怎么回损坏?为什么会发生似乎短路的现象呢? (3)10A的电流,可能原因是什么? (4)电容购买时不小心,0402的电容耐压说不清楚,可能是最低的6.3v。这个最多导致5v供电短路, 对1.2 1.8应该不会有影响。我个人的经验,应该是dsp的1.2 和1.8短路。曾经经历过:别人调试我的 板卡通过转接板上电,但是转借板不是管脚一对一关系,烧了dsp板,就是3.3 1.2 1.8都短路。我拆了 所有电容,没有解决问题。 恭请各位大侠、同行、同学、同事、XDJM们发表看法,不吝赐教,非常感谢!!!   因为做了2块,把未用的那一块处理了后上电,正常,到目前为止未发现问题.换了电源,上电 爬坡,下电缓坡都很好.开关电源,几乎没有毛刺.调试中,过几天再写.期望不会发生类似上 面的问题.   =================================================================== 兄弟最近弄dsp(第一次接触),开始都挺好,做板,焊接,调试基本都还算顺利,虽然经过了一些小问题,但一直没烧过dsp。现在大部分工作 已经差不多了,到最后联合调试了,突然连续烧了几片dsp,具体原因还不清楚。先描述下我的现象: dsp的3.3V和1.9V对地,用万用表量,基本处于短路状态,上电后电源芯片和dsp都挺烫的;不过dsp仍然可以仿真debug调试,见鬼了!自己怀疑是dsp内部是分块供电,部分3.3V或者1.9V对地短路了,部分还能用,不知道有没有这个可能。 针对这个问题,网上搜了下,估计遇到烧dsp的人挺多了,下面贴一下各位烧过dsp的高人的发言: ----------------------------------------------------------------------------------------------- 1)TMS320F2812上电顺序是,先I/O后内核。 2)板卡和仿真器以及CCS连接调试上电的问题: 1。 首先是仿真器JTAG头与板卡上的JTag链接, 2。 仿真器与PC的USB口或者并口(并口类型的仿真器现在已经不多见), 3。 然后给板卡电源上电。 要这样的操作的原因是很多的仿真器一般是不支持热拔插的(即JTAG头或者仿真器的USB口,在PCB供电的时候拔掉或连接)。可能因为拔插过程中产生的脉冲打坏DSP 芯片或者仿真器本身。 3)关于Flash加密的问题(CCS中烧写插件添加正确版本的FLASH PROGRAM API函数): command文件. CMD 的配置,程序代码的地址段最好配置的不要离密码地址区域太靠近。 Deviceguanjiao是否存在虚汗; 是否存在供电电源不稳的情况; 这些都有可能会引起在烧写的过程中会对Flash烧写进去一个随机的动态密码,不知道密码,无法解密的情况。 ------------------ 实话说,电源我都已经量过,是正确的,内部FLASH空间肯定可以使用,这样说吧,我 做了20套电路板,焊接好后,只有15块可以使用,所以的程序和芯片都是一样的,所以说应该不存在设置问题,我想知道的是,可以通过量那些管脚来确定是 dsp芯片出问题了,这样我可以直接将芯片换了,免的浪费时间。 ********** -------------------------------------------------------------------------------------------------------- 是你的+5V电源有问题,纹波大或上下电时有高压脉冲 是你的+5V电源有问题,纹波大或上下电时有高压脉冲,烧坏了你的DSP内的FLASH, 可以用示波器测量一下你的电源上下电情况,以前我们也遇到过,当时找来TI的上海办工程师来查,还有一个代理商的技术支持也来查过,都没查出问题。 后 来查明是+5电源上下电时有一个 15V 10毫秒的脉冲。就是这个,我们烧了十几片,改正后就再没发生了 ------------------------------------------------------------------------ DSP,你为什么这么容易坏? 调试DSP时,JTAG总是烧坏,很郁闷,现将三次烧坏JTAG和一次烧坏仿真器的经历写下,在短短几个月内,有如此经历,真是痛快. 在下做了一块DSP板,由于第一次接触DSP,所以也特别小心,但是,DSP这东东不好惹,好几次给了我下马威,有的时候还真是怕了.大丈夫志在四方,岂能知难而退?于是在一次又一次的挫折下,在一次又一次的总结下,我终于将我的DSP程序调的差不多了,板卡硬件也全都调试通过,但是,今天,我的第三块DSP又烧了,检查原因,是JTAG口坏了,但是这一次,我既没有热插拔,又没有干什么非法操作,当我在完全掉电的情况下,我将仿真器的JTAG口插到我的用户板上,我听到一声很小的咔嚓声,这个声音是从仿真器传来的,这时的仿真器只有并口插着,电源掉电,目标板也掉电.这是一个不祥的声音.果然,我插上电源,目标板的电源灯很暗,短路了!打开CCS,无法连接.我心霸凉!! ------------------------------------------------------------------- 各位大侠:      小弟今天调试SPI模块,用SPI控制DAC7565,来做DA转换,我的程序是烧在RAM当中,当我用仿真器将程序烧好,并按F5全速运行的时候,这时我去测DA芯片的输出波形了,但是这时候DSP的芯片突然非常烫,我断电的时候发现DSP的电源和地已经导通了,而且今天我烧坏了4个DSP,都是这种情况,被老板骂惨了。我以前调片外RAM,定时器,以及SCI通信都是用的这个板子,而且DSP都工作正常,这些模块都调试完成,感觉硬件上应该没有什么问题能让DSP温度这么高。但是今天一带这个DA芯片就将DSP直接烧的短路。各位帮我想想到底是哪里的问题会影响?会不会是因为我测波形的时候碰到JTAG口导致突然有松动然后将DSP烧坏?不可能是我程序写的就是会烧坏东西的程序吧?各位给小弟出出主意,先谢过了。  -------------------------------------------------------------------------------------- 网上烧过dsp的高人很多,经验也很多,希望有类似经历的高人也介绍下,避免再次烧dsp,都是银子啊 -------------------------------------------------------------- 小弟画过几个6203bgnz的板子,用衡浮3输出开关电源(+/-12v、+5v)供电,台式机挂闻亭510仿真器。jtag口的emu0、emu1用20k上拉,tdi用1k下拉,其他直接连接dsp。板子上用pt6943做的DC/DC。以前偶尔会烧jtag口,我误以为是静电等原因,并未重视。这几天频繁烧jtag口。刚焊回来的板子,jtag口各管脚对地电阻均正常,仿真器连接后正常工作,等发现仿真器挂不上时个别管脚对地电阻就只剩下3点几或一点几欧姆了,最频繁的是tdi。请大虾们指点具体原因是什么。以后至少得加个隔离什么的,搞得我都快疯了。 串电阻 在JTAG信号上各串一个33欧姆的电阻; 仿真器也要从板子上取部分电源,所以要保证14-pin JTAG接口送给仿真器的电源不要超过3.3v 注意接地处理... 1、仿真器如果需要外部电源接地,要使用3芯带接地端的插头。 2、电脑的电源要使用3芯带接地端的插头。 3、扳子的供电要使用3芯带接地端[AC/DC]220~输入。 try! 感觉电路有问题 只有RST是下拉的,其他都是上拉,所以你的TDI下拉不符合标准设计啊。

  • 发表了主题帖: TMS320C6000应用中GEL文件的作用

    GEL(General Extension Language通用扩展语言)是一种类似于C语言的一种解释性语言,它可以创建GEL函数,以扩展CCS用途。       GEL是C语言的一个子集,然而它不能声明主机变量,所有的变量必须在DSP程序中定义,存在于仿真/实际目标板中,唯一不在目标板上定义的标识符是 GEL函数及其参数。       GEL函数可在任何能键入C表达式的地方调用,既可以在任何可键入C表达式的对话框中调用,也可以在其他GEL函数中调用。但不支持递归。       可以将常用的GEL函数添加到CCS的GEL菜单下,此时需要使用menuitem关键词在GEL菜单下创建一个新的下拉菜单列表(一级菜单),再使用 hotmenu,dialog和slider在该菜单项中添加新的菜单项(二级菜单)。       在CCS启动是自动执行GEL函数。SETUP CCS时设置环境时设置了自动执行GEL函数。自动运行StartUp()函数。这样要求每个工程建立时都载入GEL文件。       CCS提供了一系列嵌入GEL的函数。使用这些函数,用户可以控制仿真/实际目标板的状态,访问存储器,并在输出窗口中显示结果。 1 GEL文件基本作用  当CCSStudio启动时,GEL文件加载到PC机的内存中,如果定义了StartUp()函数则执行该函数。在CCSStudio(V2.3或更早的版本中),主机和目标板的初始化工作都在Startup()函数中执行。但是对于支持Connect/Disconnect的CCSStudio(V2.4 或之后的版本,尤其3.1版本),这样的GEL文件有可能没有正确的执行,因为CCSStudio启动时和目标处理器是断开的。这个时候,当Startup()函数试图访问目标处理器时会出错。 因此,V2.4或之后的版本,尤其3.1版本CCS启动时候,一个新的回调函数OnTargetConnect()来执行目标处理器的初始化工作。 2 GEL回调函数 2.1 Startup()函数       如果指定的GEL文件中包含Startup()函数,当 CCSStudio启动时执行Startup()函数。支持Connect/Disconnect的CCSStudio的启动时,Startup()函数中不包括访问目标处理器的代码,目标处理器由回调函数OnTargetConnect()来初始化。        推荐: l         建立基本的CCSStudio内存映射关系(不需要访问目标处理器) l         任何不需要访问目标处理器的基本初始化 不推荐: l         Get_Reset()(该函数通过仿真器复位目标处理器) l         通过GEL_BreakPtAdd()设置断点 l         GEL_TextOUT()和GET_OpenWindow(),因为StartUp()执行时CCSStudio的任何控制窗口还没有打开   不支持Connect/Disconnect的CCSStudio GEL文件中的StartUp()函数: /* The StartUp() function is called each time CCS is started. */ /* Customize this function to perform desired initialization. */ StartUp() { setup_memory_map(); GEL_Reset(); /* Do not call in StartUp() with CCStudio v2.4 or higher */ init_emif(); /* Do not call in StartUp() with CCStudio v2.4 or higher */ }  支持Connect/Disconnect的CCSStudio GEL文件中的StartUp()函数: /* The StartUp() function is called each time CCS is started. */ /* Customize this function to perform desired initialization */ /* that will not access the target. */ StartUp() { setup_memory_map(); }  2.2 OnTargetConnect()函数  绝对最小的系统初始化处理,保证CCSStudio在目标处理器上处于一种可信赖的状态。例如:禁止看门狗时钟、DSP复位结束  每一次和目标处理器建立连接时都调用OnTargetConnect()函数。 /* OnTargetConnect() is called every time a target is connected.*/ /* Its execution finishes before anything else occurs. Customize*/ /* this function to perform essential target initialization. */ OnTargetConnect() { // place critical target initialization steps here GEL_Reset(); init_emif(); } 对某些平台,必须调用GEL_Reset()函数使得CCSStudio处于一种 “Good”状态,可以通过测试来确定是否需要调用GEL_Reset()函数。应该尽可能的降低GEL startup functions复杂度-包括减少GEL_Reset()的调用。  2.3 OnPreFileLoaded()函数 在加载program/symbol(.out)文件之前该回调函数执行。在该函数中执行另外的目标处理器初始化操作以保证程序可以加载和调试是一个好的选择。 /* This function is called automatically when the 'Load Program'*/ /* Menu item is selected. */ OnPreFileLoaded() { FlushCache(); IER = 0; IFR = 0; init_emif(); } 2.4 OnReset()函数  当目标处理器复位后该函数被调用。如果你需要每次重新启动程序设计了软复位,GEL_Restart()在此处调用。 /* This function is called automatically after a SW Reset has been executed. OnReset(int nErrorCode) { init_emif(); } 2.5OnRestart()函数  当程序复位时调用该函数。 This function is called by CCS when you do Debug->Restart. The goal is to put the C6x into a known good state with respect to cache, edma and interrupts. Failure to do this can cause problems when you restart and run code multiple times. OnRestart(int nErrorCode ) { Turn off L2 for all EMIFA CE spaces. App should manage these for coherency GEL_TextOut("Turn off cache segment\n"); *(int *)0x1848200 = 0; /* MAR0 */ *(int *)0x1848204 = 0; /* MAR1 */ *(int *)0x1848208 = 0; /* MAR2 */ *(int *)0x184820c = 0; /* MAR3 */ /* Disable EDMA events and interrupts and clear any pending events. */ GEL_TextOut("Disable EDMA event\n"); */ *(int *)0x01A0FFA8 = 0; /* CIERH */ *(int *)0x01A0FFB4 = 0; /* EERH */ *(int *)0x01A0FFB8 = 0XFFFFFFFF; /* ECRH */ *(int *)0x01A0FFE8 = 0; /* CIERL */ *(int *)0x01A0FFF4 = 0; /* EERL */ *(int *)0x01A0FFF8 = 0xFFFFFFFF; /* ECRL */ /* Disable other interrupts */ IER = 0; IFR = 0; } 3 存储器映射 CCSStudio存储器映射告诉调试器目标处理器的那些存储区域可以访问那些不能访问。 CCSStudio存储器映射一般在StartUp()函数种执行。 3.1 GEL_MapAdd()函数 该函数添加一个存储区域到存储区映射中。 3.2 GEL_MapOn()和GEL_MapOff()函数 可以调用GEL_MapOn() or GEL_MapOff()来打开或关闭存储区映射。当存储区映射关闭时,CCSStudio假定可以访问所有的存储区空间。 3.3 GEL_MapReset()函数  GEL_MapReset()函数清除所有的存储区映射。没有存储区映射时,缺省设置是所有的存储区空间都不能访问。 4 尽量避免使用GEL初始化 可以考虑在GEL文件中使用GEL_MapAdd()建立存储区映射以准许 CCSStudio可以调试,但是不在GEL文件中执行外设设置例如:EMIF寄存器初始化、看门狗禁止。  因为GEL语法和C兼容,inif_emif()函数可以在.c文件中实现,和应用程序链接在一起。但是要注意以下几点:  使用“volatile”来保证变量不被优化。例如: *(volatile int *)EMIFA_SDRAMTIM = 0x00000618; /* SDRAM timing (refresh) */       在编译调试过程中避免在GEL文件中进行外设设置,当到达了最终程序时,需要一个智能加载软件从FLASH或主机加载程序对EMIF进行设置,然后通过 (E)DMA或memcpy()拷贝程序/数据。        加载了GEL文件以后,并不一定所有的寄存器都是复位值,主程序中没有赋值的寄存器并不一定就是它的上电复位值,因为加上了仿真器,加载了GEL文件,起到了作用。        这一点一定要好好注意。

  • 发表了主题帖: TMS320C6000基础学习(6)—— gel文件

    什么是gel文件?gel文件能干什么? gel全称General Extended Language,即通用扩展语言文件,gel文件中由类似C语言的代码构成,gel语言是一种解释性语言,gel文件扩展名为.gel; gel文件用于(1)扩展CCS功能,比如菜单选项等,(2)通过gel可以访问目标板的存储器。   1. gel基本语法——类C gel函数和gel参数不需要在DSP程序中定义。gel具有C语言的很多相似的东西:函数、return语句、if-else语句、while语句、与C一样的注释方式、#define,这些函数或语句的用法也与C中的非常类似。   GEL函数 funcName(param1 "discription" [,param2 "discription", param3 "discription",...]) { statements; } gel函数中不用声明返回类型和参数类型,但函数中可以使用return语句返回; 参数使用“参数+字符串类型的描述”组成,参数不需要定义,可以是以下的任意一种:实际/仿真的DSP目标板的符号值;数字常量(表达式或常值);字符串常量。 GEL函数调用:通常可以在输入C表达式的任意地方调用GEL函数,也可以在另一个GEL函数中调用GEL函数。GEL函数无法递归调用。   GEL语句 返回语句:   return [expression];   条件语句:     if (exp) statements 1; else statements 2; 循环语句:       while (exp) { statements; }     GEL预处理   #define identifier(arguments list) token-expression     GEL注释 // 注释 /* 注释 */   2. gel特有关键字 menuitem/hotmenu 在CCS v4.2中测试,menuitem添加Scripts菜单下的子菜单项,hotmenu添加menuitem定义菜单项的子菜单项,参考本文后面的例子。 这两个关键字声明的函数都不需要参数,比如     menuitem "Addressing Modes"; hotmenu C27x_Mode() { AMODE = 0; OBJMODE = 0; }   hotmenu C28x_Mode() { AMODE = 0; OBJMODE = 1; }   hotmenu C2xLP_Mode() { AMODE = 1; OBJMODE = 1; } 上面代码将产生如下的菜单结构,   Scripts -Addressing Modes - C27x_Mode - C28x_Mode - C2xLP_MODE dialog 向menuitem定义的菜单中添加一个入口子菜单,并在点击子菜单时弹出对话框。 menuitem "MyFunc" dialog InitTarget(StartAddr "Starting Address", EndAddr "Ending Address") { statements; } dialog RefreshTarget() { statements; }   slider 添加滑动条,每次移动滑动条都用滑动条上的新值重新调用GEL文件,定义格式如下, slider param_def(minVal, maxVal, increment, pageIncrement, paramName) { statements; }   3. gel文件的例子     /* * This GEL file (DSP621x_671x.gel) provides example code on how to * reset the C6x DSP and initialize the External Memory Interface. * * You will have to edit settings in emif_init() to your own * specifications as the example is applicable to the C6711 DSK. * * This file is has minimal functionality and is designed to be used * as a starting point for custom GEL files. * * Refer to CCS Help for detailed information on GEL commands. * */   /* * The StartUp() function is called every time you start Code Composer. * It should only include functions that do not "touch the hardware" - * Hardware initialization should be invoked from the OnTargetConnect() * function or the GEL menu. */ StartUp() {   /* setMemoryMap; this should be a function to initialize the mem map based on the particular hardware that is used */ }   /*--------------------------------------------------------------*/ /* OnTargetConnect() -- this function is called after a target */ /* connect. */ /*--------------------------------------------------------------*/ OnTargetConnect() { /* GEL_Reset is used to deal with the worst case senario of unknown target state. If for some reason a reset is not desired upon target connection, GEL_Reset may be removed and replaced with something "less brutal" like a cache initialization function GEL_Reset(); */ }   OnReset(int nErrorCode){ /* emif_init(); */ }   /* * OnPreFileLoaded() * This function is called automatically when the 'Load Program' * Menu item is selected ..... */ OnPreFileLoaded() { CleanCache(); }   /* * CleanCache() * Actually Invalidate L1D, L1P, and L2 */ CleanCache() { *(int *)0x01845004 = 1; }   emif_init() { /*---------------------------------------------------------------------------*/ /* EMIF REGISTERS */ /*---------------------------------------------------------------------------*/   #define EMIF_GCTL 0x01800000 #define EMIF_CE1 0x01800004 #define EMIF_CE0 0x01800008 #define EMIF_CE2 0x01800010 #define EMIF_CE3 0x01800014 #define EMIF_SDRAMCTL 0x01800018 #define EMIF_SDRAMTIMING 0x0180001C #define EMIF_SDRAMEXT 0x01800020   /*---------------------------------------------------------------------------*/ /* EMIF REGISTER VALUES - these should be modified to match TARGET hardware */ /*---------------------------------------------------------------------------*/   *(int *)EMIF_GCTL = 0x00003040;/* EMIF global control register */ *(int *)EMIF_CE1 = 0xFFFFFF23; /* CE1 - 32-bit asynch access after boot*/ *(int *)EMIF_CE0 = 0xFFFFFF30; /* CE0 - SDRAM */ *(int *)EMIF_CE2 = 0xFFFFFF23; /* CE2 - 32-bit asynch on daughterboard */ *(int *)EMIF_CE3 = 0xFFFFFF23; /* CE3 - 32-bit asynch on daughterboard */ *(int *)EMIF_SDRAMCTL = 0x07117000; /* SDRAM control register (100 MHz)*/ *(int *)EMIF_SDRAMTIMING = 0x0000061A; /* SDRAM Timing register */ } 上面的gel来自于CCS v4安装目录下ccsv4\emulation\gel\DSP621x_671x.gel文件,上面不仅使用了#define定义寄存器地址,还使用了类似C中的指针对EMIF(外部存储器接口)进行配置。         /******************************************************************/ /* Code Composer Studio supports five reserved GEL functions that */ /* automatically get executed if they are defined. They are: */ /* */ /* StartUp() - Executed whenever CCS is invoked */ /* OnReset() - Executed after Debug->Reset CPU */ /* OnRestart() - Executed after Debug->Restart */ /* OnPreFileLoaded() - Executed before File->Load Program */ /* OnFileLoaded() - Executed after File->Load Program */ /* */ /******************************************************************/   StartUp() { /* Initialize F2812 memory map */ GEL_Reset(); F2812_Memory_Map(); /* Enable_DFT(); */ GEL_TextOut("Gel StartUp Complete.\n"); }   OnReset(int nErrorCode) { Enable_DFT(); }   /* commented out to avoid execution OnRestart(int nErrorCode) { }   OnPreFileLoaded() { }   OnFileLoaded(int nErrorCode, int bSymbolsOnly) { } */   menuitem "Initialize Memory Map";   /*------------------- F2812 Memory Map, MPNMC=0 --------------------*/ /* */ /* Note: M0M1MAP and VMAP signals tied high on F2812 core */ /* */ /* 0x000000 - 0x0007ff M0/M1 SARAM (Prog and Data) */ /* 0x000800 - 0x000fff Peripheral Frame0 (PF0) (Data only) */ /* 0x002000 - 0x003fff XINTF ZONE 0 (Prog and Data) */ /* 0x004000 - 0x005fff XINTF ZONE 1 (Prog and Data) */ /* 0x006000 - 0x006fff Peripheral Frame1 (PF1) (Data only) */ /* 0x007000 - 0x007fff Peripheral Frame2 (PF2) (Data only) */ /* 0x008000 - 0x009fff L0/L1 SARAM (Prog and Data) */ /* 0x080000 - 0x0fffff XINTF ZONE 2 (Prog and Data) */ /* 0x100000 - 0x17ffff XINTF ZONE 6 (Prog and Data) */ /* 0x3d7800 - 0x3d7fff OTP (Prog and Data) */ /* 0x3d8000 - 0x3f7fff FLASH (Prog and Data) */ /* 0x3f8000 - 0x3f9fff H0 SARAM (Prog and Data) */ /* 0x3fc000 - 0x3fffff XINTF ZONE 7 (MPNMC=1) (Prog and Data) */ /* 0x3ff000 - 0x3fffff BOOT ROM (MPNMC=0) (Prog and Data) */ /*------------------------------------------------------------------*/ hotmenu F2812_Memory_Map() { GEL_MapReset(); GEL_MapOn();   /* Program memory maps */ GEL_MapAdd(0x0,0,0x800,1,1); /* M0/M1 SARAM */ GEL_MapAdd(0x2000,0,0x2000,1,1); /* XINTF ZONE 0 */ GEL_MapAdd(0x4000,0,0x2000,1,1); /* XINTF ZONE 1 */ GEL_MapAdd(0x8000,0,0x2000,1,1); /* L0/L1 SARAM */ GEL_MapAdd(0x80000,0,0x80000,1,1); /* XINTF ZONE 2 */ GEL_MapAdd(0x100000,0,0x80000,1,1); /* XINTF ZONE 6 */ GEL_MapAdd(0x3d7800,0,0x800,1,0); /* OTP */ GEL_MapAdd(0x3d8000,0,0x20000,1,0); /* FLASH */ GEL_MapAdd(0x3f8000,0,0x2000,1,1); /* H0 SARAM */   /* Data memory maps */ GEL_MapAdd(0x0,1,0x800,1,1); /* M0/M1 SARAM */ GEL_MapAdd(0x800,1,0x800,1,1); /* PF0 */ GEL_MapAdd(0x2000,1,0x2000,1,1); /* XINTF ZONE 0 */ GEL_MapAdd(0x4000,1,0x2000,1,1); /* XINTF ZONE 1 */ GEL_MapAdd(0x6000,1,0x1000,1,1); /* PF1 */ GEL_MapAddStr(0x7000,1,0x1000,"R|W|AS2",0); /* PF2 */ GEL_MapAdd(0x8000,1,0x2000,1,1); /* L0/L1 SARAM */ GEL_MapAdd(0x80000,1,0x80000,1,1); /* XINTF ZONE 2 */ GEL_MapAdd(0x100000,1,0x80000,1,1); /* XINTF ZONE 6 */ GEL_MapAdd(0x3d7800,1,0x800,1,0); /* OTP */ GEL_MapAdd(0x3d8000,1,0x20000,1,0); /* FLASH */ GEL_MapAdd(0x3f8000,1,0x2000,1,1); /* H0 SARAM */   /* Uncomment the map that corresponds to the MPNMC value. */ F2812_Boot_ROM_Map(); /* F2812_XINTF_Zone7_Map(); */ }   /* Map Boot ROM if MPNMC = 0 */ F2812_Boot_ROM_Map() { GEL_MapAdd(0x3ff000,0,0x1000,1,0); /* BOOT ROM */ GEL_MapAdd(0x3ff000,1,0x1000,1,0); /* BOOT ROM */ }   /* Map External Interface Zone 7 if MPNMC = 1 */ F2812_XINTF_Zone7_Map() { GEL_MapAdd(0x3fc000,0,0x4000,1,1); /* XINTF ZONE 7 */ GEL_MapAdd(0x3fc000,1,0x4000,1,1); /* XINTF ZONE 7 */ }   /* Enable DFT read/write for SARAM blocks */ Enable_DFT() { *0x950 = 0x0300; /* M0 */ *0x951 = 0x0300; /* M1 */ *0x952 = 0x0300; /* L0 */ *0x953 = 0x0300; /* L1 */ *0x954 = 0x0300; /* H0 */ }   menuitem "Watchdog"; hotmenu Disable_WD() { /* Enable WD override */ *0x7029 = *0x7029 | 0x0068; *0x7025 = 0x0055; *0x7025 = 0x00AA; }   menuitem "Code Security Module" hotmenu Unlock_CSM() { /* Assumes flash is erased */ *0xAE0 = 0xFFFF; *0xAE1 = 0xFFFF; *0xAE2 = 0xFFFF; *0xAE3 = 0xFFFF; *0xAE4 = 0xFFFF; *0xAE5 = 0xFFFF; *0xAE6 = 0xFFFF; *0xAE7 = 0xFFFF;   /* Read the password locations */ XAR0 = *0x3F7FF8; XAR0 = *0x3F7FF9; XAR0 = *0x3F7FFA; XAR0 = *0x3F7FFB; XAR0 = *0x3F7FFC; XAR0 = *0x3F7FFD; XAR0 = *0x3F7FFE; XAR0 = *0x3F7FFF; }   menuitem "Addressing Modes"; hotmenu C27x_Mode() { AMODE = 0; OBJMODE = 0; }   hotmenu C28x_Mode() { AMODE = 0; OBJMODE = 1; }   hotmenu C2xLP_Mode() { AMODE = 1; OBJMODE = 1; } 上面的代码是DSP320F2812的一个GEL文件 结果的一个截图如下,

  • 发表了主题帖: 通过采用高速ADC技术实现1GHz带宽RF数字化仪的设计

         速度在1GSPS以上的高速ADC技术的采样率和性能不断提升,全新器件能够实现RF频谱的直接采样。这些全新的模数转换器 (ADC) 能够在保持出色噪声和线性的同时,在3GHz或更高的频率上,以大于1GHz的带宽对信号进行采样。更高的采样率是实现这个功能的关键所在,更快速的采样率可以大大减少宽带宽RF数字化仪的尺寸和功率。       可以考虑一下,一个12位4 GSPS ADC,比如ADC12J4000,是如何能够直接在RF上采样1GHz带宽的信号。它的3.3GHz输入带宽可实现在第二那奎斯特区域的信号采样。为了防止其它目标数字频带外的信号干扰数字化信号,需要一个抗混叠滤波器来减少其它那奎斯特区域内的带外信号混叠进入目标信号。      为了将已采样信号放置在第二那奎斯特区域的中央,并且在最接近的1.5GHz混叠频率上使用一个具有60dB抑制性能的滤波器,我们需要一个3:1的整形因数。相对来说,虽然理论上可以使用处于第三那奎斯特区域中央的较低采样率,比如2.5GSPS,所需的抗混叠滤波器的采样因数将为1.5:1(整形因数越低,实现起来就越困难)。具有更高采样率的较宽松滤波器要求可以通过减少所需的谐振器或偶极子的数量来大大减少滤波器的系统尺寸、重量和成本。      在很多诸如信号智能、电子对抗和卫星通信的应用中,需要将微波或更高频带内10GHz或以上的频率范围数字化。通常情况下,这由GSPS ADC将信号下变频至2~4GHz以实现其数字化来完成。每条信号链都需要单独的放大器、混频器、合成器、滤波器和ADC。      ADC的采样率越高,需要的信号链就越少。例如,假定带宽占用达到70%,一个2.5 GSPS ADC需要12个单独的下变频级,而4 GSPS ADC只需要7个。这直接使数字化仪的尺寸、功率和重量减少了42%。      更快速的采样率还提升了较窄带宽系统的性能、功率和密度。如图1中,一个100MHz的信号位于3GHz频带中央的1.5GHz频带内,由采样率为4 GSPS ADC进行采样。采样后,ADC内的集成数字下变频转换器可被用来隔离目标信号,并且过滤掉所有目标信号以外的有害噪声和干扰能量。     然后可以将采样率减少32倍,达到125MSPS复采样,刚好能够支持所需的信号带宽。与通过取采样数量的平方根值,用更多的采样提升信噪比 (SNR) 的方法相类似,已抽取的数据比ADC SNR高,高出的值为ADC与输出采样率之间比率的常用对数的10倍。借助较低的输出采样率,ADC12J4000的灵活JESD204B接口能够只通过一条串化器/解串器 (SERDES) 信道输出信号,从而可以使大量的ADC 被连接至单个FPGA,并且每个ADC的接口功率更低。 对于宽频带RF数字化仪的设计人员来说,采样率的确是越快越好。

  • 发表了主题帖: 基于GPRS模块与Zigbee网络实现照明终端系统的应用设计

     一、系统总规划     底层部分配置图 1. 功能介绍:      系统的底层部分(指现场控制器以下)由现场控制器,照明终端主控制器(Coord),照明终端控制器(Router/RFD)构成。照明终端主控制器接收现场控制器通过GPRS模块发送过来的控制器信号后通过Zigbee网络采用透明传输的方式发送命令到照明终端控制器(节点),对其进行控制操作或读取其状态。主控器(Coord)将现场采集(或巡检)的路灯状态信息通过GPRS模块发送到现场控制器。主控制(Coord)与终端控制器采用分组的方式通讯,每个组有一个组号,同一区域内允许有多组路灯,各组之间互不干扰。 2. 系统特点: 1)基于成熟的Zigbee网络,具有高稳定性和可靠性的特点。 2)低成本。通过大幅简化协议,降低了对通信控制器的要求,ZigBee免协议专利费。 3)低速率。ZigBee工作在250kbps的通讯速率,满足低速率传输数据的应用需求。 4)长距离。普通模块传输范围一般介于10~100m之间,在增加RF发射功率后,亦可增加到100m-1km。这指的是相邻节点间的距离。如果通过路由和节点间通信的接力,传输距离将可以更远。 5)短时延。ZigBee的响应速度较快,一般从睡眠转入工作状态只需15ms,节点连接进入网络只需30ms,进一步节省了电能。 6)高容量。ZigBee可采用星状、片状和网状网络结构,最多可组成65000个节点的大网。 7)高安全。ZigBee提供了三级安全模式,包括无安全设定、使用接入控制清单(ACL)防止非法获取数据以及采用高级加密标准(AES128)的对称密码,以灵活确定其安全属性。 8)免执照频段。采用直接序列扩频在工业科学医疗2.4GHz(全球) (ISM)频段。 3. 系统参数 主芯片:CC2430F128 频段:2.4-2.475GHz 通讯协议:标准IEEE 802.15.4、ZigBee2006 网络拓扑结构:网状或串状 调制方式:DSSS 数据传输速率:≤250KBps 接收灵敏度:-103 dBm 通信距离:可达200m以上(加PA) 发射电流:约28mA,(加PA后60mA) 接收电流:约28mA(加PA后60mA) 休眠电流:20uA以下 工作温度-30-80℃ 二、照明终端控制器(Coord) 1. 系统组成框图 图1 2. 功能      由于主控制器的CC2430负责的网络任务较重所以采用一个专用的MCU做处理。CC2430只负责网络部分的处理; GPRS拨号,数据接收,命令和数据的下发由MCU来完成。照明终端主控制器接收现场控制器通过GPRS模块发送过来的控制器信号后通过Zigbee网络采用透明传输的方式发送命令到照明终端控制器(节点),对其进行控制操作或读取其状态。      主控制器和现场控制器通过GPRS模块通讯,GPRS模块工作于Socket模式下,采用透明传输的方式(通讯协议见附件)。GPRS之间的通讯请求采用电话唤醒的模式,有数据请求对方时拨打电话,核对相应的呼叫方后在通过GPRS建立通讯(这部分需咨询ZLG的相关产品)      MCU选用ST公司主流的STM32控制器,采用Cortex-M3内核,兼有成本和性能的优势,具有丰富的接口,有内置看门狗电路,3个带握手控制的USART。(也可以改为现场控制器相同的LPC213x控制器)。 三、照明终端控制器(Router/RFD) 1. 系统组成框图 图2 2. 功能      照明终端控制器中CC2430模块主要负责接收从主控制器下传的控制信息发送给照明灯控制器,并将采集的到的灯状态发送给主控制器。

  • 发表了主题帖: Qorvo®推出完整的V2X前端解决方案

         移动应用、基础设施与航空航天、国防应用中 RF 解决方案的领先供应商 Qorvo?, Inc.(纳斯达克代码:QRVO)推出首个 47 频段 /Wi-Fi 体声波 (BAW) 共存滤波器和基于此的 V2X 前端产品套件,可在确保可靠性的前提下实现在远程通信单元 (TCU) 和天线中启用车对万物 (V2X) 链路。由于从 2019 年到 2025 年,全球预计将增加 2.86 亿辆联网乘用车,该产品组合可为 V2X 通信提供了一个现成的解决方案。       V2X 是车辆通信技术的总称,它允许车辆与周围的环境进行通信,其中来自传感器和其他来源的信息通过低延迟、高可靠性链路传播,为完全自动驾驶铺平了道路。V2X 有几个组件,包括车对车 (V2V)、车对基础设施 (V2I)、车对行人 (V2P) 和车对网络 (V2N) 通信。     Qorvo V2X 套件包括首个 47 频段 /Wi-Fi 体声波 (BAW) 共存滤波器,它可以实现与 V2X 5.9 GHz 频段的 Wi-Fi 共存。这种能力对于在车辆与周围环境之间建立可靠的联系至关重要。它还包括两个支持 C-V2X 和 DSRC 系统的集成式前端模块 (FEM)、一个数字步进衰减器、发射 / 接收开关和低噪声放大器。 Qorvo 传输业务部总经理 Gorden Cook 表示:“Qorvo 是唯一一家提供兼容多种芯片的解决方案的公司,该解决方案可实现稳健的 V2X 链路以及足够的传输线性功率和在 Wi-Fi 环境下的最佳接收性能。Qorvo 的新型 BAW 滤波器 QPQ2200Q 是自动驾驶汽车系统的重要组成部分,其中 Wi-Fi 和 V2X 将共存。” 符合资格的客户可以索取 Qorvo V2X 套件中以下产品的样品:     Qorvo 提供广泛的汽车 V2X、Wi-Fi、SDARS 和 LTE 解决方案组合,同时支持 C-V2X 和 DSRC 协议。这些解决方案是与领先模块制造商使用的多个芯片组紧密配合开发的,旨在支持较长的汽车生命周期。除了满足 ISO/TS 16949 认证要求之外,Qorvo 还施行 AEC-Q100 和 AEC-Q200 测试以确保产品达到严格的汽车行业要求。

  • 发表了主题帖: Zigbee的基本东西认识

    搭建一个基于zigbee的小型物联网系统,今天开始记录学习历程 1,zigbee协议栈的实质就是一个实时内核(RTOS)+ 一套通信协议。   2,路由器、协调器、终端设备的主要区别是软件层次的,在硬件方面,这三者完全可以是同样的东西。协调器负责启动、配置整个网络,一旦完成他的任务,协调器一般就退居二线,起到一个终端设备或路由器的功能。路由器主要完成通信中继的功能。终端设备大部分时间处于睡眠状态。   3,网络结构主要有星型、树状、簇状三种,在zigbee协议栈的网络层代码中用#define进行了定义。   4,zigbee信标模式和非信标模式,常用的是非信标模式。   5,zigbee设备有两种类型的地址。第一种是64位的IEEE地址,即MAC地址,全球唯一;第二种是16位的网络地址,协调器的网络地址为0x00,协调器负责给路由器、终端设备分配地址。 6,z-stack是半开源的协议栈,我们并不是能清楚的看到每个层的源码,部分代码是以库的形式提供的。一般情况下,我们至少应该读懂硬件抽象层和设备对象层的代码,这里需要自己添加自己想要的功能。硬件抽象层里面有系统消息事件、led事件、键盘事件。在设备对象层里面有系统消息事件、ZDO状态改变事件、网络初始化事件、网络启动事件、网络更新NV事件、设备重启事件。应用层事件有系统消息事件、允许绑定时间事件、绑定时间事件、进入事件、用户事件等等。 7,Zigbee协议栈的实时性要求不是很高,因此在设计任务调度程序的   时候,OSAL(操作系统抽象层)采用了轮询调度队列方式进行任务调度。   任务号越小,任务优先级越高。MAC层优先级最高,应用层任务优先级最低。OS按优先级高低去执行事件,周而复始去轮询。 zigbee工程文件目录介绍: APP :应用层文件,*.c和*.h,可根据项目需要进行添加和修改 HAL :硬件抽象层,对应于物理层(PHY) MAC ,ZMac :与数据链路层有关的文件,其中的的文件不能修改,都是做好的库文件和API,是不开源的,不需要做任何修改 MT :串口调试相关的文件 NWK :网络层的文件,均是*.h文件,是API,直接使用,不需要添加、修改 OSAL :与操作系统(OS)有关的文件 Profile :协议栈规范相关的文件 Security :有关安全机制的文件,不做任何修改 Services :服务相关的文件 Tools :一些配置文件,比如协调器、路由器的配置信息,不需要做修改 ZDO :zigbee设备对象层文件,很重要,通过此目录中的文件可知道协议栈运行的过程,要求读懂 ZMain :整个协议栈的入口,main函数就在这个目录中,读程序一般要从这个目录读起 Output :工程的输出文件,其中的*.map是整个工程编译输出的情况,包含内存的分配、代码量大小之类的信息   Zigbee术语: NV :非易失性存储器,如nand flash FFD :全功能设备,如路由器、协调器 RFD :半功能设备,如终端设备节点 簇 :多个属性的集合,每个簇有一个唯一的ID 描述符 :一个设备可以有240个端点,每一个端点必须有一个端点描述符,它是一个结构体

  • 回复了主题帖: CC2530的ADC采集外部电压

    本座尊 发表于 2020-2-11 13:11 在协议栈里面如何使用呢
    用户实现一个简单的无线数据通信时的一般步骤: 1、组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。 2、发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。 3、接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。

  • 2020-02-10
  • 发表了主题帖: 源码CCS编译错误

    错误:Description Resource Path Location Type  This project was created using a version of compiler that is not currently installed - 5.2.7 [ARM].  显示的是找不到ti-cgt-arm_5.2.7的包,去官网下载一个包含的包例如:ti-cgt-arm_5.2.9的包,放到ccsv8/tools/compiler中去,重新添加一次,重新编译。  

  • 发表了主题帖: IAR 新版本打开老版本遇到的问题和解决方法

    1.__nounwind declaration is incompatible with "__nounwind __interwork __softfp unsigned int __iar_builtin_STREXB(unsigned char, unsigned char volatile *) 解决方法:右击工程进入options->C/C++Compiler->Preprocessor删除 $PROJ_DIR$\..\Libraries\CMSIS\CM3\CoreSupport 2.打不开”core_cm3.h” cannot open source file "core_cm3.h"  原因:没有选MCU型号  解决方法:右击工程进入options->General Options->Target选设备,选设备完后进入Library Configuration,勾选CMSIS内的Use CMSIS  

  • 发表了主题帖: CCS5.5.0编译问题之” version of compiler版本不同”

    编译警告: This project was created using a version of compiler that is not currently installed: 6.0.3 [C2000]. Another version of the compiler will be used during build: 6.2.0. Please install the compiler of the required version, or migrate the project to one of the available compiler versions by adjusting project properties     解决方法: 右键工程 à 属性 à General à Compiler version

  • 发表了主题帖: 编解码器 - 针对 C55x 器件进行了优化 C55XCODECS

    编解码器免费提供,附带生产许可且现在可供下载。全部经过生产测试,可轻松集成到音频和语音应用中。单击“获取软件”按钮(上方),以获取经过测试的最新编解码器版本。该页面及每个安装程序中都包含有数据表和发布说明。 TMS320C5504  C5505 eZdsp&#153; USB 记忆棒开发工具 C55x 编解码器经过优化,可用于任何 TM320C55x™ 器件上。C55x 编解码器提供: 免费、带有产品许可的对象代码 WINDOWS 安装程序 C55x 音频编解码器在 C5505 和 C5510 器件上进行过测试 C55x 语音编解码器在 C5510 器件上进行过测试 所有编解码器均兼容 eXpressDSP™ 每个编解码器数据表都指定了性能数据 DSP 和 ARM 编解码器 - 当前库存 -

  • 发表了主题帖: C6000定点DSP-C645x应用指南

    本帖最后由 fish001 于 2020-2-10 21:40 编辑 C645x系列高性能定点DSP,C645x系列DSP 建立在最新的增强型C64x+ DSP内核架构基础之上,基于第三代超长指令结构VelociTI.3。C645x系列DSP主要针对各种基础局端设备应用,包括高端电信设备、无线基础局端以及视频与影像应用等领域。C645x系列DSP不仅为开发人员提供了两倍于 TMS320C641x DSP 的存储器容量与 I/O 带宽,还具备其它高级特性与功能,实现了以低成本满足新一代系统对更高处理性能与更大存储器容量的需求。 C6000 C6000TM 多核 DSP + Arm® SoC  C645x系列DSP的主要特点与优势:  ◆     存储器容量与 I/O 带宽是 C641x 的两倍,主频高达1.2G, 峰值运算速度达9600 MMACS(MIPS),而价格与TMS320C6415 DSP 基本相当。  ◆     增强型 C64x+ DSP 内核使系统性能提高了20%,代码长度缩短了20%~30%,同时与 TMS320C64x DSP 实现了 100% 的代码兼容性。 ◆     存储器扩展接口增加支持高性能、大容量的DDR2 SDRAM。 ◆     Serial RapidIO (SRIO) 与千兆以太网 MAC 串行器/解串器 (SERDES) 接口支持高效互连通信,可实现高效的处理器间通信。 ◆     新增49条指令。以乘法单元为例,该单元的改善及新增指令加大了乘法运算带宽,支持32位乘法和复数乘法,使每周期16×16的MAC数达8个,大大提升了DSP在处理DCT和FFT变换方面的性能。 ◆     新增软件流水缓存(SPLOOP Buffer)。对原C64x内核(C62x和C641x使用的)的软件流水(Software Pipeline)进一步提升DSP的处理性能,它既可以战胜多周期指令延时对CPU处理性能的影响,还可以在流水线运行阶段的每个周期输出一个或多个处理结果。 ◆     支持紧凑指令(Compact Instructions)。原C64x 内核只支持定长取指包,而C64x+内核支持带“头”的取指包,指令包头标注了该指令包中其它7个字中,哪些是32位的操作码,哪些是16位的操作码。支持紧凑指令可以节省程序存储空间;也能增添程序Cache的命中率。

  • 发表了主题帖: TMS320C6000 C/C++运行时环境笔记

    一.存储器模型    C6000编译器把整个存储区当作单个线性存储块,并将其分配为代码区和数据区,一个C程序产生的代码和数据被放在各自连续的存储空间中,编译器假定存储器的32位地址空间都是可用的,但需要注意的是,连接器才是最终决定存储器映像(定义存储器映像并将代码和数据分配到目标存储器的是连接器,)编译器不对可用的存储器作任何假设,也不关心哪个地址不能被代码或者数据占用,以用哪些地址是保留给I/O设备或控制寄存器。   关于段:     编译器生成的可重定位的代码块和数据块称为段,系统设置不同,段分配到存储器的方式也不同,c6000编译器产生如下几个段:  已初始化段,包含数据和执行代码  (1).cinit段:包含变量初始值和常量值.   (2).const段:包括字符串文字,浮点常量和在程序中被声明为const的数据(如果常量没有同时被声明为volatile   (3).switch段:包含switch语句的跳转表   (4).text段:默认的包含所有的可执行的代码 未初始化段:存储器中的保留空间,程序在运行时用它来创建和存储变量。C/C++编译器生成的未初始化段:   (1).bss: 为全局变量和静态变量保留,如果为连接器设置了-c选项,则在程序开始时,C引导程序(c_int00)会将.cinit段的数据复制到bss段中,编译器会定义全局符号$bss,并指定其为.bss段的起始地址.  (2).far段:为声明为far的全局变量和静态变量保留  (3).stack段:系统栈,这个存储区用于传递参数和为局部变量分配存储空间.  (4).system段:为动态存储空间分配保留的存储区,提请动态空间分配要求的函数有:malloc calloc,和realloc等等,如果程序中没有用这些函数,编译器不生成此段

统计信息

已有1306人来访过

  • 芯币:10520
  • 好友:--
  • 主题:2685
  • 回复:716
  • 课时:--
  • 资源:19

留言

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


博浩元电子 2018-10-25
不错,干货
查看全部
67娱乐系统 快乐飞艇全天计划图片 快乐赛车计划 快乐飞艇怎么样才能赢 快乐赛车注册网址 5分钟一开的快乐飞艇 快乐飞艇下注技巧 极速快三 快乐飞艇怎样稳赚 快乐飞艇哪里开的