AT32 MCU

CAN概述

CAN是Controller Area Network的缩写(以下称为CAN),它的设计目标是以最小的CPU负荷来高效处理大量的报文。1986年德国电气商BOSCH公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

CAN协议特点:

  • 多主控制:
    在总线空闲时,所有节点均可发送信息。如果出现两个及以上节点同时开始发送信息时,总线会根据标识符(Identifier以下称为ID)进行仲裁,ID越小则优先级高,则仲裁优胜,仲裁优胜的节点继续发送,仲裁失利的节点立即转入接收状态。需注意,ID并不是表示节点地址,而是指示所发送的报文的优先级。
  • 系统的灵活性:
    如上所述,与CAN总线的各节点没有类似于“地址”的信息。因此在总线上增减节点时,连接在总线上的其它节点的软硬件设计均不受影响。
  • 高可靠性:
    CAN协议具有错误检测、错误通知、故障封闭和错误恢复功能。CAN总线上的任意节点均可检测错误(错误检测);检测到错误后向总线发送错误帧以通知其他节点(错误通知);同时每个节点内部有一个错误计数功能,每次检测到错误之后,错误计数值累加,当某节点持续错误导致计数连续累加,直到大于256后,此故障节点从总线上断开,避免影响其他节点(故障封闭)。且发送节点如果在发送信息的过程中检测到错误,待错误结束后会自动重发此信息直到成功发送(错误恢复)。
  • 通信速度较快,通信距离远:
    最高1Mbps(距离小于40m),最远可达10km(速率低于5Kbps)。
  • 可连接节点多:
    CAN总线是可同时连接多个节点。节点数量理论上是没有限制的。但实际上节点数量受总线时间延迟及电气负载的限制。降低通信速度,可连接的节点数增加;提高通信速度,则可连接的节点数减少。

正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。本文例程使用的是1Mbps的通信速率,使用的是ISO11898标准。

CAN协议介绍

本章主要介绍CAN的网络拓扑结构、总线物理层特性、帧类型、帧结构、位填充机制、位格式、同步机制、仲裁机制、错误处理机制等。另外还有CAN协议的更多细节请参考BOSCH CAN协议,本文不再详述。

CAN网络拓扑结构

如下图1:CAN总线由两条差分线CANH和CANL组成,各个节点通过较短的支线接入CAN总线。各节点从通信协议而言是没有主从和地址区分的,每个节点均可以平等的收发数据。另外,在CAN总线的两端各有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

1.png

图1 CAN网络拓扑结构

CAN总线物理层特性

如下图2:显性电平对应逻辑“0”,CANH和CANL压差2.5V左右。而隐性电平对应逻辑“1”,CANH和CANL压差为0V。在总线上,显性电平具有优先权,只要有一个节点输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的节点都输出隐性电平,总线上才为隐性电平。

2.png

图2 CAN总线电平特性

帧类型

如下表1,CAN包含了以下5种帧类型。其中数据帧和远程帧由用户控制收发;错误帧、过载帧和间隔帧是CAN总线上各节点硬件根据对应状态发送,用户不能也无需控制。

3.png

表1 CAN帧类型

如下图3,包含了各类型帧结构示意。

4.png

图3 CAN各帧类型

帧结构

本文仅对标准数据帧进行详细介绍,其他帧类型可参考图3与标准数据帧进行对比理解。

一帧标准数据帧包含如下部分:

帧起始:为1bit显性位。由于CAN总线空闲时是隐性电平,帧起始的显性位用于提示总线上的节点“一帧信息传输开始了”。

仲裁段:表示该帧优先级的段,包含标识符和帧类型(数据/远程帧)。

控制段:表示数据的字节数、标识符类型(标准/扩展标识符)及保留位的段。

数据段:数据,一帧可发送0~8个字节的数据(数据长度根据控制段的DLC决定)。

CRC段:发送节点将CRC计算区域(不包含填充位)进行CRC计算后放入CRC段发送。接收节点也对CRC计算区域进行CRC计算,并与收到的CRC域进行对比,若CRC对比结果有误则向总线发送错误帧,若对比结果正确则随后发送应答。

ACK段:含应答位(ACK SLOT)和应答间隔符(ACK DELIMITER)。发送节点在ACK段均发送隐性电平;接收节点如果在接收过程中没有检测到错误,则在应答位输出1bit显性电平,以通知发送节点“这帧数据被正确的接收了”。

帧结束:表示数据帧结束的段,为7bit隐性电平。

5.png

图4 CAN标准数据帧

位填充

由于CAN总线只有CANH/CANL两条差分线,没有CLK线来做同步,所以CAN是直接通过数据流中间的跳变沿来做同步的(参考下文同步机制)。而为了避免数据流中出现大段没有跳变沿的情况,CAN加入了“位填充”机制。

即发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入一相反电平的填充位。例如,原始数据流为“0000000111110001…”,经过位填充后实际输出到CAN总线的数据流为“000001001111100001…”,加下划线的位即为填充位。

位填充的范围为帧起始(SOF)~CRC域(不含CRC间隔符),参考上图4。

位格式

AT32的CAN一个bit可分为3段:

  • 同步段(SYNC_SEG)
  • 位段1(BIT SEGMENT 1),包括CAN标准里的PROP_SEG和PHASE_SEG1,记为BSEG1。
  • 位段2(BIT SEGMENT 2),即CAN标准里的PHASE_SEG2,记为BSEG2。

这些段又由Time Quantum(以下称为Tq)的最小时间单位构成。

1位分为3个段,每个段又由若干个Tq构成,这称为位时序。

1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。用户通过设定位时序和Tq长度来设定CAN的波特率和采样点。关于波特率和采样点设置,后文详细介绍。

各段作用及AT32的CAN可配置的Tq数见下表2:

6.png

表2 位的各段的作用

如下图5,同步段、位段1和位段2组成一个bit。BSEG1和BSEG2段交界处为采样点,即接收节点采样的时间点。

7.png

图5 位时序

同步机制

硬同步(HARD SYHCHRONIZATION):

硬同步后,内部的位时间从同步段重新开始。因此,硬同步强迫由硬同步引起的沿处于重新开始的位时间同步段之内。即下图6的理想跳变沿情况。

重新同步跳转宽度(RESYHCHRONIZATION JUMP WIDTH):

重新同步的结果,使位段1增长,或使位段2缩短。位段增长或缩短的数量有一个上限,此上限由重新同步跳转宽度给定。重新同步跳转宽度应设置于1~4Tq之间。

如下图6:

当在BSEG1段检测到下降沿,则BSEG1段增长Tdelay,当前bit整体增长Tdelay,其中Tdelay<=重新同步跳转宽度。

当在BSEG2段检测到下降沿,则BSEG2段缩短Tadvance,当前bit整体缩短Tadvance,其中Tadvance<=重新同步跳转宽度。

8.png

图6 重同步跳跃

仲裁机制

只要总线空闲,任何单元都可以开始发送报文。如果2个或2个以上的单元同时开始传送报文,那么就会有总线访问冲突。通过对ID进行逐位仲裁可以解决这个冲突。仲裁的机制确保了报文和时间均不损失。当具有相同ID的数据帧和远程帧同时初始化时,数据帧优先于远程帧。仲裁期间,每一个发送节点都对发送位的电平与被监控的总线电平进行比较。如果电平相同,则这个节点可以继续发送。如果发送的是一“隐性”电平而监测到是一“显性”电平(见总线电平),那么该节点就失去了仲裁,必须立即退出发送状态并转入接收状态。

例如下图7,节点1和节点2同时发送一帧数据,ID段前几bit相同。直到红色处,节点1发送隐性电平“1”,节点2发送显性电平“0”。此时节点2仲裁优胜,继续发送,总线电平和节点2发送值一致;而节点1仲裁失利,在下一bit转入接收,后续节点1的发送引脚保持隐性电平。

9.png

图7 仲裁机制

错误处理机制

错误类型

CAN协议定义了以下5种不同的错误类型:

  • 位错误(Bit Error)
    单元在发送位的同时也对总线进行监视。如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误。AT32将位错误细分为显性位错误(发送显性位但检测到隐性位)和隐性位错误(发送隐性位但检测到显性位)。CAN节点在发送状态会出现此类错误。
    但是在仲裁场(ARBITRATION FIELD)的填充位流期间或应答间隙(ACK SLOT)发送一“隐性”位的情况是例外的——此时,当监视到一“显性”位时,不会发出位错误。当发送器发送一个被动错误标志但检测到“显性”位时,也不视为位错误。
  • 位填充错误(Stuff Error)
    如果在使用一帧报文的位填充区域(参考图4的“位填充区域”)检测到6个连续相同的位电平时,将检测到一个位填充错误。CAN节点在接收状态会出现此类错误。
  • CRC错误(CRC Error)
    CRC序列包括发送器的CRC计算结果。接收器计算CRC的方法与发送器相同。如果计算结果与接收到CRC序列的结果不相符,则检测到一个CRC错误。CAN节点在接收状态会出现此类错误。
  • 格式错误(Form Error)
    当一个固定形式的位场含有1个或多个非法位,则检测到一个格式错误。例如在CRC间隔符/ACK间隔符的位场检测到显性位,则会检测到格式错误。例外:接收器的帧末尾最后一位期间的显性位不被当作帧错误。CAN节点在接收状态会出现此类错误。
  • 应答错误(Acknowledgment Error)
    只要在应答位(ACK SLOT)期间所监测的位不为“显性”,则发送器会检测到一个应答错误。CAN节点在发送状态会出现此类错误。

错误状态

CAN节点检测到错误之后,根据不同状态和错误类型会对发送错误计数器(TEC[7:0])/接收错误计数器(REC[7:0])进行加1或加8(具体增加规则请参考BOSCH CAN协议),每正确的发送/接收一帧数据后,发送/接收错误计数器减1。因此发送/接收错误计数器值表明了CAN节点和网络的稳定程度。根据发送/接收错误计数器值,一个节点的状态会处于以下三种之一:

  • 错误主动
    “错误主动”的节点可以正常地参与总线通讯并在错误被检测到时发出主动错误标志(6个显性位)。见下图8,TEC<128且REC<128即为错误主动状态。
  • 错误被动
    “错误被动”的节点可参与总线接收和发送数据/远程帧。但检测到错误时只能发送错误被动标志(6个隐形位)。见下图8,255≥TEC>128且255≥REC>128即为错误被动状态。
  • 离线
    “离线”的节点相当于直接从CAN总线断开,不能收/发任何信息。见下图8,TEC>255即为离线状态。

AT32离线管理:AT32 CAN从离线状态恢复分两种情况:

1)当CAN主控制寄存器(CAN_MCTRL)AEBOEN位为‘0’时,需要软件请求进入冻结模式,再请求退出冻结模式,然后在通信模式下等待CAN节点RX检测到128次11个连续隐性位,随后该节点会从离线状态恢复。

2)当AEBOEN位为‘1’时,通信模式下CAN节点RX检测到128次11个连续隐性位,就自动从离线状态恢复。

10.png

图8 错误状态

AT32的CAN

AT32的CAN支持标准CAN协议2.0A和2.0B。且在兼容标准CAN协议的基础上增加了一些功能和可配置选项。其中CAN 2.0A和2.0B的主要差别在于:CAN 2.0A仅支持11bit ID,即只支持标准帧;CAN 2.0B支持11bit/29bit ID,即支持标准帧和扩展帧。

本章节主要介绍AT32 CAN的主要设计结构和使用,介绍了AT32 CAN的正常通信流程,包括发送流程、接收流程、报文过滤、波特率及采样点设置等。其他AT32 CAN相关设计,例如错误管理、中断管理等,请参考RM相关章节。

整体功能介绍

随着CAN网络节点和报文数量的增加,需要一个增强的过滤机制处理各种类型的报文,减少接收报文的处理时间,采用FIFO的方案,使得CPU可以长时间处理应用层任务而不会丢失报文。同时发送报文由硬件控制发送优先级顺序。基于以上考虑,CAN控制器提供28组位宽可配置的标识符过滤器组,2个接收FIFO,每个FIFO都可以存放3个完整的报文。共有3个发送邮箱,发送调度器决定发送优先级顺序。整个收发过程完全由硬件管理,无需占用CPU资源。

11.png

图9 AT32 CAN整体功能介绍

CAN发送流程

CAN发送流程见下图10和以下的步骤:

用户使用时只需操作1)~3)。4)~7)由硬件自动完成,无需用户代码参与,不占用CPU资源。

1)程序选择1个空置的邮箱(发送邮箱空标志TMxEF=1)

2)将需要发送的报文写入对应的空邮箱。报文内容包含:ID、帧类型、数据长度和发送数据等

3)请求发送:将CAN_TMIx的TMSR位置1

4)邮箱挂号(等待成为最高优先级)

5)预定发送(等待总线空闲)

6)发送

7)邮箱空置

注:以上步骤1)~7)只简单介绍正常发送流程,下图10中还包含取消发送、发送失败、自动/不自动重传等情况,可参考RM文件报文发送一节,这里不再详述。

下图10中标志位和操作位说明如下:

TMxTCF:请求完成标志位(发送/中止请求)

TMxTSF:发送成功标志位

TMxEF:发送邮箱空标志位

TMSR:请求发送

TMxCT:中止发送

PRSFEN:禁止自动重传(PRSFEN=1时,禁止自动重传;PRSFEN=0时,自动重传直到发送成功)

12.png

图10 CAN发送流程

CAN接收流程

CAN常用接收流程如下,即下图11的“空”和“挂号_1”两个状态间循环:

1)FIFO空

2)收到有效报文

3)进入“挂号_1”状态(FIFO内有1条有效报文的状态)

4)读取有效报文:读取接收邮箱寄存器(CAN_RFIx,CAN_RFCx,CAN_RFDTLx,CAN_RFDTHx)。

5)释放邮箱:CAN_RFx寄存器RFxR位置1。

注:用户使用时只需操作4)~5)。1)~3)由硬件自动完成,无需用户代码参与,不占用CPU资源。

有效报文:

当报文被正确接收(直到EOF域的最后一位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。过滤器相关介绍见下一节。

而如果接收过程中用户不参与操作(即不去读取有效报文和释放邮箱),硬件流程如下:

1)收到有效报文

2)进入“挂号_1”状态(FIFO内有1条有效报文的状态)

3)收到有效报文

4)进入“挂号_2”状态(FIFO内有2条有效报文的状态)

5)收到有效报文

6)进入“挂号_3”状态(FIFO内有3条有效报文的状态)

7)收到有效报文

8)进入“溢出”状态(FIFO内有3条有效报文,丢失了一条报文,溢出标志置起)

下图11中标志位和操作位说明如下:

RFxMN:FIFO内有效报文数量(取值0~3)

RFxOF:溢出标志位

RFxR:释放邮箱

13.png

图11 CAN接收流程

过滤器

在CAN协议里,报文的ID不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据ID的值决定软件是否需要该报文;如果需要,就存到接收FIFO里,用户可通过软件读取接收邮箱寄存器获取该报文;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,AT32 CAN控制器为应用程序提供了28个硬件过滤器组(AT32F435系列有28个过滤器组,0~27;但AT32F403A等系列只有14个过滤器组,0~13。具体请参考相应型号的RM),以便只接收那些软件需要的报文。用户配置好需要的ID后,整个过滤过程无需软件参与,不占用CPU资源。

过滤器的位宽

每个过滤器组由2个32bit的寄存器,CAN_FiFB1和CAN_FiFB2组成。通过配置CAN_FBWCFG寄存器的FBWSELx位,可以设置2个16位宽或者1个32位宽的过滤器。

32位宽的过滤器寄存器CAN_FiFBx包括:一组SID[10:0]、EID[17:0]、IDT和RTR位。

16位宽的过滤器寄存器CAN_FiFBx包括:两组SID[10:0]、IDT、RTR和EID[17:15]位。

过滤器模式

通过设置CAN_FMCFG寄存器的FMSELx位可以设置过滤器寄存器工作在标识符掩码模式或者标识符列表模式,掩码模式用来指定ID的哪些位需要与预设ID相同,哪些位无需比较,列表模式表示ID的每个位都必须与预设ID一致。

两种模式与过滤器位宽配合使用,可以有以下四种过滤方式:

14.png

图12 32位宽标识符掩码模式

15.png

图13 32位宽标识符列表模式

16.png

图14 16位宽标识符掩码模式

17.png

图15 16位宽标识符列表模式

更多CAN过滤器说明,例如CAN过滤器匹配序号,优先级规则等可参考RM文件报文过滤一节,这里不再详述。过滤器配置流程见后文案例介绍--CAN接收过滤器使用。

CAN波特率及采样点计算

如前文CAN位格式一节所述,CAN的一个bit被分为几段。其中第一段同步段(SYNC_SEG)固定为1Tq,1Tq的长度由CAN位时序寄存器(CAN_BTMG)的分频系数BRDIV[11:0]位定义;位段1(BSEG1)通过配置CAN位时序寄存器的BTS1[3:0]位,可设定为1~16Tq;位段2(BSEG2)通过配置CAN位时序寄存器的BTS2[2:0]位,可设定为1~8Tq。用户通过配置CAN时序寄存器,可设置CAN波特率和采样点,整个CAN总线上各节点的波特率和采样点一致最佳,不过由于各节点主频可能不一样,所以比较难保证波特率和采样点均一致。用户使用时应首先保证波特率一致,采样点尽量保持在较小的偏差范围内,这样CAN总线可以支持更多的节点和更长的线路。

波特率计算公式

其中

18.png

例如,bsp例程project\at_start_f437\examples\can\communication_mode:

APB时钟:APB1_CLK=144MHZ

CAN分频系数:BRDIV=12

此时1Tq=1/(144MHZ/12)=(1/12)us

同步段:SYNC_SEG=1Tq(固定不变,无需用户配置)

位段1:BSEG1=8Tq(BTS1[3:0]=7)

位段2:BSEG2=3Tq(BTS2[2:0]=2)

此时Nomal Bit Timimg=1Tq*(SYNCSEG+BSEG1+BSEG12)=1us

此时BaudRate=1/(Nomal Bit Timimg)=1/1us=1Mbps

采样点计算公式

sample point=(SYNC_SEG+BSEG1)/(SYNC_SEG+BSEG1+BSEG12)

举例同上:

此时sample point=(1+8)/(1+8+3)=75%

关于采样点设置,CAN协议并没有明确规定,但根据各厂商CAN设备使用习惯,采样点设置建议如下

表3:

19.png

表3 采样点设置建议

波特率计算工具

为方便用户波特率设定,本文介绍一个AT专用波特率计算工具:

20.png

使用步骤如下:

1) 波特率设定:高速CAN波特率最大为1M,各厂商CAN设备常用波特率为125K、250K、333K、500K、1M等。用户可根据需要设定波特率。参考下图16“波特率(Kbit/S)”。

2) CAN时钟源频率设定:参考下图16“PCLK1(MHZ)”。

3) 采样位置设置:设置完波特率后,计算工具会自动填入一个推荐的采样位置值。若实际项目中无具体限定,可保持默认设定;若项目中有具体限定,根据需求更改即可。参考下图16“采样位置(%)”。

4) 波特率偏差设定:建议在不勾选“允许波特率偏差”项,仅在没有符合要求的计算结果时,再勾选此项。由于同一CAN网络的节点波特率有误差会增大通信错误几率,建议“偏差”值设置尽量小。参考下图16“允许波特率偏差”和“偏差”。

5) 波特率配置结果选择:根据以上设定即可计算出多组结果。在页面左下角选择一项计算结果,即会在页面右下角显示对应软件代码配置,点击“复制全部”即可获得对应代码。

21.png

图16 波特率配置工具

案例1 CAN正常通信-normal模式

注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。

功能简介

实现两个CAN节点之间收发通信。

资源准备

1) 硬件环境:

两套对应产品型号的AT-START BOARD+CAN电平转化器

程序设计以bsp demo为例:

CAN1_TX(PB9)连接电平转换器的TXD;

CAN1_RX(PB8)连接电平转换器的RXD;

两个CAN节点的电平转换器的CANH和CANL分别相连。

CAN电平转换器硬件设计可参考下图:

22.png

图17 CAN电平转换器硬件设计

2) 软件环境:

project\at_start_f435\examples\can\communication_mode

软件设计

1) 配置流程

  • 配置CAN1 TX和RX pin对应的GPIO引脚
  • 配置CAN基础选项
  • 配置CAN波特率
  • 配置CAN过滤器
  • 配置CAN中断

2) 代码介绍

  • main函数代码描述

23.png

  • CAN配置函数代码描述

24.png

  • CAN发送函数代码描述
25.png
  • CAN接收中断函数代码描述
26.png
  • GPIO配置函数代码描述
27.png

实验效果

  • 如若数据传输无误,两块AT-START BOARD的LED2均会闪烁以指示收到ID=0x400的标准帧数据;LED4会持续闪烁以指示程序正常运行。

案例2 CAN接收过滤器使用

注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。

功能简介

实现报文过滤:接收需要的报文,丢弃不需要的报文。

资源准备

1) 硬件环境:

两套对应产品型号的AT-START BOARD+CAN电平转化器

程序设计以bsp demo为例:

CAN1_TX(PB9)连接电平转换器的TXD;

CAN1_RX(PB8)连接电平转换器的RXD;

两个CAN节点的电平转换器的CANH和CANL分别相连。

CAN电平转换器硬件设计可参考下图:

28.png

图18 CAN电平转换器硬件设计

2) 软件环境:

project\at_start_f435\examples\can\filter

软件设计

1) 配置流程

  • 配置CAN1 TX和RX pin对应的GPIO引脚
  • 配置CAN基础选项
  • 配置CAN波特率
  • 配置CAN过滤器
  • 配置CAN中断
2) 代码介绍
  • 设定可通过过滤的ID
29.png
  • main函数代码描述
30.png
  • CAN配置函数代码描述
31.png
  • CAN发送函数代码描述

32.png
  • CAN接收中断函数代码描述
33.png
  • GPIO配置函数代码描述

34.png

实验效果

  • 如若数据传输无误,AT-START BOARD的LED2/3/4会翻转一次,以指示收到ID=FILTER_EXT_ID1,FILTER_EXT_ID2,FILTER_STD_ID1,FILTER_STD_ID2的4帧数据。

案例3 CAN调试-loopback模式

注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。

功能简介

实现单板的环回模式通信。

环回模式(loopback mode):

环回模式可用于自测试。在环回模式下,CAN在内部把TX输出回馈到RX输入上,而完全忽略CAN_RX引脚的实际状态。因此此模式下CAN对应的GPIO引脚可以不配置,而如果对应的GPIO引脚配置了,发送的报文可以在CAN_TX引脚上检测到。见下图19。另外,为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。

平转换器硬件设计可参考下图:

35.png

图19 CAN loopback模式

资源准备

1) 硬件环境:

一块对应产品型号的AT-START BOARD

2) 软件环境:

project\at_start_f435\examples\can\loopback_mode

软件设计

1) 配置流程

  • 配置CAN1 TX和RX pin对应GPIO(loopback模式下,此项可忽略不配置)
  • 配置CAN基础选项
  • 配置CAN波特率
  • 配置CAN过滤器
  • 配置CAN中断
2) 代码介绍
  • main函数代码描述
36.png
  • CAN配置函数代码描述
37.png
  • CAN发送函数代码描述
38.png
  • CAN接收中断函数代码描述
39.png
  • GPIO配置函数代码描述
40.png
实验效果
  • AT-START BOARD的LED2会闪烁以指示收到自己发送的ID=0x400的标准帧数据;LED4会持续闪烁以指示程序正常运行。

来源:AT32 MCU 雅特力科技

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

围观 22

AT32 USB主机协议库

这部分主要介绍AT32 USB主机库的结构和库的使用方法,AT32 USB支持全速和低速,不支持USB2.0高速设备。这里库的作用是用来管理USB外设和实现USB的基本协议,使开发者能够更快的上手开发。

USB主机库包含以下几个模块 如图1:

  • 用户应用程序

此部分为开发者根据应用具体需求开发应用程序。

  • USB Core Driver和USB主机类

USB Core Driver:此部分实现USB设备标准协议栈,标准请求等接口。

USB主机类:此部分实现具体USB主机请求。

  • USB主机硬件底层接口

此部分实现硬件寄存器抽象接口

  • USB/OTG外设

1.png

图1. USB主机库结构

AT32 USB库文件

如下是AT32 USB应用工程结构图:

2.png

图2. AT32工程结构

Core Driver库路径:OTGFS-->middlewares\usb_drivers

Host Class库路径:middlewares\usbh_class

如下是USB主机库文件列表:

3.png

表1. USB主机库文件列表

4.png

表2. USB主机类文件列表

USB主机库文件说明

USB库实现USB主机枚举标准请求,同时实现USB规格里面的4种传输类型(control,interrupt,bulk,isochronous)的函数接口。

5.png

图3 USB主机库文件结构

USB主机文件函数接口

usbh_int.c函数接口

usbh_int.c主要处理底层中断,包括设备连接,设备断开等。

6.png

表3 usbh_int函数接口

usbh_core.c函数接口

usbh_core.c此文件封装不同的usb主机函数接口用于不同的地方调用,包括一些接收,发送函数等。

7.png

表4 usbh_core函数接口

usbh_ctrl.c函数接口

usbh_ctrl.c此文件处理USB主机枚举过程中的一些标准请求。

8.png

表5 usbh_ctrl函数接口

支持的标准设备请求如下表:

9.png

表6 标准设备请求

usbh_xx_class.c函数接口

usbh_xx_class.c此文件为具体主机类型的数据处理,通过结构体函数来实现不同主机类型数据的处理。开发者根据不同的主机类型,来实现下面函数结构体中的函数,达到不同应用结果。

函数结构体如下:

10.png

表7 主机class函数结构体

11.png

表8 主机class函数接口

usbh_user.c函数接口

usbh_user.c此文件主要为一些给用户处理事件的函数如复位,断开连接等。

12.png

表9 用户事件函数结构体

13.png

表10 用户函数接口函数

其它参数函数

的参数结构体如下,USB主机库中参数传递使用结构体usbh_core_type,如下图:

14.png

图4 全局结构体

USB主机的状态机如下图:

15.png

图5 USB主机状态机

USB返回值,USB函数接口使用如下函数返回值。

16.png

图6 函数返回值

通道FIFO分配

USB主机要正常收发数据,在初始化时需要为通道分配FIFO,分配给所有通道FIFO大小的和不能超过系统分配给USB缓冲区的最大长度,具体USB的缓冲区大小参考RM上的描述。

开发者可以参考例程usb_conf.h为通道自定义分配FIFO。
OTGFS主机通道FIFO分配

主机模式下,所有通道共享一个接收FIFO,通道发送FIFO分为非周期性发送FIFO和周期性发送FIFO。注意usb_conf.h中对端点分配的FIFO大小单位为word(Byte)。

以hid_demo例程为例:

17.png

USB主机初始化

在使用USB主机功能时,需要对USB的寄存器做一些基本的初始化,通过调用USB主机的初始化函数完成这部分的操作。
OTGFS外设初始化

OTGFS初始化函数usbd_init包含5个参数:

18.png

例程主机hid_demo的初始化如下:

19.png

USB主机中断处理

USB主机中断入口函数usbh_irq_handler处理所有USB主机中断,包括连接状态,通道收发数据,SOF,唤醒等中断,下面介绍一些典型的中断处理。

20.png

图7 USB主机中断处理函数

通道中断处理

当USB主机与设备进行通信时,通道的收发状态都在通道中断中处理,通道的方向分为IN和OUT通过通道寄存器中的方向为进行判断。

中断处理函数:usbh_hch_handler

代码如下:

21.png

Wakeup 中断处理

当USB主机在挂起状态时,检测到设备触发的远程唤醒信号,将产生此中断。此中断会将当前主机状态改为WAKEUP状态:

中断处理函数:usbh_wakeup_handler

代码如下:

22.png

接收FIFO非空中断

此中断表示当前接收FIFO有数据,应用程序通过此中断读出接收到的数据,并存放到对应通道的FIFO当中,当数据读取完成之后,会产生对应的通道的中断。

中断处理函数:usbh_rx_qlvl_handler

代码如下:

23.png

主机端口中断处理

当USB主机断开发生状态改变时,会产生端口中断,应用程序通过此中断判断连接设备的速度等。

中断处理函数:usbh_port_handler

24.png

设备断开连接中断处理

当连接的设备断开是,会产生断开连接中断。

中断处理函数:usbh_disconnect_handler

代码:

25.png

USB主机枚举处理

USB主机状态机在usbh_loop_handler函数中处理,对应的主机状态机uhost->global_state,如下图是设备连接到主机的状态处理流程:

26.png

图8 设备连接状态机流程

  • USBH_IDLE:当USB启动或者设备断开连接之后在此状态

  • USBH_PORT_EN:USB主机端口使能之后在此状态

  • USBH_ATTACHED:USB设备连接稳定之后

  • USBH_ENUMERATION:USB设备标准的枚举流程

  • USBH_USER_HANDLER:枚举完成之后,调用主机类的初始化函数

  • USBH_CLASS_REQUEST:主机类初始化完成之后,进行主机类请求

  • USBH_CLASS:所有枚举完成,进行正常的数据处理。

USB主机枚举流程

当设备接到主机之后,通过控制端点(端点0)进行枚举动作,USB主机的枚举状态如下:

27.png

如下是主机枚举的状态机流程:

28.png

图9 USB主机枚举流程

  • ENUM_GET_MIN_DESC:获取8字节设备描述

  • ENUM_GET_FULL_DESC:获取18字节设备描述

  • ENUM_SET_ADDR:设置设备地址

  • ENUM_GET_CFG:获取9字节配置描述

  • ENUM_GET_FULL_CFG:获取完整的配置描述

  • ENUM_GET_MFC_STRING:获取设备厂商信息

  • ENUM_GET_PRODUCT_STRING:获取设备产品信息

  • ENUM_GET_SERIALNUM_STRING:获取设备序列号信息

  • ENUM_SET_CONFIG:SET CONFIGUREENUM_COMPLETE:枚举完成

USB控制传输过程包含SETUP-DATA-STATUS三个阶段,如下是一个主机获取设备信息的传输过程GET_DESCRIPTOR:

29.png

图10 Get Descriptor

如下是USB主机库一个SETUP-DATA-STATUS函数调用流程:

30.png

图11 USB主机SETUP函数调用

usbh_ctrl_transfer_loop函数中断对控制请求的各个状态阶段进行处理:

控制请求状态机:

31.png


32.png

图12 控制请求处理流程

USB主机类初始化

在USB标准枚举完成之后,会调用USB主机类的初始化,在初始化函数中解析当前枚举的设备是否支持,调用函数uhost->class_handler->init_handler(uhost)。

初始化代码例:

33.png

USB主机类请求

USB主机类初始化之后,可以发送主机类控制请求,根据不同的设备类,需要实现不同的设备类请求。调用函数uhost->class_handler->request_handler((void*)uhost);

主机类请求例:

34.png

USB主机数据处理

所有枚举完成之后,将进行主机数据处理

主机数据处理例:

35.png

USB主机类型例程

本章将说明使用AT32 USB主机库实现不同的主机类型的例程。目前实现的主机类例程如下:

  • hid(mouse,keyboard)

  • mass storage(msc_only_fat32)

  • two_otg_host_demo(仅AT32F435/437支持)

HID例程

HID类支持鼠标和键盘设备,开发者可修改此例程用以实现支持其它HID类设备。

HID类:

36.png

HID类例程初始化

当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler, 调用此函数将解析接到主机上的设备类型,是鼠标还是键盘或者其它设备。通

过设备的配置描述信息进行如下流程解析:

  • 查找HID接口

  • 判断接口是鼠标还是键盘

  • 查找对应接口的端点号

  • 初始化对应通道

代码如下:

37.png

HID类请求

HID类请求实现一些HID设备的标准请求,调用函数uhost_request_handler

  • SET_IDLE

  • SET_PROTOCOL

  • GET_REPORT

代码如下:

38.png

HID类数据处理

HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

  • 通过usbh_interrupt_recv函数给设备发送IN请求

  • 通过usbh_get_urb_status(puhost, phid->chin); 获取IN请求的状态

  • 通过phid->in_poll判断多长时间发送一次IN请求

  • 通过phid->protocol判断是鼠标还是键盘

代码如下:

39.png

MSC例程

msc_only_fat32实现一个简单的mass storage主机类,仅支持FAT32格式。

MSC类:

40.png

MSC 类初始化当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler,调用此函数将解析接到主机上的设备类型,判断是否是MSC类型。

通过设备的配置描述信息进行如下流程解析:

  • 查找MSC接口

  • 查找对应接口的端点号

  • 初始化对应通道

  • 初始化bulk-only和SCSI状态机

代码如下:

41.png

MSC类请求

MSC类请求实现一些MSC设备的标准请求,调用函数uhost_request_handler

  • GET_MAX_LUN

代码如下:

42.png

MSC类数据处理

HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

实现如下命令:

  • INQUIRY

  • TEST_UNIT_READY

  • READ_CAPACITY10

  • REQUEST_SENSE

代码如下:

43.png

MSC读写数据

MSC读写数据在通过FATFS接口进行实现,在usbh_msc_diskio.c中实现读写函数。

读函数:

44.png

写函数:

45.png

CDC例程

cdc实现一个简单的虚拟串口类。

CDC类:

46.png

CDC类例程初始化

当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler, 调用此函数将解析接到主机上的设备类型。

通过设备的配置描述信息进行如下流程解析:

  • 查找CDC接口

  • 判断接口是否为虚拟串口

  • 查找对应接口的端点号

  • 初始化对应通道

代码如下:

47.png

CDC类请求

CDC类请求实现一些CDC设备的标准请求,调用函数uhost_request_handler

  • GET_LINECODING

代码如下:

48.png

CDC类数据处理

CDC枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

  • 通过set_linecoding和get_linecoding配置linecoding

  • 通过cdc_process_reception(puhost)函数给设备发送IN请求

  • 通过cdc_process_transmission(puhost)函数发送数据给设备

代码如下:

49.png

two_otg_host_demo例程

AT32F435/437存在两个OTGFS,此例程说明同时使用两个OTGFS实现两个host功能。

  • 实现功能:

  • OTGFS1实现MSC主机(参考MSC例程)

  • OTGFS2实现HID主机(参考HID例程)

配置与实现

在usb_conf.h中配置OTGFS1和OTGFS2:

50.png

在main中初始化:

51.png

来源:AT32 MCU 雅特力科技

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

围观 16

为应对气候变化、缓解能源紧张,世界各国正推动化石能源体系向低碳能源体系转变,光伏电站是目前极具发展潜力的绿色电力开发项目。光伏逆变器作为光伏电站的转换设备,其功能在整个电站中起着重要作用,近年来得到快速发展。根据WoodMackenzie数据,预计到2025年全球光伏逆变器市场空间将达到300GW,对应市场规模达180亿美元。
光伏逆变器是光伏发电系统主要部件之一,它连接光伏方阵和电网,控制电池的充电和放电过程,进行交直流的变换,是确保光伏电站长期稳定运行的关键。光伏逆变器在整个光伏系统中成本占比虽不高,约8~10%,但却承担着整个系统的交直流转换、功率控制、并离网切换等重要功能,并负责整个光伏系统的智能化控制,起着至关重要的作用。

1.png

光伏逆变器的目的是用最大功率点追踪(MPPT)技术来从太阳能板抽取最大可能的功率,将清洁能源反馈到电网,这就需要功率级电压和电流必须被准确采样,并且需要为DC/DC和DC/AC中的电源开关准确生成脉宽调制(PWM),这些功能的实现都需要主控MCU来协助。同时,MCU也为逆变电路提供过载、短路保护,以及更多智能化功能,包括外界通讯、数据传输、人机交互等,MCU无疑是光伏发电控制逆变系统中不可或缺的核心部件。目前雅特力AT32F435、AT32F403A、AT32F421等产品系列已成功应用在光伏逆变器应用中。

AT32 MCU在光伏逆变器中的应用

逆变驱动

  • AT32F435凭借288MHz超高主频及丰富高性能外设优势,可以高效地处理逆变器的复杂控制演算法,替代DSP,实现降本增效

  • 3个高级计时器可输出三相互补PWM波形,满足正弦波逆变需要的高频波形

  • 3个高达5.33Msps采样率的12位高速ADC,更有助于精准测量面板的电压和电流,满足逆变器驱动电路所需的高精度控制要求

通讯和HMI

  • AT32F403A主频高达240MHz,SRAM最大可配置224KB,可以高效地处理各类通讯和HMI交互,满足逆变器与外界通讯、人机交互等更多智慧化控制的需求

  • SPIM可接QSPI flash,传输速率最高可达90MHz,可快速存储日志等资料

监控模组

  • AT32F421主频高达120MHz,1个取样速率高达2Msps的12位15通道高速ADC,充分满足高速获取资料的需求,最大限度缩短光伏系统的关断时间,确保系统安全。


2.jpg

雅特力AT32 MCU光伏逆变器具有智能、安全、高效、高可靠性等特点,能够提升电能质量,为电网提供更加稳定、谐波含量较少的纯净电流,同时保障电网安全稳定,提升系统发电效率。AT32 MCU以其高效能、高稳定性、高性价比的优势,打造了更安全、高效、智能的光伏应用方案,助力社会绿色低碳可持续发展。

来源:AT32 MCU 雅特力科技

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

围观 18

2022年已经迈入尾声,经过全年不间断的研发生产与客户的交流反馈,雅特力在微控制器(MCU)市场上获得不少好评,今年年末随着疫情逐步放开,各行各业也开始活络起来,距离全球景气回升指日可待。

物联网(IoT)议题仍持续发烧到许多应用领域,举例来说,在环境监控或是智能设备上,具有高效能、高集成、灵活性和低功耗特性的MCU经常与RF射频相关芯片搭配,如Wi-Fi, Bluetooth与毫米波(mmWave)雷达,MCU可用来执行复杂的资料处理和算法;又以后疫情时代,追求更精准、精密的医疗系统设备,且便于人们在家中就能简易的进行身体健康管理,通过长时间监测人体的生理状况,发现慢性或隐性疾病的征兆,协助患者早日进行诊疗,MCU为这些物联网设备的运行与算法提供支持,并具有高精准度、低功耗、小体积封装与低成本等特性。

在工业、制造业领域,雅特力已累积许多成熟的案例,服务各类型科技行业客户,如传统的PLC可能需要更多的数位/类比转换器或外接模块来协助工厂大型设备运作,且存储器储存空间受限,若重新替换设备、升级需耗费大量的成本与人力学习。AT32 MCU系列能够帮助客户更简单的实现操作,通过高精度12-bit ADC数据采集外部信号、数个通讯接口、多通道PWM,提供不同容量的Flash、SRAM供选用,满足客户的多样需求。以下重点回顾AT32 MCUs全产品系列:

1.jpg

超值型系列

全系列采用32位高效能Cortex®-M4内核,提供丰富界面与各种功能,考量到追求高性价比的开发客户,雅特力部分M4内核产品媲美Cortex®-M0价格。超值型系列MCU具有高质量、小尺寸、低成本、高效能和灵活性等优势,适合成本敏感型嵌入式应用,如物联网节点、光模块、无线充电、电机控制、工业自动化、安防、家用电器、电子玩具、机器人、电竞周边、5G应用等应用领域。超值型产品线现有五款型号,市场上已推出AT32F415、AT32F425、AT32F421、AT32F4212四个系列,特别是AT32F4212系列集成2个运算放大器OPA与比较器,满足高速数据采集、混合信号处理、工业控制与电机应用要求。AT32F423预计2023年2月开始提供样品。

主流型系列

全系列采用32位高效能Cortex®-M4内核,CPU最高支持240 MHz工作频率,集成高效能的运算速度和丰富的系统资源,以高性能、高集成、高性价比和低功耗的优势打造一流市场竞争力,已广泛应用于工业自动化、电机控制、物联网及消费性电子等领域市场,满足各种成本敏感及高运算需求的设计。主流型产品线共有四款,目前已推出AT32F413、AT32F403A、AT32F407三个系列,AT32F407系列还兼容IEEE-802.3 10/100 Mbps Ethernet以太网络控制器接口,协助开发人员降低设备成本,AT32F405预计2023年下半年开始提供样品。

高效能系列

高性能产品线共2款微控制器-AT32F435和AT32F437,全系列采用32位高效能Cortex®-M4内核,配合先进制程与卓越的整合技术,创下M4业界最高主频288MHz的运算速度。除此之外,丰富外设资源支持3组高速(5.33 Msps)ADC独立引擎,和2组DAC等接口,另外AT32F437系列集成IEEE-802.3 10/100 Mbps Ethernet以太网络控制器接口,加快了数据传输效率和提升稳定性。领先的处理能力、性能及弹性易用的产品灵活性,超越业界同级芯片水平,为各种高运算、大存储需求的设计提供了最佳选择,现已成功量产并进入工业自动化、电机控制、物联网及消费性电子等应用市场。

无线型系列

无线型产品现已推出首款蓝牙BLE 5.0 MCU—AT32WB415系列,通过Bluetooth SIG蓝牙BQB认证 (Declaration ID : D059796),具有高效能CPU、卓越射频性能,丰富存储器资源与通讯界面,协助开发人员减少系统成本和占板空间,快速进入无线物联网市场。AT32WB415广泛应用于消费性电子、智慧家居、工业物联网等领域。
雅特力未来将持续发力工业、智能制造、物联网、消费性电子、车用、医疗、5G通讯等领域,致力实现通用型MCU设计,打造全方位微控制器平台,专注开发ARM®-Cortex®-M4/M0+,并提供数字信号处理器(DSP)、单精度浮点运算(FPU)、高速的CPU效能、相对业界更大的内存、丰富的外设、自主研发的sLib二次开发安全库,与不同尺寸封装供客户选择,持续研发28nm/40nm先进制程,强化主频效能、功耗和封装尺寸等各方面优势。同时雅特力提供完整的生态链,通过与合作伙伴结盟产出更多具有市场竞争力的产品,扩大MCU产品渠道,携手与我们的客户共同迈向下一年度,创造更多智能科技,延续美好生活经济。

来源:AT32 MCU 雅特力科技

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

围观 23

SDRAM介绍

同步动态随机存储器(SDRAM)特点:

  • 同步:memory工作时需要同步时钟

  • 动态:存储阵列需要不断刷新

  • 随机:自由指定地址读写数据

  • 容量大价格便宜

SDRAM存储结构

SDRAM支持多BANK,通过指定BANK号,行地址,列地址找到目标存储单元。

1.png图1 存储结构

SDRAM信号线

2.png

SDRAM内部框图

如下以W9825G6KH内部框图举例:

3.png

图2 W9825G6KH框图

  • 1时钟控制

  • 2命令控制

  • 3地址控制4存储阵列,4个BANK

  • 5数据

SDRAM常用命令表

SDRAM通过信号线上的不同状态来产生各种命令。

4.png

表1 SDRAM命令表

注意:L=Low Level   H=High Level   X=don't Care

A10=H表示Precharge all bank,A10=L表示Precharge选择的BANK

No-Operation

表示选中当前设备,当前没有操作。

Bank/Row active

在对SDRAM进行读写时,需要先激活对应的bank和行,该命令用于选择一个bank的一行进行激活,以便接下来进行读写访问。

Read

激活的行有效之后,对列地址进行寻址,读出数据。

Write

激活的行有效之后,对列地址进行寻址,写入数据。

Precharge

预充电命令,在某一行上的读写完成之后,关闭现有的行,准备激活新行。

Refresh

刷新命令,SDRAM

需要不断的刷新操作才能保存数据,根据SDRAM设备参数按照固定周期进行刷新。

Load Mode Register

加载模式寄存器,修改SDRAM设备的功能参数,burst模式,latency等。

5.png

图3 mode register

SDRAM Power On Sequence

6.png

图4 SDRAM Power On

AT32 SDRAM控制器

SDRAM控制器主要特点如下:
同时支持两个SDRAM设备

支持8位/16位数据总线宽度

支持13位行地址,11位列地址(最大可以支持4x16Mx16bit=128MB)

支持4个内部Bank

支持word/half word/byte访问

支持Burst Read,有6x32bit读FIFO缓存

SDRAM时钟支持HCLK/2, HCLK/3, HCLK/4

支持低功耗模式(自刷新模式,掉电模式)

地址映射

7.png

图5 SDRAM地址映射

SDRAM Device1起始地址:0xC0000000

SDRAM Device2起始地址:0xD0000000

I/O引脚配置

8.png

表2 SDRAM IO引脚列表

使用SDRAM IO引脚初始化如下,可根据具体使用引脚进行修改:

9.png

SDRAM读写时序

  • 写SDRAM时序

10.png

  • 读SDRAM时序

11.png

SDRAM配置

通过配置寄存器SDRAM_CTRLx来设置SDRAM设备的容量,访问方式等,详细信息可参考RM。此寄存器包括如下配置:(W9825G6KH作为示例)

  • 行地址/列地址配置

12.png

行地址和列地址根据SDRAM设备地址位数进行配置,如下示例:

13.png

  • 数据总线宽度

14.png

根据SDRAM设备支持数据总线宽度进行配置,如下示例支持16bit数据宽度:

15.png

内部区块个数

16.png

SDRAM设备支持内部bank个数:

17.png

  • 列地址选通延迟(CAS)

18.png

SDRAM设备支持延迟:

19.png

  • 写保护配置(WRP)

如果配置了写保护,在写SDRAM设备时会参数Bus error。

  • XMC_SDCLK时钟分频(CLKDIV)

  • BSTR(连续读)

  • RD(读延时)

配置代码例程:

20.png

SDRAM时序参数配置

要正常使用SDRAM设备,需要正确配置此部分的实现参数,此参数可在SDRAM设备的datasheet中找到对应值。

配置寄存器SDRAM_TMx:

  • TMRD(加载模式寄存器到激活延迟)

  • TXSR(退出自刷新延迟)

  • TRAS(自刷新周期)

  • TRC(刷新命令到激活命令延迟)

  • TWR(写命令到预充电命令延迟)

  • TRP(预充电到激活命令延迟)

  • TRCD(行激活到列延迟)

例TRCD:最小18ns,SDRAM时钟144MHz,一个SDRAM时钟大约为7ns,因此TRCD至少要配置为延迟3个SDRAM时钟周期。

例TWR:SDRAM设备要求2个SDRAM时钟,因此配置为2

SDRAM设备对时序要求:(W9825G6KH作为示例)

21.png

配置代码例程:

22.png

SDRAM启动序列配置

  • Clock enable时钟使能

23.png

  • 预充电

24.png

  • 设置刷新计数器

25.png

计算方法:counter=(SDRAM resfresh period / number of rows)-20;

刷新速率=64ms/8K=7.8125us;

counter=7.8125us*144MHz–20=1105;

26.png

  • 自动刷新

27.png

  • 加载模式寄存器

28.png

SDRAM例程

SDRAM Basic

此例程配置SDRAM设备之后,对SDRAM设备进行读写操作,并判断读写数据是否正确,包括如下步骤:

  • GPIO初始化

  • SDRAM配置

29.png

  • SDRAM启动序列

30.png

  • SDRAM读写访问


31.png

SDRAM DMA

此例程配置SDRAM设备之后,使用对SDRAM设备进行读写操作,并判断读写数据是否正确,包括如下步骤:

  • GPIO初始化(同SDRAM Basic)

  • SDRAM配置(同SDRAM Basic)

  • SDRAM启动序列(同SDRAM Basic)

  • SDRAN DMA读写

32.png

来源:AT32 MCU 雅特力科技

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

围观 31

AT32定时器概述

定时器种类有基本定时器、通用定时器、高级控制定时器,以AT32F435xx举例,下表为各种类型定时器的功能总表。本文主要就定时器溢出中断进行基础讲解和案列解析。
表1. 各定时器功能总表
1.png

2.png

例 定时器溢出中断

功能简介

定时器溢出中断是定时器最基础功能,进入中断的时间周期可由相关寄存器配置。

  • 定时器计数器值TMRx_CVAL
  • 定时器预分频寄存器TMRx_DIV
  • 定时器周期寄存器(TMRx_PR)
定时器中断频率计算公式如下
3.png
其中,TMRxCLK虽然来源于APB1/2时钟,但下图时钟架构可以看出,档APB1/2 Divider存在非1除频时,TMRxCLK会有x2。例如AHB=240 MHz,APB1/2=120MHz,TMRxCLK的实际频率为240 MHz.以向上计数模式举例,TMREN bit使能后,TMRx_CVAL会开始进行累加1,直到其值等于TMRx_PR后,OVFIF位会置起并且定时器会触发溢出中断事件,(若溢出中断有开启,则会产生溢出中断),同时TMRx_CVAL会再次从0开始计数,周而复始。
图1. 定时器时钟源架构
4.png

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\timer_base

软件设计

1) 配置流程
  • 编写定时器溢出中断函数的应用程序

  • 开启定时器外设时钟

  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器

  • 配置定时器为向上计数方向

  • 开启定时器溢出中断

  • 开启NVIC溢出中断

  • 开启定时器计数

2) 代码介绍
  • main函数代码描述
5.png
  • TMR1_OVF_TMR10_IRQHandler中断函数代码描述
6.png

实验效果

  • LED3每1秒翻转一次。

例 PWM输出

功能简介

定时器的输出部分由比较器和输出控制构成,用于编程输出信号的周期、占空比、极性。高级定时器的输出部分在不同通道上有所不同。

高级定时器在通道1到通道3上拥有互补输出,且配备死区调节;通道1到通道4拥有刹车控制。通用定时器的输出部分没有上述功能,只配备了4个通道输出。基本定时器、通用定时器和高级定时器的具体功能差异可查看RM的TMR章节。

如下图为高级定时器通道1到3输出部分原理图:

图2. 高级定时器通道1到3输出部分原理图
7.png
图3. 高级定时器通道4输出部分原理图
8.png

PWM输出是定时器最常用的输出模式,分为PWM模式A和PWM模式B。其差异在于:

PWM模式A:
-OWCDIR=0,若TMRx_C1DT>TMRx_CVAL时设置C1ORAW为高,否则为低;
-OWCDIR=1,若TMRx_C1DT<TMRx_CVAL时设置C1ORAW为低,否则为高。
PWM模式B:
-OWCDIR=0,若TMRx_C1DT>TMRx_CVAL时设置C1ORAW为低,否则为高;
-OWCDIR=1,若TMRx_C1DT<TMRx_CVAL时设置C1ORAW为高,否则为低。

资源准备

1) 硬件环境
对应产品型号的AT-START BOARD
2) 软件环境
project\at_start_xxx\examples\tmr\7_pwm_output
软件设计
1) 配置流程
  • 开启定时器外设时钟
  • 配置输出管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置定时器输出通道为PWM模式B
  • 开启定时器计数
2) 代码介绍
  • main函数代码描述
9.png

实验效果

  • 通过逻辑分析仪或者示波器可将波形打出来。
如下图:
图4. 7路PWM输出
10.png
图中通道1到4输出频率相同但占空比不同的波形,互补通道通过输出极性的调节与其对应的通道输出相同的波形。

例 PWM输入捕获

功能简介

定时器的输入部分由专门的捕获电路实现,可用于对输入信号的滤波、选择、分频和输入捕获功能;通过对捕获值的计算,可得到输入波形的频率和占空比。

如下图为输入部分原理图:

图5. 定时器输入部分原理图
11.png

输入模式下,当选中的触发信号被检测到时,通道寄存器(TMRx_CxDT)会记录当前计数器计数值,并将捕获比较中断标志位(CxIF)置1,若已使能通道中断(CxIEN)、通道DMA请求(CxDEN)则产生相应的中断和DMA请求。若在CxIF已置1后检测到选中的触发信号,则将CxOF位置1。

另外,还提供了更加高效的PWM波输入捕获功能,可以更方便的计算出输入波形的频率和占空比。此模式的通过内部两个CxDT寄存器实现,输入波形通过定时器的通道1或者通道2输入即可。
图6. 定时器捕获PWM波原理图
12.png

将定时器配置成PWM输入模式后,可通过C1DT和C2DT的值计算出对应PWM波形的频率和占空比:

频率=TMR_CLK/C1DT
占空比=C2DT/C1DT

资源准备

1) 硬件环境
对应产品型号的AT-START BOARD
2) 软件环境
project\at_start_xxx\examples\tmr\pwm_input
软件设计
1) 配置流程
  • 开启定时器外设时钟
  • 配置输入管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置定时器的PWM输入模式
  • 开启定时器计数
2) 代码介绍
  • main函数代码描述
13.png
  • 中断函数代码描述
14.png实验效果
  • 从PA7灌入PWM波形;
  • 将串口1连接到上位机,然后通过上位机串口工具即可看到打印信息。

例 输入捕获

功能简介

通过对外部信号的上升沿或者下降沿进行捕获可以实现对外部信号输入捕获并计算频率的功能。本例程实现了对外部信号进行捕获并通过串口打印出频率。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\input_capture

软件设计

1) 配置流程
  • 开启定时器外设时钟
  • 配置输入管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置定时器的输入捕获功能
  • 开启定时器计数
2) 代码介绍
  • main函数代码描述

15.png
  • 中断函数代码描述
16.png

实验效果

  • 从PA7灌入PWM波形;
  • 将串口1连接到上位机,然后通过上位机串口工具即可看到打印信息。

例 DMA传输

功能简介

定时器拥有强大的DMA传输能力,基本每个定时器都支持DMA请求的产生。这使得应用更加灵活。

本实验将src_buffer[0]、src_buffer[1]和src_buffer[2]数据通过DMA传输到TMR的TMRx_C3DT寄存器。实现了每个周期占空比都发生改变,且占空比在src_buffer[0]、src_buffer[1]和src_buffer[2]的值之间进行有序的切换。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\dma

软件设计

1) 配置流程
  • 开启定时器外设时钟
  • 配置输入管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置DMA通道
  • 配置定时器的溢出事件产生DMA请求
  • 开启定时器计数
2) 代码介绍
  • main函数代码描述
17.png

实验效果

从PA10、PB15输出PWM波形;

例 burst传输

功能简介

高级定时器和通用定时器除了支持常规的DMA传输功能,还额外支持DMA burst传输功能。在配置为burst传输后,当TMR产生一个DMA请求可连续传输以TMR地址为起始地址的多笔数据;传输数据的起始地址和数据量可通过软件配置。

如何配置burst传输:

1、配置TMRx_DMACTRL寄存器,此寄存器的bit0到bit4为DMA传输地址偏移,此值决定了DMA传输的起始地址;bit8到bit12为DMA传输长度配置,此值决定了DMA传输的数据笔数。

2. 配置DMA通道,此配置流程与常规DMA通道配置相同;需要注意的是DMA通道的源与目标地址寄存器中的一个必须为TMRx_DMADT寄存器地址;具体是源还是目标就由数据传输的方向决定。

本实验将src_buffer[0]和src_buffer[2]数据通过burst传输到TMR的TMRx_PR和TMRx_C1DT寄存器。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\dma_burst

软件设计

1) 配置流程
  • 开启定时器外设时钟
  • 配置输入管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置DMA通道和定时器的burst功能
  • 配置DMAMUX
  • 开启定时器计数
2) 代码介绍
  • main函数代码描述

18.png

实验效果

  • 从PA8输出PWM波形;

例 单脉冲输出

功能简介

单脉冲输出模式是PWM模式的特例,将OCMEN位置1可开启单周期模式,此模式下,仅在当前计数周期中进行比较匹配,完成当前计数后,TMREN位清0,因此仅输出一个脉冲。当配置为向上计数模式时,需要严格配置CVAL<CxDT≤PR;向下计数时,需严格配置CVAL>CxDT。

当TMR受到外部触发或者软件使能CNT时,TMR开始计数并在此次overflow事件时停止计数。此过程中输出也会根据配置产生波形。

单脉冲输出原理如下图:

图7. 单脉冲输出原理图

19.png

图中当受到外部触发后,TMR开始计数,当CVAL等于CxDT时,改变输出状态,当CVAL溢出时,输出状态再次改变从而达到输出一个单脉冲的目的。

本实验将TMR4配置为单脉冲模式。TMR4的通道1配置为输入并充当触发输入的源头,通道2配置为输出模式,充当单脉冲输出的端口。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\one_cycle

软件设计

1) 配置流程
  • 开启定时器外设时钟
  • 配置输入、输出管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置定时器为向上计数方向
  • 配置定时器为单脉冲模式
  • 配置通道2为输出口,并作为TMR触发的触发源
2) 代码介绍
  • main函数代码描述

20.png

实验效果

  • PB7输入管脚,外部给上升沿触发即可;
  • PB6为输出管脚,输出单脉冲波形。

使用逻辑分析仪打出波形如下:

图8. 单脉冲输出结果
21.png

例 32位定时器

功能简介

部分定时器可支持扩展为32位定时器(具体请查看RM)。扩展后,不单CVAL寄存器为32位,DIV和CxDT都会自动扩展为32位。

使能32位定时器只需要设置TMRx_CTRL1寄存器的bit10为1即可。

本实验将TMR2配置为32位定时器模式,然后配置为PWM输出模式使其输出PWM波形。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\tmr2_32bit

软件设计

1) 配置流程
  • 开启定时器外设时钟
  • 配置输入、输出管脚
  • 使能32位模式
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置通道输出PWM波形
2) 代码介绍
  • main函数代码描述
22.png
实验效果
  • PA0/1/2/3输出波形;
图9. 32位定时器输出结果
23.png
例 定时器同步

功能简介

主次定时器之间可由内部连接信号进行同步。主定时器可由PTOS[2:0]位选择主定时器输出,即同步信息;次定时器由SMSEL[2:0]位选择从模式,即次定时器的工作模式。

定时器从模式有以下几种:

复位模式:

此模式下,当次定时器收到一个同步信号后,次定时器复位计数器和预分频器,定时器的 CVAL寄存器变为0重新开始计数。若OVFS位为0,将产生一个溢出事件。

图10. 复位模式图

24.png

挂起模式:

挂起模式下,计数的计数和刹车受选中触发输入信号控制,当触发输入为高电平时计数器开始计数;当为低电平时,计数器暂停计数。

图11. 挂起模式图
25.png

触发模式:

触发模式下,次定时器当受到外部触发信号后,自动启动定时器,即硬件置TMR_EN为1。所以在触发模式下,初始化定时器后软件不需要使能定时器。
图12. 挂起模式图
26.png

本例程实现了TMR2同步TMR3和TMR4。主定时器TMR2选择溢出事件作为同步信号输出,次定时器TMR3和TMR4选择挂起模式作为从模式。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_xxx\examples\tmr\parallel_synchro

软件设计

1) 配置流程
  • 定时器外设时钟
  • 配置输入、输出管脚
  • 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
  • 配置主模式和从模式
  • 配置PWM输出模式
  • 使能定时器
2) 代码介绍
  • main函数代码描述
27.png实验效果
  • 通过PA6/PA0/PB6输出波形,可使用逻辑分析仪抓取波形查看。

来源:AT32 MCU 雅特力科技

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

围观 68

AT32内核架构概述

AT32F4系列产品是基于Cortex™-M4F处理器架构,该处理器是一款低功耗处理器,具有低门数,低中断延迟和低成本调试的特点。支持包括DSP指令集与浮点运算功能,特别适合用于深度嵌入式应用程序需要快速中断响应功能。Cortex™-M4F处理器是基于ARMv7-M架构,既支持Thumb指令集也支持DSP指令集。

下图为Cortex™-M4F处理器的内部框图,请参阅《ARM®Cortex-M4 技术参考手册》了解关于Cortex™-M4F更详尽信息。

1.png
图1. AT32 Cortex™-M4F内部框图

本文主要就M4内核自带的位带、硬件浮点运算单元和滴答时钟中断功能进行基础讲解。

案例 位带操作

功能简介

利用位带操作,可以使用普通的加载/存储操作来对单一比特进行读写访问。在Cortex™-M4F中提供了两个位带区:SRAM最低1M字节空间和外设区间的最低1M字节空间。这两个区中的地址除了可以像普通存储器一样访问外,还可以通过它们各自的位带别名区来快捷访问这两个区中任意地址的任意比特位,位带别名区将位带区每个比特膨胀成一个32位的字。当你访问位带别名区的一个地址时,等同于直接访问位带区的一个比特位。
2.png
图2. 位带区与位带别名区的膨胀关系图A
3.png
图3. 位带区与位带别名区的膨胀关系图B

位带区:支持位带操作的地址区

位带别名区:对别名区地址的访问最终作用到位带区的访问上

在位带区中,每个比特都映射到别名地址区的一个字(这是只有LSB有效的字)。当一个位带别名区地址被访问时,会先把该地址变换成位带区地址。对于读操作,读取位带区地址中的一个字,再把需要的位右移到LSB,并把LSB返回。对于写操作,把需要写的位左移到对应的位序号处,然后执行一个比特级的“读-改-写”过程。

支持位带操作的两个内存区的地址范围为:

SRAM区中的最低1M字节:0x2000_0000~0x200F_FFFF

外设区间的最低1M字节:0x4000_0000~0x400F_FFFF

对于SRAM位带区的某个比特,如果所在字节地址为A,位序号为n(0<=n<=7),则该比特在别名区的地址为:

AliasAddr=0x2200_0000+(A-0x2000_0000)*32+n*4

对于外设区间位带区的某个比特,如果所在字节地址为A,位序号为n(0<=n<=7),则该比特在别名区的地址为:

AliasAddr=0x4200_0000+(A-0x4000_0000)*32+n*4

对于SRAM区中,位带区与位带别名区的映射如下表所示:

4.png

表1. SRAM区中的位带地址映射

对于外设区中,位带区与位带别名区的映射如下表所示:

5.png
表2. 外设区中的位带地址映射

位带操作的优越性最容易想到的是通过GPIO的管脚来单独控制每盏LED的点亮与熄灭。另一方面,也对操作串行接口提供很大的方便。总之,位带操作对于硬件I/O密集型的底层程序最有用处。位带操作还能简化跳转的判断。当跳转依据是某个位时,以前必须这样做:

读取整个寄存器

屏蔽不需要的位

比较并跳转现在只需要:

从位带别名区读取该位的状态

比较并跳转

使代码更简洁,这只是位带操作优越性的初步体现,位带操作还有一个重要的好处是在多任务以及多任务环境中,将以前的读-改-写需要的三条指令,做成了一个硬件级别支持的原子操作,消除了以前读-改-写可能被中断,导致出现紊乱的情况。

注意事项

1) 因各系列的外设IP地址排布的不同,AT32F421xx与AT32F425xx系列的GPIO外设基地址不在位带映射地址范围内。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_f4xx\examples\cortex_m4\bit_band

软件设计

1) 配置流程

SRAM位带操作

  • 定义全局变量variables=0xA5A5A5A5,
  • 对variables bit0的位带地址写0
  • 检查variables是否修改为0xA5A5A5A4,如果是则表示操作成功
  • 对variables bit0的位带地址写1
  • 检查variables是否修改为0xA5A5A5A5,如果是则表示操作成功
  • 对variables bit16的位带地址写0
  • 检查variables是否修改为0xA5A4A5A5,如果是则表示操作成功
  • 对variables bit16的位带地址写1
  • 检查variables是否修改为0xA5A5A5A5,如果是则表示操作成功
  • 对variables bit31的位带地址写0
  • 检查variables是否修改为0x25A5A5A5,如果是则表示操作成功
  • 对variables bit31的位带地址写1
  • 检查variables是否修改为0xA5A5A5A5,如果是则表示操作成功

外设位带操作

  • 对LED2对应GPIO ODT寄存器bit位的位带地址写0
  • 对LED2对应GPIO ODT寄存器bit位的位带地址写1
  • 循环执行上述操作,实现LED toggle功能

2) 代码介绍

main函数代码描述

6.png
宏定义内容描述
7.png
实验结果
  • SRAM位带操作:如果不满足预期,LED4翻转。
  • 外设位带操作:如果满足预期,LED2翻转。

案例 硬件浮点运算单元

功能简介

FPU即浮点运算单元(Float Point Unit)。浮点运算,对于定点CPU(没有FPU的CPU)来说必须要按照IEEE-754标准的算法来完成运算,是相当耗费时间的。而对于有FPU的CPU来说,浮点运算则只是几条指令的事情,速度相当快。

AT32F4属于Cortex M4F架构,带有32位单精度硬件FPU,支持浮点指令集,相对于Cortex M0和Cortex M3等,高出数十倍甚至上百倍的运算性能

注意事项

1) 由各系列应用方向及成本的综合考虑,AT32F415xx、AT32F421xx和AT32F425xx系列不支持硬件浮点运算单元。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_f4xx\examples\cortex_m4\fpu

软件设计

1) 配置流程

FPU功能的开启必须要编译器和代码都开启才可以。若只开启编译器FPU,程序会进入

hardfault;若只开启代码中FPU,编译器不会编译出FPU的代码指令。

  • 编译器上开启FPU功能

IAR开启FPU方式如下图
8.png
图4. IAR开启FPU方式
MDK开启FPU方式如下图
9.png
图5. MDK开启FPU方式
  • 代码中开启FPU功能
在system_at32f4xx.c文件中void SystemInit (void)函数确保有如下粗斜体代码
10.png
  • 执行Julia算法函数

比较开启和不开启 FPU 功能的 Julia 运算速度。

2) 代码介绍

main函数代码描述

11.png

实验结果

  • 编译器上开启FPU功能,观察LED4翻转速度
  • 编译器上关闭FPU功能,观察LED4翻转速度
  • 对比以上两种情形LED4翻转速度区别

案例 系统滴答时钟中断

功能简介

系统嘀嗒定时器是一个24位递减计数器,递减至零可自动重载计数初值。可产生周期性异常,用作嵌入式操作系统的多任务调度计数器,或对于无嵌入式操作系统,可用于调用需周期性执行的任务。系统嘀嗒定时器校准值固定值9000,当系统嘀嗒时钟设定为9MHz,产生1ms时间基准。

资源准备

1) 硬件环境

对应产品型号的AT-START BOARD

2) 软件环境

project\at_start_f4xx\examples\cortex_m4\systick_interrupt

软件设计

1) 配置流程

  • 配置systick时钟源
  • 配置systick重载值并开启systick中断
  • 在void SysTick_Handler(void)函数中添加应用代码

2) 代码介绍

main函数代码描述
12.png

实验结果

本应配置的是1 ms systick中断,每进200次systick中断LED2翻转一次,因此应该观察到的现象是LED2以200ms一次的频率进行翻转。

来源:AT32 MCU 雅特力科技

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

围观 93

概述 

 

AT32的微控制器内置最多三个高级12位片上SAR模拟数字转换器(ADC)并提供自校准功能,用于提高环境条件变化时的ADC精度。在涉及模数转换的应用中,ADC精度会影响整体的系统质量和效率。为了提高此精度,必须了解ADC相关的运作和影响精度的原因。

SAR ADC使用一个采样电容充电至输入信号电压,SAR逻辑对此电压做数据转换。然而,这个ADC内的采样电容是由外部的信号源直接充电的,也因着采样电容值、输入阻抗、还有外部线路影响,需要一段充电稳定时间来保证对输入信号电压量测的准确性。为达到好的ADC量测,必需设置足够的采样时间。否则,前一次在某一输入通道转换所残余在采样电容上的电荷,会影响目前正在进行转换通道的准确性。ADC精度不仅取决于ADC性能和功能,还取决于ADC周围的整体应用设计。此应用笔记旨在帮助用户如何设置正确软、硬件使ADC达到准确的量测,也提供相关应用上的注意事项。

ADC的误差来源及其误差最小化办法 

 

本章列出了影响ADC转换精度的主要误差。这些类型的误差存在于所有ADC中,转换质量将取决于它们的消除情况。为便于参考,将精度误差以LSB为单位来表达。就电压而言,通过将LSB数乘以1 LSB对应的电压来计算电压误差(1 LSB=VREF+/4096或VDDA/4096)。

ADC自身误差

 

ADC自身误差为ADC本身设计和制造时所产生本体的误差,这类误差通常由以下静态参数显示:微分线性误差(DNL)、积分线性误差(INL)、偏移误差(OE)、增益误差(GE)、和总未调整误差(TUE)。AT32微控制器数据手册的ADC特性部分规定了这些误差的定义和值。其中TUE为实际和理想传输曲线间的最大偏离,此参数指定可能发生的会导致理想数字输出与实际数字输出之间最大偏离误差。(注意TUE不是DNL、INL、OE、与GE之和,它可能源自同时发生的一种或多种误差。)

AT32 ADC自校准功能可以补偿偏移误差,在ADC使用前先进行一次自校准可保证在数据手册揭示范围的任何环境条件之下,TUE小于4 LSB,也就是保证12位ADC静态准确度(accuracy)可达10位以上。

至于ADC的动态参数(如:ENOB)及其代表的误差程度,通常在语音和特定音频应用才会考虑,在一般MCU的应用场合不会太重视,在本文中也不于讨论。

ADC环境导致的误差

 

参考电压/电源噪声

由于ADC转换值为模拟信号电压(VAIN)与参考电压之比(VREF+),因此VREF+上的任何噪声都会导致转换后数字值的变化。在某些封装中,VDDA模拟电源被用作参考电压(VREF+),因此VDDA电源的质量会影响ADC误差。VREF+几十mV的波动就会造成十几LSB的误差。

就供电侧噪声而言,开关式电源模块通常内置快速切换功率晶体管,这会在输出中产生高频噪声,此切换噪声介于15 kHz至1 MHz之间,也需留意。线性稳压器的输出质量更佳。如果使用切换电源,建议使用线性稳压器供应模拟级。建议在电源线和地线之间连接具有优良高频特性的电容。应在靠近电源的位置安装一个0.1 μF和一个1至10 μF的电容。这些电容允许直流信号通过它们。小值电容过滤高频噪声,高值电容过滤低频噪声。要过滤高频噪声,还可使用与电源串联的铁氧体电感器(ferrite bead)。由于线的串行电阻极低,此解决方案导致的直流损失极低(可忽略不计),除非电流很大。

微控制器端VDD和VSS引脚的安装位置很接近,因此可以在尽量靠近的位置通过极短的引线将电容连接到微控制器。VDDA和VREF+引脚必须连接到两个外部去耦电容,100 nF陶瓷电容加上1 μF钽电容或陶瓷电容。注意数字地与模拟地应相互隔离,避免噪声串扰。

图1. 具有VREF引脚封装的电源和参考去耦

图2. 无VREF引脚封装的电源和参考去耦

GPIO输入电压电平超出常规

AT32F403系列、AT32F413系列、和AT32F415系列作为具有ADC输入功能的任一GPIO引脚,输入的电压不能超过VDD+0.3V(VDDA与VDD须同电位),否则会由芯片内部干扰ADC输入信号。只要是ADC输入功能的GPIO,即使只当I/O输入用途,如果输入的电压超过VDD+0.3V,也会干扰其它ADC通道转换结果。如果存在此种高电压,建议使用电阻分压或减压到小于VDD的电压范围。

其它AT32型号MCU则没有以上限制(例如:AT32F403A、AT32F407、AT32F421、AT32F435/437等系列),所有具有ADC输入功能的GPIO引脚都是耐5V引脚。这类引脚在未使用作ADC输入信号而作为数字输入时,需设置为浮空输入、输入上拉、或输入下拉模式,就可以输入高于VDD的电压而不干扰ADC的操作。但使用者仍需注意输入电压不可超出5.5V。但作为ADC输入使用设置为模拟模式时,则失去耐5V特性,使用者需注意输入电压不可超出VDD+0.3V。

在GPIO引脚输入负电压也会干扰ADC的转换。注意输入电压不可低于-0.3V。

模拟输入信号噪声

在采样时间内,小而高频率的信号变化可导致较大转换误差。此噪声由电气设备(例如电机、发动机点火、电源线)生成。它增加了不需要的信号,因此会影响模拟输入源信号(例如:传感器)。这样一来,导致ADC转换结果不准确。
  • 采样平均滤波

此方法是一个简单的技巧,即通过软件对模拟输入多次采样,取所有结果的均值。当模拟电压不频繁变化时,此技巧有助于消除模拟输入上的噪声。如果被测模拟信号产生不稳定的ADC值,软件运算时则可以通过剔除大值和小值,选择适当数量的待平均样本执行平均。此数量取决于需要的精度、最低转换速度。
平均滤波法的优势是可以在无任何硬件变更的情况下提高ADC精度。它的缺点是转换速度和频率响应较慢,相当于降低了有效采样频率。
平均滤波法也针对不同需求发展出各样差别,如:限幅滤波、中位值滤波、递推平均滤波、消抖滤波及其组合等等的算法。使用者可根据信号特性和芯片资源选择合适的数据平均方式。
  • 添加外部滤波器

添加外部RC滤波器以消除高频。无需使用昂贵的滤波器来处理频率分量高于所涉频率范围的信号。这种情况下,截止频率fC刚好高于所涉频率范围的相对简单的低通滤波器将足以限制噪声和混叠。使用与所涉最高频率相同的采样率足以,通常为fC的2至5倍。

但添加了外部RC滤波器时,ADC的采样时间和采样间隔都需要重新评估,否则可能造成更大的量测误差。请详细参考第3章内容。

模拟信号源阻抗的影响

在源和引脚之间的模拟信号源的阻抗或串联电阻(RAIN),可能会因为采样时流入或流出引脚的电流而导致其上的电压瞬间改变,这时ADC内部采样保持电容充满电所需要的时间会延长。如果采样时间短于将内部采样电容充分充放电所需的时间,则ADC转换的数字值会与实际值有徧差。

关于模拟信号源具有高输入阻抗特性或加入RC滤波器时,ADC的测量设置请详细参考第3章内容。

CPU生成的内部噪声

CPU(以及其他外设)操作时,会产生大量内部和外部信号变化,这些变化通过电容耦合传输到ADC外设。此类干扰影响ADC精度。

为使CPU(以及其他外设)对ADC的影响最小化,必须使采样和转换期间的数字信号变化量最小化(数字静默)。使用下列方法之一可以实现这一点(在采样和转换时间内实现):

  • 内部CPU变化量最小化(CPU停止,等待模式)

  • 停止非必要外设(计时器、通信等)的时钟
 

温度影响

温度对ADC精度有重要影响。它主要产生两种重要误差:偏移误差漂移和增益误差漂移。建议使用内部温度传感器和ADC看门狗,以在温度变化达到给定值时重新校准ADC。

I/O引脚串扰

由于I/O之间的电容耦合,切换I/O可能会在ADC的模拟输入中产生一些噪声。彼此距离很近或交叉的PCB走线可能会产生串扰。内部切换数字信号和I/O会产生高频噪声。由于电流浪涌,切换高灌电流I/O可能导致电源电压小幅下降。

PCB上与模拟输入走线交叉的数字走线可能影响模拟信号。通过让接地走线来屏蔽模拟信号,可以减少串扰产生的噪声。PCB布线时,应考虑对ADC输入信号给予屏蔽,可在信号线周围铺铜并就近接地,同时应尽量缩短走线距离。另外在ADC采样和转换时间内实现I/O引脚变化量最小化,对减小对ADC的干扰很有帮助。

 

EMI产生的噪声

邻近电路产生的电磁辐射可能在模拟信号中产生高频噪声,此时PCB走线相当于天线接收干扰噪声。使用者可以通过在可能的发射源和接收器之间提供物理隔离,或通过适当的接地和屏蔽措施对它们进行电气隔离。

沿敏感模拟信号布置接地走线,在PCB上提供屏蔽。双层PCB的另一侧也应具有接地板。这样可以防止干扰和I/O串扰影响信号。应使用屏蔽线缆将远距离信号(例如:传感器)连接到PCB或注意尽可能缩短PCB上信号的路径长度。晶振、时钟以及存在快速变化的信号线尽量远离ADC输入信号。

ADC输入源阻抗对测量的影响和正确的设置方式 

 
SAR ADC的量测要求设置足够的采样时间让ADC内采样电路充分充、放电,以获得转换的准确性。多通道间切换的使用也是同样道理,足够的采样时间可以避免输入通道间的交互干扰(crosstalk)。为了计算估计的采样时间,图3给出一个能近似ADC采样线路的等效阻值和容值(包含:模拟多工器、模拟开关、寄生电容、采样电容…等)的电路图。
图3. 输入级与ADC简化示意图 - 采样和保持电路

其中模拟信号输入源对ADC的输入阻抗(RAIN),直接与ADC采样时间有关,影响ADC转换结果甚巨。未考虑输入阻抗使得ADC输入的外部器件与软件设置的采样时间不批配,往往是造成ADC使用问题的原因。以下分别针对信号源具有一般输入阻抗或高输入阻抗,分别探讨如何正确设置ADC的软、硬件。

一般输入阻抗的测量设置

 

VC是内部CADC电容两侧的电压(请参见图4)。对于给定的采样tC,可以考虑VAIN=VREF+所对应的tC需要采样时间是最大值,因为此时CADC电容需要最多时间从0V充电到VAIN。因此,VAIN=VREF是验证最大源电阻时要考虑的最坏情况。通过软件设置增加采样时间或降低ADC时钟频率可等效加长采样时间,当采样时间越长越可以获得好的转换结果。

图4. 模拟信号源对采样和保持电路充电示意图

一般我们假设允许的最大误差等于1 LSB,照RC充放电公式:

其中Vt)带入VREF×(1-1/212)VAIN带入VREF;而时间常数τ=RAIN+RADCxCADC,采样时间大于8.32xRAIN+RADCxCADC就可达到1 LSB误差之内。若使用者要求较低的准确度,可进一步增大允许的外部电阻RAIN

高输入阻抗的测量设置

 
ADC输入信号源常有存在高阻特性。例如系统电池电压经电阻分压后输入给ADC采集,因分压电阻会形成一个直流耗电路径,为节省耗电,分压电阻串常使用100 kΩ到1 MΩ的阻值组合而成。又或者有些传感器本身为弱电流输出,通过外接一大电阻转换为电压后输入给ADC。以上硬件往往都无法以上一节方法调试出适合的采样时间,(例如软件已设置采样时间至最大值仍无法获得准确的转换值,或降低ADC时钟又使得整体采样间隔太长,)此时可以在ADC输入通道前增加运算放大器,可以提高输入驱动能力,如图5。此方案可大大缩短ADC的采样时间以及采样间隔,但缺点是增加了器件成本。另外在设计前置放大器时,必须注意可能额外产生的误差(例如额外的偏移、放大器增益稳定性或线性、频率响应)。并且若未慎选运算放大器,这些放大器的误差会成为另外测量误差的来源。
图5. ADC输入通道前增加运算放大器示意图

若硬件电路不容许增加运算放大器,无法通过提高采样时间满足要求,此时还可以采用外接电容作为电荷存储器的方法。

SAR ADC内部采样保持电容在采样开关接通后,在采保电容稳定时间内需要一个足够的充放电电流,而通常实际的信号电路若具有较高的输入阻抗,往往不能提供足够大的电流快速为ADC内采样电容充电。为此大部分的应用都采用在ADC输入管脚到地接一个外部大电容作为一个电荷存储器,即图3中的CEXT。这个电容参与采样时电路的充放电过程,以便向SAR ADC采样电容提供充足的电荷,而对内部采样电容进行快速充电,并且稳定ADC输入点的电压。此CEXT与RAIN组成的RC滤波器也顺带限制到达ADC输入端的带外噪声,同时也帮助衰减ADC输入端中开关电容频繁切换和通断的反冲噪声影响。当然此RC滤波器也限制了VAIN信号源的截止频率。

  • 计算CEXT

当采样开关接通后,会在CEXT和CADC之间有一段电荷重新分配的过程,这一段RC时间常数主要是由RADC的最大阻值和CADC的最大容值决定的。
在考虑CEXT和CADC之间电荷分配时,CPAD因为相对微小且与CEXT并联,是可以忽略的。电荷分配的算式是基于「分配前的全部电荷等于分配后的全部电荷」。
假设现在CADC是完全放电的,而CEXT储存着和VAIN一样的电压。VC(分配后的电压)定规为VAIN的0.999939倍,这个意义是VC最后徧差在VAIN的1 LSB之内,以12位解析度来记算。

例如CADC=15 pF,

CEXT=4095x15 pF=61.4 nF。
这是CEXT的绝对最小值。在实际选择器件值时必需确认考虑到器件误差和老化因素,选择大一点的值是可以的,如68 nF。如果电容值选择再大,其实对采样时间要再缩短并没有实质帮助,反而限制了ADC输入信号的频宽。
但如果一个12位的ADC配罝CEXT<4095xCADC,反而会要求相当大的采样时间让CADC充电足够。所以若CEXT<4095xCADC而且使用者若没有需要anti-aliasing滤波器的情况下,还不如不要加CEXT。若要求的精准度没有这么高,CEXT的数值可以照前面公式减小,这时ADC输入信号的频宽就增大了。相反的若要求精准度,CEXT就必须提高了,就要付出ADC采样时间间隔要拉大,ADC输入信号的频宽缩小的代价。
  • 计算RAIN

所有对外部电容CEXT充电的阻值总合程为RAIN,也就是从CEXT看到驱动信号源的等效阻值。当RAIN变大,RAIN和CEXT所型成的截止频率就会变低。这表示当输入信号开始变动到CEXT电荷稳定的这段反应时间会增加。
要准确度稳定达到12位解析度误差1 LSB之内,RC线路的时间常数要求为:
ln(212)=8.32倍。
Cext和Rain型成的截止频率为:

以前段CEXT=62 nF为例,若RAIN=200Ω,截止频率可达9.7kHz;但若RAIN=20kΩ,仅可接受97Hz。源的频率若超以上截止频率,ADC转换结果会不准确。

注意此时程序不得将ADC设定为连续模式,而应设定为单点模式或以定时器间隔触发转换,软件必 须确保两次转换之间的时间间隔等于或大于1/f
  • 采样时间不足的后果

若遵照计算CEXT的方式在ADC输入放置足够大的CEXT,要使CADC稳定所需要的时间就显得非常短。另外也只有一个情况之下可以不需要CEXT就是RAIN很小的时候。一般来说RAIN很小是因为传感器有输出缓冲极,这是RAIN都小于100Ω。以上情况采样时间都容易满足。

不足的采样时间会造成ADC通道间互相干扰。就如本文开头所讨论的,这是因为电荷从一个通道累积在CADC上并转移到另一个通道,造成通道间互相影响。

  • 信号源高阻的后果

通常造成以上所述通道间干扰的原因是因为信号源输入阻抗太高了。若要达到1 LSB的准确度,就必需在各通道转换中间加入延时,后果就是整体的转换时间变慢。

如果没有加上CEXT或着电容值太小,而采样时间又不足,ADC转换出来的结果因为通道间干扰而永远达不到1 LSB的准确度。

关于输入阻抗匹配的其他建议

 
以近期ADC朝向低功耗、高采样频率、并复杂功能的方向进行设计,ADC的采样行为已经不是如上文以一阶简易的RADC和CADC模型可以仿真的了,因此近期普遍ADC规格中只提供CADC的典型值,而不再提供RADC数值。取而代之的是ADC输入信号阻抗(RAIN)与采样时间(ts)的对应关系表,如下表所示。(下表自AT32F403A系列数据手册截取。)
表1. fADC=28MHz时的最大RAIN(1)

(1) 由设计保证。
在可以得知ADC信号源的输入阻抗时,使用者不需进行计算,只要照表格指示透过软件设置足够的采样时间,一般都会得到合理的ADC转换值。但在一般情况下,使用者常常难以直接或间接得知ADC输入信号的阻抗时,最好的方法是逐步调试软件采样时间。

使用者可以依照下述步骤调试ADC的采样时间:

  • 首先设置ADC时钟频率为最高值,并设置采样周期为最大值;
  • 尝试ADC转换并检视转换结果;
  • 若转换数值符合预期,则可逐步调试减小采样周期并观察ADC转出值,以求得足够而不过长的采样时间;
  • 若最大采样时间所得转换值不符合预期,使用者需要降低ADC时钟频率,或是照着前文计算并外加合适大小的CEXT;硬件设置完成后再修改软件设置,逐步调试出合适的采样时间及采样间隔。
另外若采样间隔时间许可时,采取一些软件技巧也会提高ADC转换的准确度,例如:
  • 采用平均法、移动平均法、或中值滤波;
  • 对同一ADC通道采样两次,将第一次的值丢弃而使用第二次的采样的值。此种方式可以消除输入源内阻过大而在不同通道切换时,上一个通道的电压来不及从采样电阻放电而累积的电荷,导 致影响下一个通道的转换值;
  • ADC输入信号大约在0VVREF+/2时,可交替转换该ADC输入通道和内部VINTRV源,也可达到让采样电阻有足够时间充放电的效果,避免通道间干扰。若有内部VSSA通道,交替转换ADC输入通道和内部VSSA通道效果会更好且省时。因为让ADC采样电路放电到VSSA比起充放电到VINTRV可以以更快的采样时间达成。
 

其它ADC应用指南 

 

内部参考电压VINTRV的设置目的与使用方式

 
内部参考电压(VINTRV)为ADC提供了一个稳定的电压输出。VINTRV内部连接到ADC1_IN17输入通道上,用于将VINTRV的输出转换为数字数值。

VINTRV是一个芯片内部的一个恒定电压信号源,按规格为1.2V±3.3%,在所有VDDA操作电压范围内都维持在此稳定电压规格内,不随VDDA电压变动而变化。因此,VINTRVADC的外部VREF+(通常与VDDA同电源)的电压未知或VVREF+电压会变动时(例如:使用电池电源),可用来参照推算出VREF+VDDA电压以及各ADC_IN输入的准确绝对电压值。

例如:选定VINTRV通道经ADC转换后数值若为1650Code_VINTRV),就可以推算出电压满格的VREF+VDDA的电压为1.2x4096/1650=2.979V。此时若另一选定的ADC_IN外部通道转换出来的数值为800Code_VAIN),就可采用以下两种计算方式:1.2x800/16502.979x800/4096,计算出此外部信号电压VAINx0.582V

以上范例使用公式如下:

VREF+VDDA=(VINTRV)x4096/(Code_VINTRV)
VAINx=(VINTRV)x(Code_VAIN)/(Code_VINTRV)
VAINx=VREF+VDDAx(Code_VAIN)/4096

使用者可以根据应用系统电源的特性,决定对VINTRV转换次数及间隔。若电源为电压未知但不变动,可于系统上电后并在ADC初始化并校正后,一次性对VINTRV转换;若电源为变动电压,就要根据电源变动速度和系统需求决定对VINTRV转换间隔,多次对VINTRV转换并更新此参照值,甚至需要对ADC重新校正。另外温度变化也可能使电源情况有改变,也可参考2.2.6节内容启动对VINTRV转换。因VINTRV为内部弱电压源,ADC进行采样时需要足够时间让VINTRV为采样电路正确充放电,使用者需确实遵照数据手册中的TS_INTRV参数为VINTRV设置足够的采样时间,以获得正确的转换数值。

围观 80

电子科技产品迭代更新,消费性产品逐步迈向智能化,且绿色环保意识提升,随写即丢的纸本已渐渐无法满足数字时代需求,数位板也就此诞生。数位板属于计算机输入设备的一种,由一块电子平板和一支电磁感应笔所组成。相较传统绘图工具,数位板能通过USB或蓝牙BLE与计算机设备连接,直接将数据传送至计算机屏幕上显示手绘效果,在作业效率及图像质感细致度上大幅提升,目前生活中,如医院、银行、电信业的电子签名,以及教育产业、创作设计等,都十分常见。

数位板采用的是电磁式感应原理,依靠电磁笔操作过程中和面板下的感应天线产生磁场变化来判别,电磁笔为信号发射端,主机中电磁感应板为信号接收端,当接近感应时磁通量发生变化,经由精密放大器放大后传送到A/D转换电路进行信号采集,通过A/D转化后由MCU读取,并且通过MCU算法,处理计算接触点的坐标,最后在PC或LCD液晶屏幕上显示。过去因手指的摩擦力太大,无法呈现较精细的笔划,同时由于数位板系统的规格大小与功能特性局限,因此开发出了电磁感应笔,用来作为手写面板与用户的媒介,笔划精确度高、反应速度快,能够实现接触点的坐标显示、图像显示及轨迹显示等功能,当用户在数位板上画图、写字或描绘图形时,通过MCU能够迅速跟踪电磁感应笔的动作,使图形完整地在PC或LCD上显示轨迹。

“雅特力AT32

雅特力AT32 MCU采用32-bit ARM® Cortex®-M4/M0+内核,具有高性能、高精度及高稳定性优势等,特别适合用来解决手写识别问题,使用上更加贴近使用者习惯,并且提供三种低功耗电源模式,包括睡眠、深睡眠和待机状态,使产品在长时间工作下,仍可维持适当的电流消耗。如超值型AT32F415系列和无线型AT32WB415系列,主频高达150MHz,最高可支持256KB Flash和32KB SRAM,同时内建USART/SPI/I2C/OTG/CAN等标准通讯接口,便于开发者连接各类无线模块、传感器等扩充产品功能,满足多种应用需求。

AT32F415系列和AT32WB415系列MCU产品应用特点

  • 丰富外设整合UART、SPI、I2C、USB OTG、CAN等多种标准通讯接口,产品应用领域广泛

  • 内建12-bit独立ADC,2Msps采样率,可同时运作,且多达8个采样高速通道,提高量测位置坐标分辨率

  • 宽电源电压范围2.6-3.6V,有助量测值恒定及提升可靠性

  • 采用BLE5.0 SoC芯片,支持蓝牙2.4GHz频段,Rx灵敏度可达到-97dBm,Tx值介于-20dBm~+4dBm之间,有效范围传输超过30m,实现高识别精度和控制功能(仅限AT32WB415系列)

  • 支持工业级别温度范围-40℃~105℃,即便处在恶劣环境下仍可长期稳定操作

  • 搭配雅特力提供丰富的开发软件工具,简单设定即可完成操作设计

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

围观 27

概述

启动存储器(Boot Memory)默认是作为BOOT模式用来存放原厂固化的启动代码。不过,在具有AP mode系列产品上,添加了新功能,启动存储器也可以选择作为主存的扩展区(AP模式)用来存放用户自定义代码。

注意:启动存储器AP模式只能设置一次不可逆,设置后原启动存储器BOOT模式功能不可恢复。

本应用指南将介绍主存扩展的使用范例,下面以AT32F415系列为例,其中:

  • 章节2.1介绍使用Artery ICP Programmer将启动存储器开启AP模式,作为主存扩展的步骤。

  • 章节2.2介绍项目run_in_boot_memmory在启动存储器执行应用程序的示例。

  • 例程放在BSP标准库

    utilities\at32xx_boot_memmory_ap_demo\run_in_boot_memmory目录

范例程序

使用Artery ICP Programmer将启动存储器作为主存扩展使用

要使用ICP Programmer,请参照以下步骤:

  • 连接J-Link或AT-Link仿真器到AT32F415并上电;

  • 开启ICP programmer,选择用J-Link或AT-Link做连接;

  • 通过菜单栏:“设备操作”-“启动程序存储区AP模式”,如下图:

“图1.
图1. ICP操作界面
  • 为防止误操作,需按照提示手动输入启用秘钥0xA35F6D24,操作后“存储器信息”表格中会有成功或失败的提示信息。

  • 关于ICP Programmer的详细说明,请参阅ICP Programmer用户手册。

run_in_boot_memmory:在启动存储器执行应用程序

在此例程中,硬件从主存储器启动,主存储器的代码会从串口(USART1)输出信息,启动存储器中的代码会初始化LED灯并让LED2闪烁。要在启动存储器执行应用程序,需对Keil进行如下设置:

  • 设置启动存储器的起始位置及范围。

“图2.
图2. 设置bootmem地址范围到IROM2
  • 范例程序把要载入启动存储器的应用代码编写成单独的c文件,范例中是把LED灯闪烁的相关代码放在run_in_boot_memmory.c,右键点击.c文件在Options选项中将地址编到IROM2。

“图3.
图3. 选择配置c文件

“图4.
图4. 配置c文件编译地址
  • 编译后查看分散加载描述文件(scatter file),可以看到目标文件(object file) run_in_boot_memory.o放置到了启动存储器。

“图5.
图5. 分散加载描述文件
  • 添加启动存储器flash算法。

“图6.
图6. FLASH算法文件添加
  • 下载并运行后可以看到对应执行结果LED闪烁。

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

围观 19

页面

订阅 RSS - AT32 MCU