单片机

DDR5系统管理引入了一种全新的边带总线,其正式名称为JESD403-1 JEDEC模块边带总线。DDR5标准的开发正由JEDEC和MIPI联盟合作进行。

1.png

在引入这种全新应用的情况下,该应用所用到的SPD集线器、PMIC和微控制器需要在确保协议合规性的基础上实现高度集成。因此,瑞萨开发了一种结合瑞萨SPD5集线器SPD5118、瑞萨PMIC、温度传感器和新款瑞萨RA RA2E2组的解决方案,以实现符合JEDEC JESD403和MIPI I3C BasicSM要求的边带总线操作。另一方面,这些关键的瑞萨设备已通过MIPI I3C BasicSM的全面认证,并且该系统还能够向后兼容旧版JEDEC I2C实施。

DDR5 DIMM边带总线和主机总线的简要架构

瑞萨DDR5解决方案附带原型套件,可配合上述的总线和电源布局架构使用,并在RA I3C总线的前端采用了电平移动电路,以满足JESD403-1的特定总线电压要求。客户可以通过他们的SDRAM模块充分利用此集成套件,从而加速产品发布计划。

2.png

管理总线协议

边带总线采用特定的结构化寻址方案(如下文简述)来识别DIMM以及DIMM上的设备。因此,I3C基础的ENTDAA和基于PID的地址计算方案并不需要强制执行。基于此情况,SPD集线器通过两个模式处理地址计算和HID分配,而DIMM上能够以I3C基础模式运行的设备应为JEDEC SETHID CCC和SETAASA CCC提供支持。

  • 在JEDEC I2C模式中(默认通电),通信(以DIMM上的设备为目标从属设备)由主机发出启动条件开始,后接7位从属地址和一个读/写字位。通信过程中,作为首个接收器的SPD集线器将替换寻址DIMM的从属地址的LSB 3bits(HID)并转发到本地总线,不包括0x7E的广播地址。SPD集线器借助精密电阻检测HID/DIMM_ID并辅助HID分配。

  • JEDEC I3C模式将一直生效,直至作为边带总线上首个接收器的SPD集线器接收到JEDEC SETHID CCC为止。一旦集线器检测到JEDEC SEHID CCC,集线器便会停止HID数位翻转,并将传入的7位从站地址按原样透明地传送到本地总线中。在此操作之后,DIMM上所有从SPD集线器接收SETHID CCC的I3C设备应更新其静态地址分配,并等待SETAASA CCC完成地址分配以进入I3C基础操作。

下图对上述两种模式的操作说明进行了汇总。

在收到JEDEC SETHID CCC之前I2C模式默认通电

3.png

接收到JEDEC SETHID CCC时,进入I3C模式

4.png

RA2E2组包含全面通过MIPI I3C BasicSM认证的I3C接口,可向后兼容旧版JEDEC I2C实施,设计师能够简化硬件设计,同时轻松而顺畅地实现从旧版I2C平台到I3C平台的转移。

DDR5 ARGB LED控制实施

RA2E2组在尺寸仅为4.00mm×4.00mm的24引脚HW四方扁平无引脚(HWQFN)封装中提供6通道的通用PWM定时器。借助硬件支持,可以通过最大化可控ARGB LED阵列的数量来拓展照明效果的选项。

演示和验证

作为MIPI联盟的成员和较早采用MIPI I3C Basic SM和JEDEC JESD 403-1的先行者,瑞萨解决方案的边带总线运行和协议合规性验证已通过Prodigy I3C协议分析器和模拟器完成,可支持MIPI I3C Basic V1.0, V1.1规格。此外,瑞萨解决方案能够向后兼容SM总线,以满足英特尔目前对LED照明控制的DDR4和DDR5结构要求,而瑞萨的第三方合作商也将提供包括H/W、F/W和S/W在内的全套解决方案,从而改善整体开发环境。

5.jpg

来源:瑞萨MCU小百科

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 139

其实,单片机就是个小计算机。大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,显得更加小巧灵活。

直到90年代初,国内容易得到的单片机是8031:不带存储器的芯片,要想工作,必须外加RAM和ROM,于是单片机成了3片机......

而现在不同了,无论大的,还是小的,又是51,又是AVR,又是STC,还有什么430、PIC……都各说各的好,可谁也不敢说“我不要存储器”。

单片机的数据存储手段

1、程序存储器ROM

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。如果硬要它按照公式一个个计算,对于它来说未免力不从心。可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

2、数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

3、会不会混淆不清?

答案是不会的,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;读写RAM是另外的数据传送指令,也不会进入ROM区。

这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

总结

另外,在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 116

筋膜枪作为一款能够缓解身体疲劳,提升幸福感的小家电,越来越多的人使用它,俨然已成为居家必备神器。

下图这款筋膜枪内置大容量锂电池,充电方便,能耗低,续航时间超长;同时具备噪音小、重量轻等优点,使用体验感得到进一步提升。下面我们就对这款筋膜枪进行拆机图解,看看这款产品的内部结构以及关键器件的设计。

筋膜枪开箱

产品外观展示

1.jpg

包装简洁轻便,内置摆布合理,充满工业设计的美感。有蓝色、米色和紫色三种颜色可选,图中样品为紫色,金属质感反射光泽,高贵奢华,非常受欢迎,时常断货。

打开盒子可见筋膜枪及其所有配件如下图。

2.jpg

包装盒内包含筋膜枪主体x1、U型按摩头x1、锥形按摩头x1、扁头按摩头x1、球型按摩头x1、type-C充电线x1、说明书x1。其中,不同的按摩头适用不同的按摩场景,可满足更多按摩需求,舒适度直线提升。

3.jpg

筋膜枪主体底盖是工程塑料材质,电源键嵌套在底盖里。这个电源键长按可开启/关闭筋膜枪,开启后单击可切换档位。该设计功能简便清晰,便于上手操作,且启动机器后档位状态灯显示柔和不刺眼。

4.jpg

USB-C充电接口旁边绿灯闪烁为正在工作状态,右边四个孔位的蓝灯即为档位,一到四档对应一到四个灯亮起,按摩头震动的频率和力度随蓝灯亮的数量增加而加大。

5.jpg

正面 USB-C 是充电接口,Type-C充电口更加适合常规场合。旁边LED变成红色即为充电中,绿色表示充电完成。四个孔位的灯表示蓄电池的电量。

6.jpg

外观介绍完成,现在我们开始拆机!!!

主控板的正面布局合理,充电部分是通过MCU+电感实现智能充电管理,按键+LED则可实现电机传动速度调机控制。

7.jpg

主控板的背面布局也十分合理,方案为单片机+MOS+电流采样方式完成传动部分控制,这种方案不但可以大幅度降低成本,还可以大大提升电机的工作性能,让控制更加精准。

8.jpg

主控板上使用的是爱普特微电子推出的APT32F1023H8S6芯片。此芯片是基于平头哥半导体(T-HEAD Semiconductor) CPU内核开发的32位高性能单片机。

APT32F1023芯片特性如下:

• 32位CPU内核(0.7DMIPS),支持单周期乘法和SWD调试

• 独立硬件除法器

• 片载64K(32Kbytes可选)程序闪存,独立2Kbytes数据闪存

• 内含4Kbytes SRAM,可用于堆栈,数据存储,代码存储

• 工作温度:− 40 to 85℃

• 工作电压范围:1.8 to 5.5V

• 最高工作频率:48MHz

• 中断控制器:支持动态配置的可嵌套中断(NVIC)

• 增强的时钟和功耗控制器(SYSCON)

• 独立看门狗定时器(IWDT)

• 1x16位增强型定时器/计数器(EPT),每个TIMER支持7路PWM输出功能,其中6路可配置为互补带死区

• 1x 16位通用定时器/计数器,支持2路PWM输出功能(GPT)

• 1x 16位计数器(COUNTERA),支持自动重载功能以及单次或者循环计数功能(载波发生器)

• 1x 16位基本计时TIMER (Basic Timer)

• 1x 16位低功耗TIMER(LPT)

• 1x 16位RTC

• 1x 8位WWDT

• 串行通信接口:1x I2C,3x UART,1/0 x SPI,1 x SIO

• 多达16路的12位ADC,支持内部/外部VREF输入

• 支持96bit UID功能

• 最多支持22个GPIO,所有GPIO均可配置为外部中断

• 支持三种工作模式:RUN,SLEEP,和DEEP-SLEEP模式

• 多达17路的触摸按键控制器

• 4 个大电流驱动管脚(每个管脚支持灌入最大电流为120mA)

9.png

接下来我们看下电池部分。电池使用的是11.1V标准产品,充电电压为12.6V,该部分由爱普特APT32F1023直接升压智能充电管理。

10.jpg

接着我们看筋膜枪的传动部分,如图可见传动室内由连杆、活套和偏心轮构成。这款筋膜枪传动部分全为铝合金组成,大大提高了产品的流畅性及耐用性。

11.jpg

好了,整机拆解完毕,最后我们拍个全家福吧。

筋膜枪拆机总结

此筋膜枪采用的是铝合金外壳,外观简洁,手持尺寸及重量均符合人体使用工学,功能齐全且指示清晰明了,产品上手操作简单。

此次拆解中可看到,这款产品的主控芯片采用的是智能家电领域32位MCU领军企业爱普特研发量产的全国产高可靠MCU产品APT32F1023。

从其芯片特性看,其具备工控级别温度,具备宽电压、高信噪比、高抗干扰、高可靠性等性能优势,另外为了便于客户上手,加速产品落地,爱普特还配套了完整的开发套件,如数据手册、软件驱动库、易用的开发工具、图形化调试工具、SDK组件等工具。APT32F1023除了可应用到筋膜枪等智能家电领域,还可广泛应用到工业控制,消费电子设备,物联网、可穿戴设备等领域。

来源:爱普特微电子

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 59

本文介绍如何使用带FIFO的串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法;之后介绍一种特殊的串口数据发送方法,可在避免使用串口发送中断的情况下,提高系统的响应速度。

1、概述

在此之前,先来列举一下传统串口数据收发的不足之处:

  • 每接收一个字节数据,产生一次接收中断。不能有效的利用串口硬件FIFO,减少中断次数。

  • 应答数据采用等待发送的方法。由于串行数据传输的时间远远跟不上CPU的处理时间,等待串口发送完当前字节再发送下一字节会造成CPU资源浪费,不利于系统整体响应(在1200bps下,发送一字节大约需要10ms,如果一次发送几十个字节数据,CPU会长时间处于等待状态)。

  • 应答数据采用中断发送。增加一个中断源,增加系统的中断次数,这会影响系统整体稳定性(从可靠性角度考虑,中断事件应越少越好)。

  • 针对上述的不足之处,将结合一个常用自定义通讯协议,提供一个完整的解决方案。

2、串口FIFO

串口FIFO可以理解为串口专用的缓存,该缓存采用先进先出方式。数据接收FIFO和数据发送FIFO通常是独立的两个硬件。

串口接收的数据,先放入接收FIFO中,当FIFO中的数据达到触发值(通常触发值为1、2、4、8、14字节)或者FIFO中的数据虽然没有达到设定值但是一段时间(通常为3.5个字符传输时间)没有再接收到数据,则通知CPU产生接收中断;发送的数据要先写入发送FIFO,只要发送FIFO未空,硬件会自动发送FIFO中的数据。写入发送FIFO的字节个数受FIFO最大深度影响,通常一次写入最多允许16字节。

上述列举的数据跟具体的硬件有关,CPU类型不同,特性也不尽相同,使用前应参考相应的数据手册。

3、数据接收与打包

FIFO可以缓存串口接收到的数据,因此我们可以利用FIFO来减少中断次数。以NXP的lpc1778芯片为例,接收FIFO的触发级别可以设置为1、2、4、8、14字节,推荐使用8字节或者14字节,这也是PC串口接收FIFO的默认值。

这样,当接收到大量数据时,每8个字节或者14个字节才会产生一次中断(最后一次接收除外),相比接收一个字节即产生一个中断,这种方法串口接收中断次数大大减少。将接收FIFO设置为8或者14字节也十分简单,还是以lpc1778为例,只需要设置UART FIFO控制寄存器UnFCR即可。接收的数据要符合通讯协议规定,数据与协议是密不可分的。通常我们需要将接收到的数据根据协议打包成一帧,然后交由上层处理。下面介绍一个自定义的协议帧格式,并给出一个通用打包成帧的方法。自定义协议格式如图3-1所示。

1.png

  • 帧首:通常是3~5个0xFF或者0xEE

  • 地址号:要进行通讯的设备的地址编号,1字节

  • 命令号:对应不同的功能,1字节

  • 长度:数据区域的字节个数,1字节

  • 数据:与具体的命令号有关,数据区长度可以为0,整个帧的长度不应超过256字节

  • 校验:异或和校验(1字节)或者CRC16校验(2字节),本例使用CRC16校验

下面介绍如何将接收到的数据按照图3-1所示的格式打包成一帧。

3.1 定义数据结构

    typedef struct 
{  
    uint8_t * dst_buf;                  //指向接收缓存  
    uint8_t sfd;                        //帧首标志,为0xFF或者0xEE  
    uint8_t sfd_flag;                   //找到帧首,一般是3~5个FF或EE  
    uint8_t sfd_count;                  //帧首的个数,一般3~5个  
    uint8_t received_len;               //已经接收的字节数  
    uint8_t find_fram_flag;             //找到完整帧后,置1  
    uint8_t frame_len;                  //本帧数据总长度,这个区域是可选的  
}find_frame_struct;

3.2 初始化数据结构,一般放在串口初始化中

    /** 
* @brief    初始化寻找帧的数据结构 
* @param    p_fine_frame:指向打包帧数据结构体变量 
* @param    dst_buf:指向帧缓冲区 
* @param    sfd:帧首标志,一般为0xFF或者0xEE 
*/  
void init_find_frame_struct(find_frame_struct * p_find_frame,uint8_t *dst_buf,uint8_t sfd)  
{  
    p_find_frame->dst_buf=dst_buf;  
    p_find_frame->sfd=sfd;  
    p_find_frame->find_fram_flag=0;  
    p_find_frame->frame_len=10;       
    p_find_frame->received_len=0;  
    p_find_frame->sfd_count=0;  
    p_find_frame->sfd_flag=0;  
}

3.3 数据打包程序

    /** 
* @brief    寻找一帧数据  返回处理的数据个数 
* @param    p_find_frame:指向打包帧数据结构体变量 
* @param    src_buf:指向串口接收的原始数据 
* @param    data_len:src_buf本次串口接收到的原始数据个数 
* @param    sum_len:帧缓存的最大长度 
* @return   本次处理的数据个数 
*/  
uint32_t find_one_frame(find_frame_struct * p_find_frame,const uint8_t * src_buf,uint32_t data_len,uint32_t sum_len)  
{  
    uint32_t src_len=0;  
    while(data_len--)  
    {  
        if(p_find_frame ->sfd_flag==0)                        
        {   //没有找到起始帧首  
            if(src_buf[src_len++]==p_find_frame ->sfd)  
            {  
                p_find_frame ->dst_buf[p_find_frame ->received_len++]=p_find_frame ->sfd;  
                if(++p_find_frame ->sfd_count==5)          
                {  
                    p_find_frame ->sfd_flag=1;  
                    p_find_frame ->sfd_count=0;  
                    p_find_frame ->frame_len=10;  
                }  
            }  
            else  
            {  
                p_find_frame ->sfd_count=0;   
                p_find_frame ->received_len=0;   
            }  
        }  
        else   
        {   //是否是"长度"字节? Y->获取这帧的数据长度  
            if(7==p_find_frame ->received_len)                
            {  
                p_find_frame->frame_len=src_buf[src_len]+5+1+1+1+2; //帧首+地址号+命令号+数据长度+校验       
                if(p_find_frame->frame_len>=sum_len)  
                {   //这里处理方法根据具体应用不一定相同  
                    MY_DEBUGF(SLAVE_DEBUG,("数据长度超出缓存!\n"));  
                    p_find_frame->frame_len= sum_len;       
                }  
            }  
              
            p_find_frame ->dst_buf[p_find_frame->received_len++]=src_buf[src_len++];                
            if(p_find_frame ->received_len==p_find_frame ->frame_len)                  
            {  
                p_find_frame ->received_len=0;              //一帧完成    
                p_find_frame ->sfd_flag=0;  
                p_find_frame ->find_fram_flag=1;                   
                return src_len;  
            }  
        }  
    }  
    p_find_frame ->find_fram_flag=0;  
    return src_len;  
}

使用例子:定义数据结构体变量:

    find_frame_struct slave_find_frame_srt;

定义接收数据缓冲区:

    #define SLAVE_REC_DATA_LEN  128
uint8_t slave_rec_buf[SLAVE_REC_DATA_LEN];

在串口初始化中调用结构体变量初始化函数:

    init_find_frame_struct(&slave_find_frame_srt,slave_rec_buf,0xEE);

在串口接收中断中调用数据打包函数:

    find_one_frame(&slave_find_frame_srt,tmp_rec_buf,data_len,SLAVE_REC_DATA_LEN);其中,rec_buf是串口接收临时缓冲区,data_len是本次接收的数据长度。

4、数据发送

前文提到,传统的等待发送方式会浪费CPU资源,而中断发送方式虽然不会造成CPU资源浪费,但又增加了一个中断源。在我们的使用中发现,定时器中断是几乎每个应用都会使用的,我们可以利用定时器中断以及硬件FIFO来进行数据发送,通过合理设计后,这样的发送方法即不会造成CPU资源浪费,也不会多增加中断源和中断事件。

需要提前说明的是,这个方法并不是对所有应用都合适,对于那些没有开定时器中断的应用本方法当然是不支持的,另外如果定时器中断间隔较长而通讯波特率又特别高的话,本方法也不太适用。公司目前使用的通讯波特率一般比较小(1200bps、2400bps),在这些波特率下,定时器间隔为10ms以下(含10ms)就能满足。如果定时器间隔为1ms以下(含1ms),是可以使用115200bps的。

本方法主要思想是:定时器中断触发后,判断是否有数据要发送,如果有数据要发送并且满足发送条件,则将数据放入发送FIFO中,对于lpc1778来说,一次最多可以放16字节数据。之后硬件会自动启动发送,无需CPU参与。下面介绍如何使用定时器发送数据,硬件载体为RS485。因为发送需要操作串口寄存器以及RS485方向控制引脚,需跟硬件密切相关,以下代码使用的硬件为lpc1778,但思想是通用的。

4.1 定义数据结构

    /*串口帧发送结构体*/  
typedef struct 
{  
    uint16_t send_sum_len;          //要发送的帧数据长度  
    uint8_t  send_cur_len;          //当前已经发送的数据长度  
    uint8_t  send_flag;             //是否发送标志  
    uint8_t * send_data;            //指向要发送的数据缓冲区  
}uart_send_struct;

4.2 定时处理函数

    /** 
* @brief    定时发送函数,在定时器中断中调用,不使用发送中断的情况下减少发送等待 
* @param    UARTx:指向硬件串口寄存器基地址 
* @param    p:指向串口帧发送结构体变量 
*/  
#define FARME_SEND_FALG 0x5A          
#define SEND_DATA_NUM   12  
static void uart_send_com(LPC_UART_TypeDef *UARTx,uart_send_struct *p)  
{  
    uint32_t i;  
    uint32_t tmp32;  
      
    if(UARTx->LSR &(0x01<<6))                      //发送为空  
    {         
        if(p->send_flag==FARME_SEND_FALG)  
        {                          
            RS485ClrDE;                             // 置485为发送状态  
              
            tmp32=p->send_sum_len-p->send_cur_len;  
            if(tmp32>SEND_DATA_NUM)                 //向发送FIFO填充字节数据  
            {  
                for(i=0;i<send_data_num;i++)  
                {  
                    UARTx->THR=p->send_data[p->send_cur_len++];  
                }  
            }  
            else  
            {  
                for(i=0;i<tmp32;i++)  
                {  
                    UARTx->THR=p->send_data[p->send_cur_len++];  
                }  
                p->send_flag=0;                      
            }  
        }  
        else  
        {  
            RS485SetDE;  
        }  
    }  
}  
</tmp32;i++)  
</send_data_num;i++)

其中,RS485ClrDE为宏定义,设置RS485为发送模式;RS485SetDE也为宏定义,设置RS485为接收模式。使用例子:定义数据结构体变量:

    uart_send_struct uart0_send_str;

定义发送缓冲区:

    uint8_t uart0_send_buf[UART0_SEND_LEN];

根据使用的硬件串口,对定时处理函数做二次封装:

    void uart0_send_data(void)
{
 uart_send_com(LPC_UART0,&uart0_send_str);
}

将封装函数uart0_send_data();放入定时器中断处理函数中;在需要发送数据的地方,设置串口帧发送结构体变量:

    uart0_send_str.send_sum_len=data_len;      //data_len为要发送的数据长度
uart0_send_str.send_cur_len=0;             //固定为0
uart0_send_str.send_data=uart0_send_buf;   //绑定发送缓冲区
uart0_send_str.send_flag=FARME_SEND_FALG;  //设置发送标志

来源:网络

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 375

PIC32CXMT包含单核、双核和系统级芯片(SOC)等三层器件,以提供最大的灵活性,简化智能仪表和通信基础设施的开发

随着不同的通信解决方案被集成到设计框架中,以及监管合规性要求的规定,智能仪表的设计复杂性也在不断增加。为了满足对开发功能丰富且简单的智能仪表设计方案的日益增长的需求,Microchip Technology Inc.(美国微芯科技公司)今日宣布推出配备全新MPL460电力线通信(PLC)调制解调器的PIC32CXMT系列32位单片机。这款新的单片机(MCU)器件是下一代智能仪表平台,适用于工业物联网、商业和工业仪表应用。该平台拥有最高可达200 MHz的运行性能和高达560 KB存储空间(SRAM)的广泛可扩展性。

2A8DpQTQjr.jpg

为了给开发人员提供扩展产品的最佳灵活性,PIC32CXMT系列包含基于Arm® Cortex®-M4F单个内核、Arm Cortex-M4双内核和系统级芯片(SoC)器件的三种型号。MPL460 PLC调制解调器集成了用于信号放大的线路驱动器,由于采用了D类拓扑结构,因而减少了物料清单,并保持了超过40%的顶级性能的信号注入效率。PLC调制解调器有助于提高效率和可靠性,基于输送到负载的功率和从电源中获取的功率,在传输过程中全面减少来自源头的消耗。

Microchip智慧能源业务部总监Kourosh Boutorabi表示:“新型PIC32CXMT单片机与MPL460 PLC调制解调器搭配使用,可提供无与伦比的可扩展性和性能,支持各种仪表架构。我们非常成功的第二代仪表产品表明,我们致力于提供丰富的系统级芯片(SoC)组合,以实现灵活安全的智能仪表平台,支持一流的计量设计以及领先的连接性。”

该平台提供多种收发器解决方案,包括无线电/PHYPLC/PHY以及PLC+RF混合解决方案。还有一个选项是计量和通信软件套件,符合美国国家标准协会(ANSI)和国际电工委员会(IEC)计量标准,精度可达 0.2% 级。它还支持G3-PLCPRIME等有线和无线通信标准。

随着智能仪表设备联网,安全性需求在任何设计中都至关重要。PIC32CXMT单片机提供标准和专有的片上硬件安全特性,以确保最佳性能和存储利用率。

开发工具

PIC32CXMT系列和MPL460调制解调器MicrochipMPLAB® Harmony v3嵌入式软件框架支持。其他资源包括IAR系统、ArmKeil开发环境、G3-PLCPRIME软件。

供货与定价

PIC32CXMT系列和MPL460目前提供数量有限的样品。如需了解更多信息,请联系Microchip销售代表。

  • 单核:SAM4CPIC32CXMT-G系列

  • 双核:PIC32CXMT-C系列

  • 系统级芯片:SAM4CMPIC32CXMT-SH系列

资源

可通过Flickr或联系编辑获取高分辨率图片(可免费发布):

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

围观 15

单片机软件延时时间控制

cathy的头像

一、简述

记--通过代码方式实现软件延时(不精确延时)。

二、指令周期

单片机需要一个时钟信号送给内部各个电路,才能使它们有节拍地协同工作。时钟信号的频率是由外部震荡电路的晶振频率决定的。

外接晶振的频率 = 时钟信号的频率 = 工作频率。(如24MHz,12MHz,11.0592MHz)

震荡周期:为单片机提供时钟脉冲的振荡源的周期。

震荡周期 = 1/晶振频率          (如晶振频率是12MHz时,振荡周期 = 1/12MHz = (1/12)us)

机器周期:51系列单片机的一个机器周期由12个震荡周期组成。

机器周期 = 12 * 振荡周期      

(如晶振频率是24MHz时,振荡周期 = 1/24MHz = (1/24)us,机器周期 = 12*(1/24)us = 0.5us)

(如晶振频率是12MHz时,振荡周期 = 1/12MHz = (1/12)us,机器周期 = 12*(1/12)us = 1us)

单片机的内存分配(变量的存储位置)详解

cathy的头像

对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(flash)、RAM(sram)启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。

嵌入式开发中,UART串口是最常见的一种通信接口,你知道为啥串口这么常见吗?本文就带你深入了解串口最底层的本质内容。

一、什么是串口通讯?

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。

典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。

“图1:串行通讯示数据传输意图"
图1:串行通讯示数据传输意图

二、串口通讯的通讯协议?

最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。

我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。

RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。

三、串口通讯的物理层

串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

“精华

在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

下图为DB9标准串口通讯接口:

“精华

DB9引脚说明:

“精华

上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。

“精华

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

四、波特率

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示;

“精华

比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。

收发波特率一致可以实现通讯:

“精华

收发波特率不一致,导致RX端不能正常接收:

“精华

五、串口通讯的数据结构

“精华

起始位: 起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。

数据位: 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。

奇偶校验位: 奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位: 停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

空闲位: 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

六、单双工通讯

单工: 数据传输只支持数据在一个方向上传输;

半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;

全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。

“精华

七、STM32中的串口通讯

STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。

“精华

对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。

但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接,二者的电平标准不同:

单片机的点评标准(TTL电平):+5V表示1,0V表示0;RS232电平标准:+15/+13V表示0,-15/-13表示1。

“精华

因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示。

“精华

来源:嵌入式资讯精选
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 44

页面

订阅 RSS - 单片机