单片机

之前为大家分享的《Cortex-M位带操作的原理》,虽然现在不常用位带操作了,但里面很多知识点值得学习和了解。

指针变量及例子

位带操作牵涉到的一个重要知识点就是指针变量。

这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。
指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》
指针变量的例子:

int main(void)
{
   uint32_t *p;

  p = (uint32_t *)(0x42210184);

  System_Initializes();
  while(1)
  {
    *p = 0;
    TIMDelay_Nms(500);

    *p = 1;
    TIMDelay_Nms(500);
  }
}

上面例子中给p指针变量赋的值是“0x42210184”,只是强制转换成(uint32_t *)这种指针类型。 

而*p = 0;代表该地址上的数据值为0;也就是上面说的该地址存放的数据为0; 

前面有一个朋友问过我关于指针变量的问题,看到这里,相信你应该知道使用指针变量,直接打印指针就可以判断指针是否越界。

指针变量---位带操作

上面代码中“0x42210184”代表STM32F103系列芯片中PA1的位带别名地址(就是映射过去的地址),截一个图,大家看看:

1.jpg

提示:上图中对p的赋值,其实是一样的(在STM32中),都是0x42210184。
结合公式理解:

之前文章《位带操作原理》列出了关于片上外设区计算公式:

AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4
对比截图中第一个p赋的值,就是片上外设的计算公式。

第二个p只是对代码优化了:“&”到“-”的优化,可以看编译器相关手册。
第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?
这样相比读出寄存器,再&或者|再写入寄存器的效率要高多啦?
位带别名区最低有效位

有朋友发现,*p = 0;这样操作对地址0x42210184(PA1输出)写入0,PA1输出低。假如我写入0x10,那么PA1输出多少呢?

答案:输出低。
原因在于:在位带区中,每个比特都映射到别名地址区的一个字只有 LSB 有效,也就是最低一位有效。

位带操作另一种宏定义

有通过之前的两个公式,可以推出下图的公式:

2.jpg

上面框起来的定义适合RAM和外设两种,假如定义一个LED为PA1,只需要将PA1相关参数传入即可。
LED另外一种定义:

#define LED BIT_ADDR((GPIOA_BASE + 12), 1)
这种定义需要注意:+12,其实是ODR相对GPIOA的基地址的偏移地址。
我曾在这里遇到的坑:我将STM32F1的移植到F4上,出现了问题,我找了半天才发现由于这个偏移地址不一样导致的。
STM32F1的ODR偏移是12,而F4的ODR偏移是20。所以,建议大家使用GPIOA->ODR这种方式。(不管是标准外设库还是HAL库都有这样定义)。

来源:strongerHuang

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

围观 12

一、前言

程序存储器(又称数据Flash),顾名思义,是用来存储用户的程序,使单片机能够按照编写的代码顺序执行,完成指定的任务。所以程序存储器是只读存储器(只读存储器),我们已经听过很多次了。

代码存储在程序存储器里面,一般有常数、表格、pi值、数码管形状、SCM ID号、内部参考信号源、关机唤醒定时器频率、IRC参数等数据。

注意: 单片机每次都是烧录程序,烧录就是为了把代码放到程序存储器中,而我们用的电脑则是把硬盘的数据和程序放到RAM,再用CPU去读取RAM里面的数据和程序。

二、存储器的存储单位与编址

存储信息的基本单位称存储元件,每个存储元件是一个二进制位,一位可存放一个二进制数0或1,每8位组成一个字节。

编址是为了方便我们存取存储器中的信息,我们需要给每个存储单元编号,即编址。

1. 存储单位

  • 位(bit):计算机的最小数据单位

  • 字节(Byte):1Byte = 8bits

  • 字(Word):1Word = 2Bytes = 16bits

2. 编址

51单片机的存储单元是一个字节,为了存取数据方便,每个存储单元都有编号,这个编号就是编址,编址采用二进制数。例如:0000 0010B可以代表第二个存储单元。

三、51单片机有哪些内部存储器

存储器是单片机的又一个重要组成部分,存储容量为256个单元的存储器结构中每个存储单元对应一个地址,256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。

存储器中每个存储单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。

1.片内RAM

RAM(Random Access Memory)又叫随机存取存储器,正常情况下不仅可以写入数据到RAM,也可以从RAM读取数据。

单片机内部总共有256Bytes的RAM。RAM的每一个字节都有编码,从0000 0000开始直到1111 1111,不同区域的RAM有着不同的功能。可以把RAM想象成一栋办公楼,不同的楼层有不同的部门,不同的部门自然干不同的活。

注意: 因为单片机一次只能处理8个bit的数据(字长为8),并且一个8位二进制数的范围是0到256,所以单片机一次能寻址的范围也就是0到256。

2.片内ROM

ROM(Read-OnlyMemory),又叫只读存储器,正常情况下只能从ROM读取数据,不能往写入数据。

单片机内部的ROM大小为4KB(4096Bytes),字节地址范围为000H~0FFFH。

在特殊条件下,可以把程序烧入到ROM中,所以ROM也叫程序存储器。

如果ROM的大小不够存入所有程序,也可以外接ROM。单片机最多可外接64KB的ROM。内部ROM和外部ROM是统一编址,要么就只用64KB的外部ROM,要么就用4KB的内部ROM+60KB的外部ROM(外部ROM的开头4KB闲置)。

3.外部数据存储器

外部数据存储器一般由静态 RAM 构成,其容量大小由用户根据需要而定,最大可扩展到 64KB RAM,地址是 0000H~0FFFFH。CPU 通过 MOVX 指令访问外部数据存储器,用间接寻址方式,R0 、R1 和 DPTR 都可作间接寄存器。

注意: 外部 RAM 和 扩展的 I/O接口是统一编址的,所有的外扩I/O 口都要占用 64KB 中的地址单元。

四、如何区分ROM和ROM

片内ROM和片外ROM的区分:在单片机既有片内ROM又有片外ROM时,会产生一部分重复的地址范围,为了解决区分片内和片外ROM的问题,51单片机设置了一根控制线EA(低电平有效),所以

EA = 0 => 有效 => 访问片内存储器

EA = 1 => 无效 => 片内存储器被忽略

本质的原理:就是当PC的值大于了某个值时将访问外部存储器,PC的值小于了某个值时将访问内部存储器。这个值由存储器容量的大小绝定,在8051单片机中,片内ROM = 4KB,所以当PC小于0FFFH时,访问片内ROM。

五、存储器数据读写说明

要对256字节存储器的每个存储单元进行读写,需要8根地址线和8根数据线,先送8位地址选中某个存储单元,再根据读控制或写控制,将选中的存储单元的8位数据从8根数据线送出,或通过8根数据线将8位数据存入选中的存储单元中。

当地址总线A7~A0将8位地址00011111(1FH)送入存储器时,会选中内部编址为1FH的存储单元,这时再从读控制线送入一个读控制信号,1FH 存储单元中的数据00010111从8根数据总线D7~D0送出。

六、总结

对于RAM和ROM,当我们写程序的时候,我们把程序误认为ROM,也就是说,我的某个逻辑形成了一系列的逻辑开关,但是当CPL进行操作的时候,在传输的过程中,交换逻辑需要不断的改变,所以RAM就诞生了。

但是由于技术的限制,RAM不能下电来保存逻辑,即电路中的每个硅电子都不能被保存,并且这个过程限制了内存的大小。因此,RAM和ROM是通过CPU总线连接的。

通过51单片机的RAM地址,ROM地址,可以看到,ROM存储程序,通过CPU传递数据,到RAM,而RAM是各个寄存器的集合,按ROM程序形成逻辑,响应CPU,同时传递给ROM信号(这里ROM的逻辑已不变,相当于与或非的各种开关)。

来源:嵌入式悦翔园(作者:JamesBin)

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

围观 26

近些年的MCU市场,8位单片机一直是这个领域的主力军之一,尽管随着物联网的发展,特别是近年来对智能化、高安全性、高可靠度等性能需求的提高, 32位MCU的占比有着些许的攀升。但8位单片机凭借其应用的简单灵活、安全稳定、成本优势等特点,在诸如手环、蓝牙耳机、校园卡等低功耗场景下都占据着绝对的使用比例;另外,在较复杂的白电场景中,例如电视机、空调、洗衣机,以及冰箱等一系列应用,也都有8位MCU的身影;并且在对速率要求较高,安全性要求有需求的场景下,比如医疗保健、数据处理、工业控制、通信等产业场景下,大量的数据也需要越来越多IO处理工作,这无形中也增加了对8位MCU的需求。

Microchip的8位单片机作为这个领域的翘楚,其PIC与AVR系列 MCU 作为这个区间的两种行业领先架构,有哪些技术上的独到技术和过人之处?本期视频,就请Microchip市场推广经理张荣宝 (Paul Zhang)老师带着大家一探究竟。

访谈嘉宾

1.jpg

张荣宝 (Paul Zhang),MCU8产品部市场推广经理

现于 MicrochipTechnology Inc.(美国微芯科技公司)上海分公司任市场推广经理,负责公司8位单片机产品的营销。他拥有10多年的嵌入式应用的研发经验和单片机 产品的推广经验。张荣宝于1996年毕业于山东科技大学,获得机械电子工程专业学士学位;于2007年获得复旦大学电子与通信工程专业的硕士学位。

点击观看


2.jpg

(图片来源:Microchip Technology Inc.)

更多相关设计资源,归纳如下

关于Microchip Technology

Microchip Technology Inc. 是领先的微控制器和模拟半导体提供商,为全球范围内数以千计的各类客户应用提供低风险产品开发、更低的总系统成本和更快的面市速度。Microchip 的总部位于亚利桑那州钱德勒市,提供杰出的技术支持,交付及时可靠,产品品质优异。

小编的话

作为全球最大的8位单片机供应商,Microchip致力于推动8位单片机的发展和应用。通过张荣宝先生的介绍和分析,想必大家对8位单片机何以仍然能够快速发展有了更为清晰的了解。您正在使用8位单片机开发哪些产品?您在应用AVR 和 PIC MCU 产品系列过程中有哪些心得和经验?欢迎分享和讨论。

来源:得捷电子DigiKey

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

围观 19

前言

在STM32之前,都是老大头51,带着它的“小弟们” MSP430、AVR、PIC在单片机界呼风唤雨。

那个时候,市场上遍布8位机,大学教材用51入门,个人、企业学单片机基本上也都在用51。虽然AVR也有一些8位机市场,但与stc带领下的51单片机是完全不能相比的。当然,这个时候也有16位机的msp430,其他厂家单片机还有pic,高端嵌入式处理器等市场有arm7、arm9等。这个时期的单片机市场是百花齐放、百家争鸣,但总体来说,还是势均力敌、一片祥和的。那么,这个局势是从什么时候开始打破的呢?这还得从物联网的崛起说起。 

原因

当时,物联网(Internet of Things,IoT)逐步进入人们的视野范围。随着它的发展,嵌入式领域对于高性能处理器的需求呈现爆发式增长。

虽然8位CISC(复杂指令)架构内核8051占据了半壁江山,但奈何其性能低下,寻址范围受限,已经难以适应更多的新兴应用领域。而32位架构微处理器内核凭借其极佳的执行效能,不仅能满足物联网对数据处理能力的要求,还能兼顾物联网的低功耗和高性能要求,斩获物联网市场的独家宠爱。在32位架构微处理器中,属ARM公司推出了面向各类嵌入式应用的微控制器核Cortex-M内核受到市场青睐,Cortex-M之于32位MCU就如同8051之于8位MCU。而正是Cortex-M的出现,让ST公司看到了这个内核的强大之处——利用该内核设计了大放光芒的STM32,打破了曾经的单片机局面。

崛起过程

如今,我们往回看那段历史,会发现一切改变都由那时发生——

从2007年6月11日推出第一代STM32产品——Cortex-M MCU STM32F1开始,单片机市场迎来了STM32新星,32位MCU浪潮,如期而至。

1.jpg

2.jpg

此后,芝麻开花节节高,STM32成功的故事也一直在延续。ST公司陆续在每一年都基于新的内核或者新的技术领域有所突破,发布超过了19个STM32 产品系列,包括一个MPU产品线,生产工艺也从180nm不断进阶到110nm、90nm和40nm。例如:

2009年推出了全球第一款超低功耗系列STM32 L1;

2010年推出了第一款在高性能的基于90纳米工艺、120 MHz 的STM32F2产品线;2011年推成第一款高性能Contex-M4的处理器STM32F4;

......

2019年推出全球最为强大的第一款双核处理器STM32MP1、最新一代混合信号Contex-M4 MCUs和世界上最大的MCU STM32H7;

2020年推出全球首颗内置LoRa收发器的SoC——STM32WL。

3.jpg

“一只南美洲亚马逊流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国德克萨斯州的一场龙卷风。”STM32这只小蝴蝶带来的改变效果也很明显。2007年ST公司的通用MCU全球排名还只是第11位,2015年便上升到第3位,2018年上升到第2位,2018年则在中国供应商的排名中ST公司一举拿下第一的高地,此后数年,ST的地位几乎无人撼动。

4.jpg

如何学习

入坑STM32后,我们应该如何学习?

如今,STM32堪称爆火,并且潜力无穷。所以,有很多人都在学STM32。

但STM32对入门者可能不是特别友好,因为知识很多,但是对于有一定开发经验的人来说,就是一把好兵器,它能帮你大大缩短开发周期。

那应该如何入坑STM32呢?

(1) 根据时间表定时定量学习

大学时期,都有实验室的学长学姐带着入门,安排任务。

比如,基本任务是一周内学完搭好环境、熟悉调试软件,结合《STM32Fxxx参考手册》、《STM32固件库使用手册》和光盘视频,实现基本篇的GPIO应用。

(2) 举一反三,并通过阶段任务检查学习效果

在学习例程时,可以尝试修改该例程的外设配置,达到举一反三的效果。

每一周,学长学姐会根据你的学习进度,安排给你一个阶段任务,用来检查你的学习效果。

如果你是自学,那么可以根据网上教程和各大资源网站上的“STM32入门小项目合集”,主动给自己找一个小项目,把它实现出来。

这里我推荐正点原子的资源,毕竟每次看视频时的片头曲“我的未来不是梦”让我对STM32充满激情,当然野火、小苗、普中也不错~

(3) 基本外设、功能会用就行,后期需要什么再去针对性地学

按部就班地把STM32知识从头到尾系统性地学习完,固然很好。但是,你要知道学习单片机只是为了解决问题,我们只要在遇到问题时,能够通过STM32解决就行。

因此,当你把基本外设、功能都差不多掌握了,程序能跑起来,并且也知道哪里可以修改、修改成什么就已经基本入门了。

此后,你可以通过一些大大小小项目,巩固理解和探索新功能,你的经验也随之增加。

(4) 学好C语言,可以学着画PCB制板、焊接

软件和硬件都要两手抓。C语言对于STM32的学习至关重要,C语言不好,还跑什么代码?学会画板子、焊板子,这样有什么需求,都可以自己添加。

当然,上面的建议都是给0基础的STM32入门者,若是你有一定基础,那当然是对症下药,哪里不会补哪里。

学海无涯,勇于探索新技术

“学海无涯、永无止境”,更何况是每一年都在推陈出新的STM32。

事实上,STM32 的开发方式已经发生了很大的变化。

比如:

2014 年,ST 公司推出了 HAL 库和 MCU 图形化配置软件STM32CubeMX。

2017 年年底,ST 公司收购了 Atollic 公司,把专业版 TrueSTUDIO 转为免费软件。

2019 年 4 月,ST 公司正式推出了自己的 STM32 程序开发 IDE 工具软件 STM32CubeIDE1.0.0,打造了一个完整的 STM32Cube 生态系统。

而STM32Cube 生态系统已经完全抛弃了早期的标准外设库,STM32 系列 MCU 都提供 HAL固件库以及其他一些扩展库。

STM32Cube 生态系统的两个核心软件是STM32CubeMX 和STM32CubeIDE,且都是由 ST 官方免费提供的。

使用 STM32CubeMX 可以进行 MCU 的系统功能和外设图形化配置,可以生成STM32CubeIDE 项目框架代码,包括系统初始化代码和已配置外设的初始化代码。

如果用户想在生成的 STM32CubeIDE 初始项目的基础上添加自己的应用程序代码只需把用户代码写在代码沙箱段内,就可以在 STM32CubeMX 中修改 MCU 设置,重新生成代码,而不会影响用户已经添加的程序代码。

由此看来,使用STM32CubeMX 和 TrueSTUDIO 进行STM32 开发是一个良好的组合方式!

本文直接来源:嵌入式资讯精选

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

围观 28

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)。

围观 39

其实,单片机就是个小计算机。大计算机少不了的数据存储系统,单片机一样有,而且往往和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)。

围观 57

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

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

筋膜枪开箱

产品外观展示

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)。

围观 31

本文介绍如何使用带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)。

围观 103

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

围观 12

页面

订阅 RSS - 单片机