AT32 MCU
概述
使用TCP执行通讯时,会有Server与Client的差别。Server是经由开启特定的Port来等待来自Client端的连线需求;而Client端则是向Server端提出连线需求,此例程使用LwIP作为协议栈,可以使用tcp_bind(), tcp_listen()与tcp_accept()这三种系统呼叫来使Server端接受Client的连线要求。
本使用指南会分别说明TCP client与TCP server该如何与PC端通信。
硬件资源
1) AT-START-F407 V1.0实验板
2) DM9162以太网模块
3) 以太网线
软件资源
tcp_client, TCP client源程序,运行TCP客户端程序
tcp_server, TCP server源程序,运行TCP服务端程序
AT32 TCP client/server程序设置
管脚配置
表1. 管脚配置
LwIP设置
硬件资源只提供从PHY到MAC的信号处理,若要进行开发,则需要实作TCP/IP协议栈,在本应用中使用LwIP协议栈,该协议栈主要关注的是怎样减少减少内存的使用和程序代码的大小,这样就可以让LwIP适用于资源有限的小型平台例如嵌入式系统,更详细的内容可以访问官方网站。
由于整个协议栈已经整合到代码中,大部分的内容都无须修改,使用者只要根据自己的网段去设定IP地址及闸口地址即可,这两个全局变量宣告在netconf.c的上头。
TCP client project设置
在初始化LwIP协议栈之后,就可以配置TCP client的应用了,芯片作为客户端是发出请求的一方,所以必须要配置往哪里发送数据,也就是说要知道服务端的socket。所谓的socket就是IP地址加上端口,在代码中我们宣告了几个宏定义代表服务端的socket,可以在tcp_client.h中找到TCP_SERVER_IP跟TCP_SERVER_PORT这两个宏定义,用户可以根据网段跟应用修改这两个宏。
确认网段与服务端一致后,下载代码到芯片上,服务器端会一秒打印一次”tcp client experiment!”,同时LED2, 3, 4也会跟着闪烁。
上位机服务端设置
1) 设定上位机的IP地址、网路屏蔽及闸口,IP地址与闸口需要跟芯片设置在同一个网段下。
2) 打开上位机端的服务器软件,这里使用网路调适助手为例。协议类型选择TCP server,本地IP地址为代码中的TCP_SERVER_IP,本地端口号为代码中的TCP_SERVER_PORT,按下连线即建立连线。
3) 连线建立后,会出现以下画面,不断打印来自TCP client的数据。
TCP server project设置
在初始化LwIP协议栈之后,就可以配置TCP server的应用了,芯片作为客户端是接受请求的一方,所以必须要配置在哪里接受数据,也就是说要开个端口给客户端丢数据进来。在代码中我们宣告了一个宏定义代表服务端的端口,可以在tcp_server.h中找到TCP_LOCAL_PORT这个宏定义,用户可以根据应用修改这个宏。
上位机客户端设置
1) 设定上位机的IP地址、网路屏蔽及闸口,IP地址与闸口需要跟芯片设置在同一个网段下,请参考图3。
2) 打开上位机端的服务器软件,这里使用网路调适助手为例。协议类型选择TCP client,服务器IP地址为芯片的IP地址,本地端口号为代码中的TCP_LOCAL_PORT,按下连线即建立连线。
3) 此时会出现讯息在视窗中,可以透过调试助手下方的区块输入字符串发送给服务器,服务器会响应输入的字符串到视窗中。
关于雅特力
雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM ®Cortex®-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM® Cortex®-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。
雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G、物联网、消费、商务及工控等领域。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
概述
SPIM(External SPI FLASH memory interface)最大地址段为0x08400000-0x093FFFFF(16MB),是AT32 MCU独有的一种Flash访问方式。用户可以使用自己的Flash作为AT32 MCU的外挂Flash。该方式有别于片上Bank1/Bank2,用户可根据具体需求选择是否开启。开启SPIM后可以作为Flash扩展实现如下功能:
- 在SPIM地址存放用户执行程序,类似于Bank1/Bank2一样执行程序。
- 用户程序直接访问SPIM地址,作为存储字体库,图片等存储器使用。
SPIM配置
SPIM仅允许按字(32bit)或者半字(16bit)操作,在执行读、编程、擦除SPIM前,必须首先执行初始化及解锁操作。
SPIM在AT32不同系列产品及不同封装上,可能使用的pin有所不同,具体请参考对应型号产品的RM和DS,下面以AT32F403A系列为例,描述操作步骤
初始化及解锁操作
初始化及解锁的步骤,在AT32的BSP中已经封装成库函数,用户可以直接调用
1) 使能GPIOA、GPIOB和IOMUXCRM时钟。
2) 配置对应pin PA8、PA11、PA12、PB1、PB6、PB7为推挽复用输出模式。
3) IOMUX_REMAP2寄存器中使能SPIM接口。
4) 设置FLASH_SELECT寄存器选择配置SPIM Flash的类型。
5) 使用KEY解锁SPIM:写FLASH_UNLOCK3寄存器2次,按顺序分别写0x45670123和0xCDEF89AB。
6) 检查SPIM是否解锁成功,读取FLASH_CTRL3寄存器的OPLK位,如果被清除为0,则可以开始操作SPIM。
Flash型号选择
SPIM可以配置支持不同型号的spi Flash,支持的指令集如下表,更详细描述可以看参考手册FlASH章节。
表1. SPIM支持的指令集
读操作
直接按字(32bit)或者半字(16bit)访问需要读取数据的地址段:0x08400000–0x093FFFFF
编程操作
编程操作步骤,在AT32的BSP中已经封装成库函数,用户可以直接调用
1) 打开编程操作,FLASH_CTRL3寄存器FPRGM位置1
2) 直接按字(32bit)或者半字(16bit)在需要编程的地址写入数据
3) 检查是否写入完成读取FLASH_STS3寄存器的OBF位是否清除,如果清除表示写入完成
4) 关闭编程操作,FLASH_CTRL3寄存器FPRGM位置0
5) 检查是否写入成功,读取FLASH_STS3寄存器的PRGMERR和EPPERR位,如果都为0则表示写入成功
擦除操作
SPIM擦除分为Mass Erase和Sector Erase,每个sector固定为4KB,在AT32的BSP中已经封装成库函数,用户可以直接调用
Mass Erase
1) 使能擦除,FLASH_CTRL3寄存器CHPERS位置1
2) 开始擦除,FLASH_CTRL3寄存器ERSTR位置1
3) 关闭擦除,FLASH_CTRL3寄存器CHPERS位置0
Sector Erase
1) 使能擦除,FLASH_CTRL3寄存器SECERS位置1
2) 选择擦除扇区地址,FLASH_ADDR3寄存器写入需要擦除扇区的地址
3) 开始擦除,FLASH_CTRL3寄存器ERSTR位置1
4) 关闭擦除,FLASH_CTRL3寄存器SECERS位置0
加密操作
因为SPIM电路裸露在MCU芯片外部,为防止存储在SPIM Flash里边的数据被外界直接读取,SPIM提供了加密功能,将原始数据通过特有算法进行加密操作后再写入Flash,AT32 MCU读取SPIM数据时会先进行解密得到原始数据,然后才使用,保证数据安全。加密算法所用的SPIM scrambled KEY为用户系统数据区的地址0x1FFFF820-0x1FFFF82F范围内数据。
- 当SPIM scrambled KEY值全为0xFFFFFFFF时,加密功能关闭。
- 当SPIM scrambled KEY值不全为0xFFFFFFFF时,加密功能开启。AT32 MCU根据FLASH_DA寄存器值作为加密范围分界,小于0x08400000+FLASH_DA地址段的数据为密文,其余范围数据仍然采用明文存储。
注意:数据写入时的加密状态必须和读取时的加密状态保持一致,否则可能导致读取的数据是乱码而无法正确使用或者运行。即写入时如果配置了SPIM scrambled KEY及FLASH_DA,那么在读取时也必须配置相同的SPIM scrambled KEY及FLASH_DA。
硬件电路
因为SPIM连接在外部电路,受环境影响较大,为保证电路稳定,需尽量减少PCB布线长度。
注意:SPIM运行频率为MCU的AHB时钟频率的1/2,所以当开启SPIM时,MCU对应的运行AHB频率有最大限制值,不同型号MCU在SPIM开启时运行的最大频率值请用户参考DS的通用工作条件章节描述。
I/O复用
要使用SPIM,需要注意跟其他外设IP的IO复用问题。
当SPIM使用的IO还有对应的其他外设使能的话,有些IO即使其他外设应用中没有用到,但也可能会占用。
例如:XMC和SPIM同时使用时,在F403A上PB7用作SPIM的IO2,但是如果配置使能了XMC,即使XMC_NADV功能没有使用,则PB7也会被XMC_NADV默认开启占用,导致SPIM工作异常。此时需手动配置IOMUX_REMAP2寄存器关闭XMC_NADV功能,调用库函数即可,如下gpio_pin_remap_config (XMC_NADV_MUX, TRUE)
demo示例
AT32的BSP中,有两个例程operate_spim和run_in_spim演示了如何使用SPIM。
用户程序访问SPIM存储区
如果通过用户程序去执行读、编程及擦除操作,只需要按照正常配置初始化及解锁后就可以实现。
BSP中examples\flash\operate_spim执行了SPIM的初始化、擦除、编程和读取流程,并通过LED显示执行结果。
下载用户程序到SPIM或者用户程序在SPIM执行
如果用户程序通过keil下载到SPIM中,或者想程序直接在SPIM执行,需要执行一些额外的操作。
附件工程run_in_spim通过LED的闪烁,简单的演示了代码如何在SPIM上运行。
1) Options-Debug-Settings-Flash Download中选择添加外挂flash类型。
2) Options-Target中添加SPIM起始地址和容量大小,但不勾选。Demo中将SPIM定义在IROM2位置,用于存储C文件
注意:如果勾选则KEIL在编译时可能会将其余不需要运行在SPIM的函数编译到SPIM地址段。
3) Project中选择需要运行在SPIM对应位置的C文件,鼠标右键选Options进入将Memory Assignment的code地址改为对应地址段。
注意:如果工程中函数还有更多指定地址分段编译的需求,可以继续添加到对应 ROM1/2/3 等,也可以手动修改sct文件
4) 编译时勾选自动生成sct文件的选项,编译完成后浏览sct文件可以发现需要运行在SPIM区域的函数已被正确编译到该区域。
注意:整个代码的启动必须从bank1开始,须保证SPIM flash的初始化代码在程序执行到SPIM前运行。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
随着工业自动化的要求不断提高和节能的倡导,变频器的应用越来越广泛,在电力、水泥、电梯、矿山、冶金、交通等现代领域得到了前所未有的推广和应用。在过去的几年内变频器市场一直保持着较高增长率。近年来,变频器市场正保持着12%-15%的增长率,预计5年之内,变频器市场需求仍将继续保持10%以上的增长率。
变频器是应用变频技术与微电子技术,通过改变电机工作电源频率的方式来控制交流电动机的电力控制设备。MCU作为变频驱动控制的核心部件,根据电机的实际需要来提供其所需要的电源电压。随着高性能微处理器的应用以及控制技术的发展,变频器进一步实现小型轻量化、高性能化和多功能化以及无公害化。
矢量变频器 VS 通用变频器
变频器可以分为通用变频器和矢量变频器,矢量变频器采用矢量控制方式,属于高性能控制方式,基于异步电动机的按转子磁链定向的动态数学模型,其控制原理类似直流电动机。矢量变频器控制精度更高,低速输出扭矩更大。
在面对要求高速响应的工作机械时,如工业机器人,驱动系统在速度响应上至少需要100rad/s,矢量变频器速度响应值最高能达到1000rad/s,可保证机器人驱动系统快速、精确地工作。矢量变频器一般还应用在重负载启动的场合,例如大功率长皮带、提升机等。普通变频器在此类场景不适用,由于启动时负载过重,输出扭矩不足,会导致电机无法启动,将报告电机堵塞或变频器过流等故障。
雅特力AT32 MCU矢量变频器应用方案
矢量变频控制的扭矩大、扭矩输出平稳,噪音小、效率高。但是控制算法复杂、运算量较大,对MCU性能有一定要求。雅特力矢量变频器应用方案采用AT32F421系列超值型ARM® Cortex®-M4微控制器,M4内核可媲美M0价格,主频高达120MHz,最高可支持64KB闪存存储器(Flash)及16KB随机存取存储器(SRAM),提供丰富接口与各种功能,可实现高性能、高精度的电机驱动控制。
AT32F421C8T7作为变频驱动控制的核心部件,通过控制变频器中的IGBT、电流传感器达到节能、调速的目的,并实现变频器的保护功能,如过流、过压、过载保护等。AT32F421具有高速GPIO处理响应速度,以及快速ADC转换速率,高达2MHz以上,极大的提高了变频器的响应速度,可以对转矩进行精确控制,具有系统响应快,调速范围广,加减速性能好等特点。在对转矩控制要求高的场合,具备优越的控制性能。
同时,变频器工作的工业环境面临着电磁波干扰、腐蚀气体、震动和冲击等考验,这就需要MCU的稳定性。AT32F421支持工业级别芯片工作温度范围-40~105°C,能够适应恶劣的工作环境,如造纸机、印染机均要求在高湿、高温并有腐蚀性气体的环境中工作。提高了产品的可靠性和环境适应性,产品功能更优化、应用更灵活、性能更稳定。
AT32F421C8T7应用优势
- 极致性价比Cortex®-M4内核,主频高达120MHz,具有快速高效的算法能力
- 集成丰富外设接口增强连接性,数据采集灵活性高,满足多样化终端设备接入
- 高速GPIO处理响应速度,以及快速ADC转换速率,高达2MHz以上
- 支持工业级别芯片工作温度范围-40~105°C,对复杂的工作环境适应性强,保障系统稳定性
关于雅特力
雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM ®Cortex®-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM® Cortex®-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。
雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G、物联网、消费、商务及工控等领域。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
看门狗简介
看门狗通常用来提高系统的稳定性。当因为一些特殊的情况导致程序跑飞,或者运行逻辑错误,而没 有及时喂狗时,看门狗会将MCU重新复位,以达到自动从异常中恢复的效果。建议用户在所有应用中都使用看门狗,以提高系统稳定性。
AT32单片机有两个看门狗:看门狗(WDT)和窗口看门狗(WWDT):
- 看门狗(WDT):一个12位的递减计数器,当计数器从某个值递减到0的时候,系统会产生复位,如果在计数器递减到0之前刷新了递减计数器,那么就不会产生复位。
- 窗口看门狗(WWDT):一个7位的递减计数器,当计数器从某个值递减到0x3F的时候,系统会产生复位,如果在规定时间刷新了计数器(窗口时间内),那么就不会产生复位。
各个型号差异
各型号的窗口看门狗(WWDT)相同,程序兼容。
各型号的看门狗(WDT)基本功能相同,只是各个型号之间,可能去掉了更高级的窗口功能或者低功耗下可选的停止运行功能,其余功能相同并且程序兼容。
√:表示支持该功能,且功能相同。
×:表示不支持该功能。
使用场景对比
看门狗(WDT)和窗口看门狗(WWDT)作为两种不同类型的看狗,有着不用的适用环境。
特点对比
看门狗WDT
寄存器访问
状态寄存器
看门狗功能位于两个不同的区域,寄存器部分位于1.2V电压域,计数逻辑部分位于VDD电压域,所以看门狗能够在SLEEP、DEEPSLEEP、STANDBY模式下运行。
对看门狗寄存器的写操作位于1.2V电压域,所以当写了寄存器之后,还需要将寄存器值同步到VDD电压域。每一个寄存器都有一个同步标志指示同步操作是否完成。每一次同步时间最多需要4个LICK时钟,大约125us。当写了寄存器之后对应的同步标志自动置1,当同步完成了之后标志自动清0,在同步标志清零之前,不允许再写此寄存器。
RLDF:当该位为1时,表示重装载值的同步正在进行中;当为0时,表示该过程执行完成。
DIVF:当该位为1时,表示预分频器值的同步正在进行中;当为0时,表示该过程执行完成。
WINF:当该位为1时,表示窗口值的同步正在进行中;当为0时,表示该过程执行完成。
标志获取函数:
寄存器写保护
看门狗寄存器受到写保护,在写寄存器前需要先解锁写保护,写命令寄存器CMD=0x5555解锁写保护。当写一个其他值,将重新开启读保护。受读保护的寄存器如下表所示:
寄存器解锁写保护函数:
时钟结构
看门狗计数器由LICK时钟驱动,经过8位的预分频器得到递减计数器时钟。LICK是内部RC时钟,其典型值为40kHz,范围为30kHz~60kHz之间(详情请见对应型号的数据手册)。所以超时时间也是在一定区间内,使用时应注意在超时时间配置上应该留有余量,如果需要获得较为精确的看门狗超时时间,可以先通过定时器测量出LICK频率,然后再根据实际的LICK频率计算超时时间。
通过寄存器DIV[2:0]配置配置不同的预分频值,可配置预分频值为4、8、16、32、64、128、256。
分频设置函数:
计数器
看门狗的计数器是一个12位的递减计数器,最大值为0xFFF。当开启看门狗后,计数值将从设定的值开始递减,当递减到0时,产生系统复位。
计数值通过重载寄存器RLD设置,在分频值确定的情况下,该值的大小决定了看门狗复位的时间长 短,每当往命令寄存器WDT_CMD写入0xAAAA时,该寄存器的值便会更新到递减计数器中(此操作通常称为喂狗),喂狗的操作需要在计数器递减到0之前进行,不然会发生复位。
看门狗复位时间计算如下:
重载值设置函数:
重载看门狗计数器(喂狗)函数:
窗口功能
当WIN[11:0]设置为非默认值(0xFFF)将开启窗口功能。当在计数值大于窗口值时重载计数器值将会产生系统复位,例如将WIN值设置成800时允许重载的窗口时间如下图所示。
窗口设置函数:
低功耗停止计数
看门狗能够在SLEEP、DEEPSLEEP、STANDBY模式下运行,用户可选择进入DEEPSLEEP、STANDBY模式后计数器是否停止计数,可由用户系统数据区中的nWDT_DEPSLP、nWDT_STDBY位配置。
如果设置了停止计数,当进入了DEEPSLEEP、STANDBY模式后,看门狗计数器停止递减,意味着看门狗在这两种低功耗模式下不会发生复位,当从这两种模式唤醒后,计数器从进入时的值继续递减。
用户系统数据擦除函数:
用户系统数据配置函数:
低功耗停止功能使用示例:
启动看门狗
看门狗启动方式分为硬件启动和软件启动,当看门狗启动了之后不能被关闭,除非发生复位。
软件启动方式
向命令寄存器写入0xCCCC,启用看门狗。
看门狗软件使能函数:
硬件启动方式
硬件启动则需通过配置用户系统数据区的nWDT_ATO_EN位来实现,使能硬件看门狗后,看门狗将在上电复位后自动开始运行。
硬件启动看门狗使用示例:
使用方法
看门狗一般用于检测程序跑飞或者死循环,比如一个正常的程序运行完的时间是10ms,可以设置看门狗超时的时间为20ms,当程序运行完便立即进行喂狗操作,这样便不会产生复位,超过20ms还未喂狗时,说明产生了故障,此时会复位MCU。
例如:要设置WDT超时时间为20ms,那么可以设置预分频值为4,计数值为200
配置步骤:
1. 禁止寄存器写保护
2. 设置预分频值为4
3. 设置重载值为200
4. 启用看门狗
5. 在应用程序中重载计数器
窗口看门狗WWDT
窗口看门狗(WWDT)主要作用是用来检测软件逻辑是否按照预期执行,其喂狗时间是一个有上下范围内,可以通过相关的寄存器,设定其上限时间和下限时间,喂狗的时间不能过早也不能过晚(当递减计数器的值小于0x40,或者当递减计数器在窗口外被刷新时产生复位)。
时钟结构
窗口看门狗时钟由APB1时钟分频而来,由于APB1_CLK的精确性,因此窗口看门狗时间精度很高。
APB1时钟先经过4096分频后,再送到预分频器,最后提供给7位递减计数器CNT[6:0]。可以配置不同的预分频值来获得不同的时钟,通过DIV[1:0]可配置预分频值取值范围为1、2、4、8。
分频设置函数:
计数器
窗口看门狗的计数器是一个7位的递减计数器,最大值为0x7F,当开启看门狗后,计数值将从设定的值开始递减,当递减到0x3F时,产生系统复位。
计数值设置函数:
窗口功能
窗口的值(WIN[6:0])可以自由设定,最大值为(0x7F),最小值必须大于下窗口的0x40,所以取值范围为64~127(即:0x40~0x7F);只有当递减计数器的值小于等于窗口值时,才允许刷新递减计数器,否则将会产生复位。
为了便于喂狗,应用程序也可以利用重载计数器中断(RLDIEN)进行喂狗。当递减计数器到达0x40时,则产生中断,在相应的中断服务程序中重新设置计数器。
如上图所示当配置窗口值为0x4F时,不允许刷新的窗口为0x7F~0x50,允许刷新的窗口为0x4F~0x40。
重载标志清除函数:
重载标志获取函数:
重载中断使能函数:
窗口设置函数:
看门狗使能
设置WWDTEN=1使能窗口看门狗,当窗口看门狗被打开后不能被关闭,直到复位。为了避免使能看门狗后立即发生复位,在使能看门狗时,应该同时配置看门狗计数值。
窗口看门狗使能函数:
使用方法
窗口看门狗一般用于检测逻辑运行是否正常,比如一个正常的程序执行完的时间是10ms,当程序在10ms以前执行完说明出现了逻辑错误,可以设置看门狗窗口值为9ms,当程序在9ms以前进行喂狗时,说明程序产生了故障,此时会产生一个复位。
例如:当PCLK1=36MHz时,要设置WWDT超时时间为9ms,那么可以设置预分频值为4,总的分频为 4x4096=16384。计数值为127,窗口值为108,此时从计数值减到窗口值时间约为9.1ms。
所以允许喂狗时间为9.1~29.1ms,不允许喂狗时间为0~9.1ms。
配置步骤:
1. 开启窗口看门狗APB1时钟
2. 设置预分频值为4,总的分频为4096x4=16384
3. 设置窗口值为108
4. 启用看门狗
5. 在应用程序中重载计数器
备注:需要在0x3F<递减计数器<=窗口值执行
案例 看门狗WDT使用
功能简介
演示看门狗(WDT)功能使用。
资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
2) 软件环境
project\at_start_f4xx\examples\wdt\wdt_reset
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
- 初始化看门狗
- 在主程序中喂狗
2) 代码介绍
main函数代码描述
实验效果
- 正常运行时看门狗不会复位,当按下按键后,停止喂狗,导致MCU复位。
- 复位后,如果检查到是看门狗复位则LED4点亮,否则LED4不亮。
案例 窗口看门狗WWDT使用
功能简介
演示窗口看门狗(WWDT)功能使用。
资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
2) 软件环境
project\at_start_f4xx\examples\wwdt\wwdt_reset
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
- 初始化窗口看门狗
- 在主程序中喂狗
2) 代码介绍
main函数代码描述
实验效果
- 正常运行时窗口看门狗不会复位,当按下按键后,停止喂狗,导致MCU复位。
- 复位后,如果检查到是窗口看门狗复位则LED4点亮,否则LED4不亮。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
随着半导体微缩技术的不断精进,物联网实现了设备自动化,进行数据采集和远程控制等,同时结合AI技术,融合形成AIoT。AIoT是指将IoT导入AI人工智能系统,从工业应用领域发展到人们的日常生活中,为众多产业带来更多创新应用。AIoT旨在使个人获得安全、舒适与便利的最佳服务体验,通过设备收集外部数据进行深度学习,利用多层次神经网络训练系统,再以高运算力进行行为预测,仿人类做出判断决策。然而深度学习需要将大量的内存和CPU资源存于大型服务器,在传统的云端模式中,将数据直接导回云端进行处理,除了建设成本高,还须考虑信息传送延迟以及安全隐私风险等问题。
因应企业对数据传输的延迟性、信息安全以及可靠性日益重视,通过数字转型将终端设备进行边缘计算,让更多的运算工作放在靠近数据产生的地方,在传输数据的过程中,尽可能地减少往返时间,避免因通讯中断而使设备发生错误信号,同时加快反应效率、降低成本、提高可靠性和安全性。MCU在实现边缘AI(Edge AI)或终端AI(Endpoint AI)中成为主要关键核心,主要优势在于低功耗、开发速度快和开发成本低,从嵌入式机器学习(Embedded ML)到微型机器学习(Tiny ML)MCU都发挥了重要作用,根据性能的不同,用来进行AI运算的复杂程度也不同。
MCU-Based AI,强调实时决策和反应速度,具有低功耗、低延迟、低成本和高安全性的优势,结合数字信号处理器(DSP)和机器学习(ML),用于分类、辨识、预测及推理判断,如传感器侦测、电机振动分析和语音识别等技术,已应用于工业控制、电机控制和消费性电子等产业。更高性能的MCU可实现复杂的计算机视觉和成像应用,如指纹分析、面部辨识和协作机器人等。当AI算法不断更新,MCU也必须强化及扩充功能,才能确保其稳定性及安全性,将场景应用到更多产业中,实现真正的AIoT。随着装置联网需求渐增,形成规模化成长,大量的人机互动和高速通讯的拓展,系统日益复杂化,需要依靠人工智能来辅助人类管理及控制,实现高度「智」动化。
雅特力作为32位通用型MCU创新领导者,目前已有十二条产品线,分为低功耗、超值型、主流型、无线型和高效能五大系列,近200个型号,全系列采用55nm先进制程的ARM® Cortex®-M4高效能或M0+低功耗内核,高质量微控制器和完整的开发工具生态链,帮助客户快速导入产品、缩短生产周期并稳定供货。以下为雅特力AT32 MCU实现AIoT的四大关键优势。
高效能降低延迟和效率极大化
低延迟可用来实时控制和加快反应速率。主流型AT32F403A/407系列和高效能AT32F435/437系列MCU能够解决低延迟的难题,主频高达240MHz和288MHz,实现M4业界通用型MCU最高主频,同时支持FPU浮点运算,提供256~4032KB Flash、96~512KB SRAM超大内存选择,丰富的外设资源和可扩充性,支持XMC储存器扩增,和多通道12-bit高速ADC及DAC,将AT32 MCU关键应用组件和功能区块整合,提高开发效率并降低成本。AT32 MCU全系列产品中,AT32F435/437以其超高性能形成强大的竞争优势,CPU运算效能高达360DMIPS,CoreMark跑分可高达1002.74分(3.482 CoreMark/MHz),大幅提升设备运作效能。而通讯传输的稳定性作为串连整个物联网系统中的重要能力,AT32F407系列和AT32F437系列,兼容IEEE-802.3 10/100Mbps以太网络控制器,且AT32F435/437系列采用高速5.33Msps ADC独立引擎,提升传输速率和稳定性,满足各种运动控制和智能控制对高运算力的需求。
高精确度和可靠性
精确度通常与传感器或物联网节点应用相关,传感器具备感应、无线通信和处理信息的能力,通过AI算法推理、预测行为并做出判断,AT32 MCU正是针对此类需求提供了完美的解决方案。如超值型AT32F415系列,以高达150MHz的CPU速度和多种通讯接口优势,如UART、SPI、I2C、SDIO、USB OTG及CAN等丰富外设集成,应用于智能家居方案,成为Amazon合作伙伴之一。当MCU运行Amazon Connect Kit(ACK)协议,设置Wi-Fi连网,通过智能音箱Amazon Echo或Alexa APP语音控制,为传统墙面开关添加语音功能和调光控制系统,轻松升级智能调光开关;另一款超值型产品AT32F425,以USB OTG高性价比为特色,高达96MHz的CPU运算速度和120DMIPS CPU运算效能,CoreMark跑分可达326.57分(3.402 CoreMark/MHz)。内存最高可支持68KB Flash达最大空间使用和20KB SRAM,外设集成OTG控制器、CAN总线、红外线(IR)定时器、4组USART和一个2Msps的12-bit ADC等,由各项关键组件所组成,满足客户对于设备的高速数据采集和混合信号处理应用要求,降低开发难度与成本,同时提高精确度和确保信号的完整性。
低功耗运行和快速唤醒能力
由于终端设备要在短时间内进行高速数据采集和通讯传输,低功耗MCU在设备进行边缘运算时,能有效处理内存空间和通讯时间降低能耗。多数终端设备都采用电池作为主要供电来源,为延长其供电时间,AT32 MCU全系列支持睡眠(Sleep)、深睡眠(Deepsleep)及待机(Standby)三种模式,且具备多个WKUP引脚高速唤醒待机模式,实现低流运行、低流待机及快速唤醒能力。
常见的物联网应用小至家庭大至整个城市系统网络,无线则是串起IoT系统中最重要的通讯方式。当信号采集设备散布在各应用场景,无法依靠人工频繁地更换电池时,就必须通过低功耗MCU来维持设备的长时间运作,因此雅特力整合一款无线型AT32WB415微控制器,兼具低功耗和无线功能,采用蓝牙5.0,主频高达150MHz,CPU运算效能高达187.5DMIPS,CoreMark跑分可高达400.84分(2.672 CoreMark/MHz)。提供丰富的通讯接口及内存资源,集成蓝牙射频(RF)收发器和基带(baseband)功能,且蓝牙接收(RX)最大值可达到-97 dBm,发射功率(TX)介于-20 dBm至+4 dBm。产品中内置天线,支持超过30m有效范围距离传输,传输速度最快可达到2Mbps,AT32WB415系列在价格上具有竞争优势,对于一些成本敏感的联网装置不失为理想选择。
提升数据安全性和隐私
终端装置进行联网时会产生的大量敏感数据,为确保用户隐私和数据安全,MCU在数据储存中的受保护区管理(带有硬件的访问控制)和严格的编程流程规划以及操作中管理访问权限的应用至关重要。雅特力自行开发的sLib安全库(Security Library),可支持密码保护指定范围程序区,方案商烧录核心算法到此区域,提供给下游客户做二次开发,强化产品本身的安全性、可靠性和二次开发的使用便利性。通过建立完整的系统生态链,包含开发环境、实时操作系统(RTOS)以及通过雅特力验证的第三方软件资源,符合国际电工委员会(IEC)制定的IEC-60730国际安全标准规范,提供给工程人员便利性,有助于产品快速开发上市。
未来无论在哪个应用领域上,都需要更多的联网设备,尤其在工业物联网、消费性电子和无线产品等,这些设备都需具备多元的通讯和复杂的运算控制能力,因此更加需要32-bit MCU提供高运算、高速数据传输和强大的数据处理技术。身为MCU芯片开发者随时面临多方考验,例如效能提升、数据传输安全、设备联网通讯、无线传输的质量等议题。对此,雅特力正全力投入打造一个全方位的MCU平台生态系统,专注于开发ARM® Cortex®-M4/M0+内核MCU,内建数字信号处理器(DSP)、单精度浮点运算(FPU)、高速的CPU效能、相对业界更大的内存、丰富的外设、自主研发的sLib二次开发安全库,以及多样化的封装选择,适合物联网业者在有限预算的情况下,满足更高的规格要求和不同领域应用便利性,下一步将朝向28nm/40nm先进制程、高效能的市场研发精进,期望在主频效能、功耗和封装尺寸等各方面带来超越竞争对手的产品优势。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
J-Scope简介
什么是J-Scope
J-Scope是Segger推出的一款免费软件,用于MCU运行时,实时显示数据的波形。
J-Scope分为HSS和RTT两种模式:
1)HSS模式直接使用J-Scope加载MDK或IAR的可执行文件即可,操作简单但采样速度较慢;
2)RTT模式只需要在用户程序里添加Segger的RTT组件,操作稍麻烦但是采样速度更快更实用。
软/硬件版本
硬件-JLINK:常见的JLINK BASE需要V9及以上版本;而JLINK PRO或JLINK ULTRA使用V4及以上版本即可。
软件-MDK:MDK4或MDK5皆可。本专题配套的例程需使用MDK5。
支持的设备
1)J-Scope在HSS(High-Speed-Sampling)模式下支持的内核如下:
2)J-Scope在RTT(Real-Time Transfer)模式下支持的内核如下:
不同版本JLINK速度对比
截图中的数据主要对于HSS模式说的,而RTT模式没有这些限制,基本JLINK速度支持到多大,RTT就可以达到多大。
对于JLINK BASE来说,基本都是截图里面的Other选项,也就是说在HSS模式下支持10个变量采集,采样速度1KHz。
J-Scope环境准备
此处以MDK5为例,硬件以AT32F403A为例。
J-Scope安装
1)解压xx\AN0044_Segger_Jscope_on_AT32_MCU\JScopeTool\Setup_JScope_V6xxm.zip;
2)双击Setup_JScope_V6xxm.exe,开始安装。
3)点击点击NEXT,继续安装。
4)点击I Agree同意协议。
5)选择快捷方式添加位置,此处选择了添加到开始菜单,然后点击NEXT继续安装。
6)点击Browse选择安装路径。
7)在弹出的界面选择路径,然后点击确认。用户可自行选择安装路径,本示例选择安装在D:\tool\J_Scope。
8)点击Install开始安装。
9)点击Finish完成安装。
安装AT32相关package
先解压xx\AN0044_Segger_Jscope_on_AT32_MCU_2.x.x\JScopeTool\PACKs_V2.x.x.zip;
然后再解压Keil5_AT32MCU_AddOn.zip
然后分别安装ArteryTek.AT32F403A_407_DFP.2.x.x.packSegger_AT32MCU_AddOn.exe。
安装ArteryTek.AT32F403A_407_DFP.2.x.x.pack
1)双击ArteryTek.AT32F403A_407_DFP.2.x.x.pack开始安装。
2)点击NEXT继续安装。
3)点击Finish完成安装。
安装Segger_AT32MCU_AddOn.exe
1)双击Segger_AT32MCU_AddOn.exe开始安装。
2)在弹出界面点击Browse以选择安装路径。
3)选择安装路径:注意,安装路径必须选择JLink的安装路径,否则找不到JLinkDevices.xml,无法安装。
4)点击Start,开始安装。
5)若安装成功,会绿色字体提示安装成功。
6)若安装失败,则会红色字体提示失败原因:此处是安装路径不对,因此找不到JLinkDevices.xml文件。重新安装,正确选择安装路径为JLink安装路径即可。
HSS(High Speed Sampling) 模式
HSS模式简介
HSS模式比较简单,仅需大家将MDK生成的可执行文件xxx.axf或者IAR生成的可执行文件xxx.out文件加载到JScope软件里面即可。
硬件连接:使用标准的下载接口(VCC,GND,SWDIO,SWCLK和NRST)或三线JLINK-OB(GND,SWDIO,SWCLK)即可。
优势:随时可以连接目标板,不影响目标板的正常功能,不需要额外资源。无需用户写目标板代码。
劣势:相对RTT模式,采样速度慢,基本固定在1KHZ左右,仅适用于变量变化速度低于1KHZ的情况。
使用方法
此处以MDK5为例,硬件以AT32F403A为例。
生成可执行文件
打开MDK工程,编译、下载程序,并生成可执行文件HSS.axf。
新建工程
打开J-Scope后,新建工程:
配置工程
1)JLINK接口选择:大家通常使用的JLINK都是USB接口,所以此处选择USB。
2)目标器件选择:此处选择AT32F403AVGT7。
3)目标接口和速度选择:
目标接口:根据应用程序配置,选择SWD/JTAG均可。本例程选择的SWD,所以这里也选择SWD。
JLINK速度:JLINK速度配置不要太高,这里选择4000kHz。
4)模式选择:此处选择HSS。
5)选择可执行文件:此处在MDK例程的路径里找到可执行文件(HSS.axf)。
6)配置完成,点击ok,完成配置。
选择要查看的变量
1)打勾选中;
2)点击ok。
开始运行
1)单击红点,开始显示数据。
2)此时跳出警告,点击OK即可。
RTT(Real Time Transfer) 模式
RTT模式简介
RTT模式类似于串口上传数据。需要移植RTT组件,配置上行缓冲区,发送数据等操作。
硬件连接:使用标准的下载接口(VCC,GND,SWDIO,SWCLK和NRST)或三线JLINK-OB(GND,SWDIO,SWCLK)即可。
优势:
- 允许比HSS更高的数据采样速度,高达2 MB/S。即使目标上有512字节的小缓冲区,也可以达到1 MB/S。
- 数据采集与目标板应用程序的执行同步,因为应用程序决定何时采样数据。
- 时间戳等数据可以添加到数据样本中。
劣势:
- 需要移植RTT组件等操作,较HSS模式更麻烦一些。
使用方法
移植RTT组件
1)将以下4个文件复制到MDK工程路径下,并添加进工程。
2)使用下述函数,配置上行缓冲区:
第一个参数:buffer索引--此处选择1;
第二个参数:数据格式--固定格式为JScope_xy;
xy支持的格式如下:
例如:
"JScope_u4u2":表示包含32bit无符号数据和16bit无符号数据,且数据顺序按照u4u2的排列顺序。
"JScope_t4i4u2":表示包含32bit 时间戳,32bit有符号数据和16bit无符号数据,且数据顺序按照t4i4u2的排列顺序。
第三个参数:缓冲区buffer选择;
第四个参数:buffer size;
第五个参数:模式--使用RTT模式的话,最后一个参数仅支持SEGGER_RTT_MODE_NO_BLOCK_SKIP和SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL。此处选择SEGGER_RTT_MODE_NO_BLOCK_SKIP。
3)调用SEGGER_RTT_Write函数发送数据:
4)编译、下载应用程序。
打开J-Scope,新建工程
配置工程
1)JLINK接口选择:大家通常使用的JLINK都是USB接口,所以此处选择USB。
2)目标器件选择:此处选择AT32F403AVGT7。
3)目标接口/速度选择:
目标接口:根据应用程序配置,选择SWD/JTAG均可。本例程选择的SWD,所以这里也选择SWD。
JLINK速度:这里选择默认的4000kHz。
4)模式选择:此处选择RTT。
5)配置完成,点击ok,完成配置。
开始运行
单击红点,开始显示数据。
J-Scope软件介绍
界面介绍
数据导出
J-Scope支持导出CSV或原始的RAW格式的数据。
1)若采样正在进行,则需要先停止运行:
2)点击File->Export Data:
3)填写文件名->点击保存:
4)打开RTT.CSV可以看到存储的数据,如下图:
快捷键
例程
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
HSS模式
1)解压并打开xx\AN0044_Segger_Jscope_on_AT32_MCU_2.x.x\SourceCode\J-Scope_HSS_V2.x.x。
2)应用程序定义两个全局变量Test_Data1,Test_Data2。
3)新建J-Scope工程,再选中采样变量(Test_Data1,Test_Data2),再点击开始运行即可。
RTT模式
1)解压并打开xx\AN0044_Segger_Jscope_on_AT32_MCU_2.x.x\SourceCode\J-Scope_RTT_V2.x.x.
2)移植RTT组件;
3)main.c包含SEGGER_RTT.h文件;
4)定义两个全局变量Test_Data1,Test_Data2;5)上行缓冲区配置:
5)上行缓冲区配置:
6)数据输出:
7)然后新建J-Scope RTT工程,再点击运行即可观察波形。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
必要的代码准备
程序中开启FPU
打开system_at32f4xx.c文件,找到函数void SystemInit (void),确保内核有开启FPU功能,如图1黑斜体字部分。
注意:程序中开启FPU是必要条件。若仅开启Keil或IAR上的FPU,程序中未开启,则程序运行时会进入hardfault.
Keil中配置FPU
开启FPU
Options for Target->Target->Floating Point Hardware,选择Use Single Precision
关闭FPU
Options for Target->Target->Floating Point Hardware,选择Not Used
IAR中配置FPU
开启FPU
Options->General Options->FPU,选择VFPv4 single precision
关闭FPU
Options->General Options->FPU,选择None
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。
概述
AT32F4xx使用的是ARM Cortex®-M4F内核。ARM Cortex®-M4F是带有FPU内核处理器是一款32位的RISC处理器,具有优异的代码效率,采用通常8位和16位器件的存储器空间即可发挥ARM内核的高性能。该处理器支持一组DSP指令,能够实现有效的信号处理和复杂的算法执行。其单精度FPU(浮点单元)通过使用元语言开发工具,可加速开发,防止饱和。
本文重点介绍基于AT32 MCU的DSP指令相关库函数及其简单应用示例,主要内容有:
- ARM Cortex®-M4F内核
- ARM官方CMSIS DSP库概述
- CMSIS DSP库移植到AT32
- 常用示例展示
- CMSIS NN with DSP
注意:本文是基于AT32F403A的硬件条件,若使用者需要在AT32其他型号上使用,请修改相应配置即可。
AT32 MCU与M4F内核
AT32F403A系列与所有的ARM工具和软件兼容。
这些丰富的外设配置,使得AT32系列微控制器适合于多种应用场合:
- 消费类产品
− 手持云台
− 微型打印机
− 条形码扫描枪
− 读卡器
− 灯光控制
- 物联网应用
− 智能家居应用
− 物联网传感器节点
- 工业应用
− 双CAN应用(OBD-II)
− 光电编码器
− 充电桩/BM
− 机器人控制
− 电力控制
- 电机控制
− BLDC/PMSM电机控制
− 变频器
− 伺服电机控制
系统架构
AT32F403A系列微控制器包括ARM® CortexTM-M4F处理器内核、总线架构、外设以及存储器构成。CortexTM-M4F处理器是一种新时代的内核,拥有许多先进功能。对比于CortexTM-M3,CortexTM-M4F处理器支持增强的高效DSP指令集,包含扩展的单周期16/32位乘法累加器MAC、双16位MAC指令、优化的8/16位SIMD运算及饱和运算指令,并且具有单精度IEEE-754浮点运算单元FPU。当设计中使用带DSP功能的CortexTM-M4F时就能格外节能,比软件解决方案更快,使CortexTM-M4F适用于那些要求微控制器提供高效能与低功耗的产品市场。
1) Cortex-M4内核架构
2) Cortex-M4与Cortex-M3的区别
3) 部分DSP指令的介绍
注意:上面所有的指令操作在CM4处理器上都只需一个指令周期。
4) Cortex-M4 DSP指令比较
5) 编译器对DSP指令的支持
6) AT32F403A系统架构
注意:AT32F403A不支持EMAC,AT32F407/407A支持EMAC
ARM官方CMSIS DSP库概述
CMSIS DSP库说明
CMSIS DSP软件库,是针对使用Cortex-M内核芯片提供一套数字信号处理函数。CMSIS DSP库大部分函数都是支持f32,Q31,Q15和Q7四种格式的。该库分为以下几个功能:
- 基本数学函数Basic math functions
- 快速数学函数Fast math functions
- 复数型数学函数Complex math functions
- 滤波器函数Filters
- 矩阵型函数Matrix functions
- 数学变换型函数Transform functions
- 电机控制函数Motor control functions
- 统计型数学函数Statistical functions
- 支持型数学Support functions
- 插补型数学函数Interpolation functions
针对以上每一种类型的库函数,下文会有详细介绍其使用方法和使用示例。
CMSIS DSP库文件
考虑到方便用户使用,ARM官方已编译好Cortex-M各型号的.lib库文件,并放置于Lib文件夹。与AT32F4xx相关的.Lib库文件主要有以下两种
- arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) for AT32F403 and AT32F413
- arm_cortexM4l_math.lib (Cortex-M4, Little endian) for AT32F415
DSP库函数的声明位域头文件arm_math.h中,用户只要简单地将该头文件和.lib文件添加到自己的工程中,即可呼叫DSP库函数。该头文件对于浮点运算单元(FPU)的变量同样适用。
CMSIS DSP库示例
该CMSIS DSP库中的多个示例可以很好地展现DSP库函数的使用。
CMSIS DSP库的工具链支持
该DSP库已经可以在5.14版本MDK上开发和测试过。另外针对GCC编译器和IAR IDE,已经支持。
编译生成DSP的.lib库文件
该DSP安装包中已包含一个基于MDK的工程,通过编译该工程可生成需要的.lib库文件。该MDK工程位于CMSIS\DSP\Projects\ARM文件夹中。工程名为
- arm_cortexM_math.uvprojx
通过打开并编译该arm_cortexM_math.uvprojx MDK工程,可以生成该DSP的.lib库文件。这样用户就可以根据特定的内核,特定的优化选择去编译特定DSP的.lib库文件。同时,通过该MDK工程,用户也可以查看与修改指定的库函数原型,便于了解库函数的实现原理。
CMSIS-DSP文件夹结构
以下表格展现了CMSIS-DSP文件夹结构
CMSIS DSP库移植到AT32
本文主要介绍DSP库在MDK上的移植方法。
ARM官方CMSIS DSP函数详解
- 基本数学函数Basic math functions
- 快速数学函数Fast math functions
- 复数型数学函数Complex math functions
- 滤波器函数Filters
- 矩阵型函数Matrix functions
- 数学变换型函数Transform functions
- 电机控制函数Motor control functions
- 统计型数学函数Statistical functions
- 支持型数学Support functions
- 插补型数学函数Interpolation functions
详细使用方法和使用案例请参考
1) ARM官网DSP培训资料
地址:http://www.keil.com/pack/doc/CMSIS_Dev/DSP/html/index.html
AT32 DSP库快速使用
硬件资源
1) 指示灯LED2/LED3/LED4
2) USART1(PA9/PA10)
3) AT-START-F403A V1.0实验板
注:该DSP demo是基于AT32F403A的硬件条件,若使用者需要在AT32其他型号上使用,请修改相应配置即可。
软件资源
1) Libraries
- drivers AT32底层驱动库
- cmsis CMSIS DSP库和CMSIS NN库
2) Project\AT_START_F403A
- examples,本文使用到的示例,如5_1_arm_class_marks_example,“5_1”表示章节,“arm_class_marks_example”表示示例名称
- templates,基于.lib建立的DSP template工程
3) Doc
a) AN0036_DSP_Instruction_and_Library_on_AT32_ZH_V2.x.x.pdf
DSP demo使用
1) 打开AT32_DSP_DEMO_2.x.x\project\at_start_xxx\templates,编译后下载到实验板
2) 观察LED2/LED3/LED4,若依次翻转则表明程序有正确执行DSP函数。
常用示例展示
本节主要通过使用前面介绍的DSP库函数进行案列展示,展示的示例如下:
- 班级成绩统计示例
- 卷积示例
- 点积示例
- 频率仓示例
- 低通滤波示例
- 图形音频均衡器示例
- 线性插值示例
- 矩阵示例
- 信号收敛示例
- 正弦余弦示例
- 方差示例
- 卷积网络神经示例
班级成绩统计示例
描述:
演示使用最大,最小,均值,标准差,方差和矩阵函数来统计一个班级的成绩。
注意:
此示例还演示了静态初始化的用法。
变量说明:
- estMarks_f32:指向20名学生在4门学科中获得的分数
- max_marks:最高分成绩
- min_marks:最低分成绩
- mean:所有成绩的平均分
- var:所有成绩的方差
- std:标准差
- numStudents:学生总数
使用到DSP软件库的函数有:
- arm_mat_init_f32()
- arm_mat_mult_f32()
- arm_max_f32()
- arm_min_f32()
- arm_mean_f32()
- arm_std_f32()
- arm_var_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_1_arm_class_marks_example
卷积示例
描述:
本示例主要展示基于复数 FFT、复数乘法与支持函数的卷积理论。
算法:
卷积理论指出,时域中的卷积对应频域中的乘法。因此,两个信号的卷积后的傅里叶变换等于他们各自的傅里叶变换的乘积。使用快速傅里叶变换(FFT)可以有效的评估信号的傅里叶变换。
两个输入信号a[n]和b[n]填充为零,n1和n2分别对应其信号长度。因此他们的长度将变为N,N大于或等于n1+n2-1。由于采用基4变换,因此基数为4。a[n]和b[n]的卷积是通过对输入信号进行FFT变换,对联更新好进行傅里叶变换。并对相乘后的结果进行逆FFT变换来获得的。
由以下公式表示:
A[k]=FFT(a[n],N)
B[k]=FFT(b[n],N)
conv(a[n], b[n])=IFFT(A[k]*B[k], N)
其中A[k]和B[k]分别是信号a[n]和b[n]的N点FFT。卷积长度为n1+n2-1
框图:
变量说明
- testInputA_f32:指向第一个输入序列
- srcALen: 第一个输入时序的长度
- testInputB_f32:指向第二个输入序列
- srcBLen:第二个输入时序的长度
- outLen:卷积输出序列的长度,(srcALen+srcBLen-1)
- AxB:指向FFT乘积后输出数组地址
使用到DSP软件库的函数有:
- arm_fill_f32()
- arm_copy_f32()
- arm_cfft_radix4_init_f32()
- arm_cfft_radix4_f32()
- arm_cmplx_mult_cmplx_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_2_arm_convolution_example
点积示例
描述:
本示例主要展示如何使用相乘和相加来实现点积。两个向量的点积是通过将对应元素相乘并相加来获得的。
算法:
将长度为n的两个输入向量A和B诸个元素相乘,然后相加以获得点积。
由以下公式表示:
dotProduct=A[0]*B[0]+A[1]*B[1]+...+A[n-1]*B[n-1]
框图:
变量描述:
- srcA_buf_f32:指向第一个输入向量
- srcB_buf_f32:指向第二个输入向量
- testOutput:存储两个向量的点积
使用到DSP软件库的函数有:
- arm_mult_f32()
- arm_add_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_3_arm_dotproduct_example
频率仓示例
描述:
该示例主要展示使用复数FFT,复数幅值和最大值函数在输入信号的频域中计算最大能量仓。
算法:
输入测试信号为一个10 kHz信号,该信号具有均匀分布的白噪声。通过计算输入信号的FFT计算可以得到与10 kHz输入频率相对应的最大能量仓。
框图:
图8展示了具有均匀分布白噪声的10 kHz信号的时域信号,图9展示了这个输入信号的对应的频域信号,其中出现最高点的数对应的频率即为10 kHz信号能量仓。
输入信号的频域
变量描述
- testInput_f32_10khz:指向输入数据
- testOutput:指向输出数据
- fftSize l:FFT的长度
- ifftFlag flag:用于选择 CFFT/CIFFT
- doBitReverse Flag:用于选择是顺序还是逆序
- refIndex:参考索引值,在该值处能量最大
- testIndex:计算出的索引值,在该值处能量最大
使用到DSP软件库的函数有:
- arm_cfft_f32()
- arm_cmplx_mag_f32()
- arm_max_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_4_arm_fft_bin_example
FIR低通滤波示例
描述:
使用FIR低通滤波器从输入中去除高频信号部分。本示例展示了如何配置FIR滤波,然后以块方式传递数据。
算法:
输入信号时两个正弦波的叠加:1 kHz and 15 kHz.该信号将被截止频率为6 kHz的进行低通滤波。
低通滤波器滤掉了15 kHz信号,仅留下1 kHz信号输出。
低通滤波器采用MATLAB设计,采样率为48 kHz,长度为29点。生成滤波器的MATLAB代码如下:
h=fir1(28, 6/24);
第一个参数是过滤器的“顺序”,并且总是比所需长度小1,。第二个参数是归一化截止频率。范围是0(DC)到1.0(Nyquist)。24 kHz奈奎斯特频率的6kHz截止频率为6/24=0.25归一化频率。
CMSIS FIR滤波器函数要求系数按时间倒序排列。
所得滤波器系数如下图所示。需要注意的是,该滤波器是对称的(线性相位FIR滤波器的属性)。对称点是样本14,对于所有频率,该滤波器具有14个样本的延迟。
接下来显示滤波器的响应。滤波器的带通增益为1.0,截止频率为6kHz时达到0.5。
输入信号如下所示。左侧显示时域信号,右侧显示频域。可以清楚的看到两个正弦波分量。
滤波器输出如下所示,15kHz分量已被消除。
变量描述:
- testInput_f32_1kHz_15kHz:指向输入数据
- refOutput points to the reference output data:指向参考输出数据
- testOutput points to the test output data:指向测试输出数据
- firStateF32 points to state buffer:指向状态缓冲区
- firCoeffs32 points to coefficient buffer:指向系数缓冲区
- blockSize number of samples processed at a time:一次处理的样本数
- numBlocks number of frames:帧数
使用到DSP软件库的函数有:
- arm_fir_init_f32()
- arm_fir_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_5_arm_fir_example
图形音频均衡器示例
描述:
本示例展示了如何使用Biquad级联函数构造5频段图形均衡器。在音频应用中使用图形均衡器来改变音频的音质。
框图:
该设计是基于五级滤波器的级联
每个滤波器部分均为40阶,由两个Biquad级联组成。每个滤波器的标称为0 dB(线性单位为1.0)并对特定频率范围内的信号进行增强或截止。5个频率段之间的边缘频率为100、500、2000和6000 Hz。每个频段都有一个可调的增强或消减范围,范围为+/- 9 dB。列如,从500到2000 Hz的频宽具有如下所示响应:
以1 dB为步长,每个滤波器共有19种不同的设置。在MATLAB中预先计算了所有19中可能设置的频率器系数,并将其存储在表格中。使用5个不同表格,总共有5x19=95个不同的4阶过滤器。所有95个响应如下所示:
每个4阶滤波器具有10个系数,意味着排列成950个不同滤波器系数。输入和输出数据为Q31模式。为了获得更好的噪声性能,两个低频算使用高精度 32x64 位双二阶滤波器。本示例中的输入信号使用对数线性调频。
数组bandGains指定以dB为单位的增益应用于每个带宽。例如,如果bandGains={0, -3, 6, 4, -6};那么输出信号将是:
注意:
输出线性调频信号跟随着每个带宽的增益或增强而变化。
变量描述:
- testInput_f32:指向输入数据
- testRefOutput_f32:指向参考输出数据
- testOutput:指向测试输出数据
- inputQ31:临时输入缓冲区
- outputQ31:临时输出缓冲区
- biquadStateBand1Q31:指向band1的状态缓冲区
- biquadStateBand2Q31:指向band2的状态缓冲区
- biquadStateBand3Q31:指向band3的状态缓冲区
- biquadStateBand4Q31:指向band4的状态缓冲区
- biquadStateBand5Q31:指向band5的状态缓冲区
- coeffTable:指向所有频段的系数缓冲区
- gainDB:增益缓冲器,其增益适用于所有频段
使用到DSP软件库的函数有:
- arm_biquad_cas_df1_32x64_init_q31()
- arm_biquad_cas_df1_32x64_q31()
- arm_biquad_cascade_df1_init_q31()
- arm_biquad_cascade_df1_q31()
- arm_scale_q31()
- arm_scale_f32()
- arm_float_to_q31()
- arm_q31_to_float()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_6_arm_graphic_equalizer_example
线性插值示例
描述:
本案示例展示了线性插值模型和快速数学模型的用法。方法1使用快速数学正弦函数通过三次插值计算正弦值。方法2使用线性插值函数并将结果与参考输出进行比较。示例显示,与快速数学正弦计算相比,线性插值函数可用于获得更高的精度。
算法1:使用快速数学函数进行正弦计算
算法2:使用插值函数进行正弦计算
变量描述:
- testInputSin_f32指向用于正弦计算的输入值
- testRefSinOutput32_f32指向由matlab计算得到输出参考值p
- testOutput指向由三次插值计算得到的输出缓冲
- testLinIntOutput指向由线性插值计算得到的输出缓冲
- snr1参考输出和三次插值输出的信噪比
- snr2参考输出和线性插值输出的信噪比
使用到DSP软件库的函数有:
- arm_sin_f32()
- arm_linear_interp_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_7_arm_linear_interp_example
矩阵示例
描述:
该示例展示了使用矩阵转置、矩阵乘法和矩阵求逆函数应用于最小二乘法处理的输入数据。最小二乘法是用于查找最佳拟合曲线,该曲线可使给定数据及的偏移平方和(最小方差)最小化。
算法:
做考虑参数的线性组合如下:
The linear combination of parameters considered is as follows:
A*X=B, where X is the unknown value and can be estimated from A & B.其中X表示未知值,可以根据A和B进行估算。
最小二乘法估算值X由以下公式算出
X=Inverse(AT*A)*AT*B
框图:
变量描述:
A_f32 input matrix:线性组合方程的输入矩阵
B_f32 output matrix:线性组合方程的输出矩阵
X_f32 unknown matrix:矩阵A_f32和B_f32估计而得到的未知矩阵
使用到DSP软件库的函数有:
arm_mat_init_f32()
arm_mat_trans_f32()
arm_mat_mult_f32()
arm_mat_inverse_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_8_arm_matrix_example
描述:
演示了展示了FIR低通滤波传递函数的自适应滤波器“学习”能力,使用到的函数有归一化LMS滤波器,有限冲击相应(FIR)滤波器和基本数学函数来。
算法:
下图说明了此示例的信号流。均匀分布的白噪声通过FIR低通滤波器进行滤波。FIR滤波器的输出为自适应滤波器(标准化LMS滤波器)的提供参考输入。白噪声是自适应滤波器的输入。自适应滤波器学习FIR滤波器的传递函数。该滤波器输出两个信号:
(1)内部自适应FIR滤波器的输出
(2)自适应滤波器与FIR的参考输出之间的误差信号。随着自适应的滤波器不断学习学习FIR滤波器的传递函数,第一个输出将会接近于FIR滤波器的参考输出,误差信号也会不断接近于零。
即使输入信号具有大的变化范围(即,从小到大变化),自适应滤波器也能正确收敛。自适应滤波器的系数初始化为零,在1536个样本上,内部函数test_signal_converge()找到停止条件。该功能检查误差信息的所有值是否都低于阈值DELTA的幅度。
框图:
变量描述:
testInput_f32:指向输入数据
firStateF32:指向FIR状态缓冲区
lmsStateF32:指向归一化最小方差FIR
FIRCoeff_f32:指向系数缓冲区
lmsNormCoeff_f32:指向归一化最小方差FIR滤波器系数缓冲区
wire1, wir2, wire3:临时缓冲区
errOutput, err_signal:临时错误缓冲区
使用到DSP软件库的函数有:
arm_lms_norm_init_f32()
arm_fir_init_f32()
arm_fir_f32()
arm_lms_norm_f32()
arm_scale_f32()
arm_abs_f32()
arm_sub_f32()
arm_min_f32()
arm_copy_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_9_arm_signal_converge_example
正弦余弦示例
描述:
Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector Multiplication, and Vector Addition functions.
通过使用正弦,余弦,向量乘法和向量加法函数演示三角学的勾股定理
算法:
数学上,勾股三角学恒等式由以下方程式定义:
sin(x)*sin(x)+cos(x)*cos(x)=1
其中x为弧度值
框图:
变量描述:
testInput_f32:以弧度为单位的角度输入数组
testOutput stores:正弦值和余弦值的平方和
使用到 DSP 软件库的函数有:
arm_cos_f32()
arm_sin_f32()
arm_mult_f32()
arm_add_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_10_arm_sin_cos_example
方差示例
描述:
演示如何使用基本函数和支持函数来计算 N 个样本的输入序列的方差,将均匀分布的白噪声作为输入。
算法:
序列的方差是各序列与序列平均值的平方差的平均值。
这有以下等式表示:
variance=((x[0]-x')*(x[0]-x')+(x[1]-x')*(x[1]-x')+...+*(x[n-1]-x')*(x[n-1]-x'))/(N-1)
其中,x[n]是输入序列,N输入样本数,x是输入序列x[n]的平均值。
平均值x的定义如下:
x'=(x[0]+x[1]+...+x[n-1])/N
框图:
变量描述:
testInput_f32:指向输入数据
wire1, wir2, wire3 :临时数据缓冲区
blockSize:一次处理的样本数
refVarianceOut:参考方差值
使用到DSP软件库的函数有:
arm_dot_prod_f32()
arm_mult_f32()
arm_sub_f32()
arm_fill_f32()
arm_copy_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_11_arm_variance_example
CMSIS NN with DSP
介绍
本用户手册介绍了CMSIS NN软件库,这是一个有效的神经网络内核的集合,这些内核的开发旨在最大程度地提高性能,并最大程度地减少神经网络在Cortex-M处理器内核上的存储空间。
该库分为多个函数,每个函数涵盖特定类别:
神经网络卷积函数
神经网络激活功能
全连接层功能
神经网络池功能
Softmax函数
神经网络支持功能
该库具有用于对不同的权重和激活数据类型进行操作的单独函数,包括8位整数(q7_t)和16位整数(q15_t)。功能说明中包含内核的描述。本文[1]中也描述了实现细节。
例子
该库附带了许多示例,这些示例演示了如何使用库函数。
预处理器宏
每个库项目都有不同的预处理器宏。
ARM_MATH_DSP:
如果芯片支持DSP指令,则定义宏ARM_MATH_DSP。
ARM_MATH_BIG_ENDIAN:
定义宏ARM_MATH_BIG_ENDIAN来为大型字节序目标构建库。默认情况下,为小端目标建立库。
ARM_NN_TRUNCATE:
定义宏ARM_NN_TRUNCATE以使用floor而不是round-to-the-nearest-int进行计算
卷积神经网络示例
描述:
演示了使用卷积,ReLU激活,池化和全连接功能的卷积神经网络(CNN)示例。
型号定义:
本示例中使用的CNN基于Caffe [1]的CIFAR-10示例。该神经网络由3个卷积层组成,其中散布有ReLU激活层和最大池化层,最后是一个完全连接的层。网络的输入是32x32像素的彩色图像,它将被分类为10个输出类别之一。此示例模型实现需要32.3 KB的存储权重,40 KB的激活权和3.1 KB的存储im2col数据。
神经网络模型定义
变量说明:
conv1_wt,conv2_wt,conv3_wt是卷积层权重矩阵
conv1_bias,conv2_bias,conv3_bias是卷积层偏置数组
ip1_wt,ip1_bias指向完全连接的图层权重和偏差
input_data指向输入图像数据
output_data指向分类输出
col_buffer是用于存储im2col输出的缓冲区
scratch_buffer用于存储激活数据(中间层输出)
CMSIS DSP软件库使用的功能:
arm_convolve_HWC_q7_RGB()
arm_convolve_HWC_q7_fast()
arm_relu_q7()
arm_maxpool_q7_HWC()
arm_avepool_q7_HWC()
arm_fully_connected_q7_opt()
arm_fully_connected_q7()
请参阅
AT32_DSP_DEMO\project\at_start_f403a\examples\6_1_arm_nnexamples_cifar10
门控循环单元示例
描述:
使用完全连接的 Tanh / Sigmoid 激活功能演示门控循环单元(GRU)示例。
型号定义:
GRU是一种递归神经网络(RNN)。它包含两个S型门和一个隐藏状态。
计算可以总结为:
z[t]=Sigmoid(W_z⋅{h[t-1],x[t]})
r[t]=sigmoid(W_r⋅{h[t-1],x[t]})
n[t]=tanh(W_n⋅[r[t]×{h[t-1],x[t]})
h[t]=(1-z[t])×h[t-1]+z[t]×n[t]
变量说明:
update_gate_weights,reset_gate_weights,hidden_state_weights 是与更新门(W_z),重置门(W_r)和隐藏状态(W_n)对应的权重。
update_gate_bias,reset_gate_bias,hidden_state_bias是图层偏置数组
test_input1,test_input2,test_history 是输入和初始历史记录
缓冲区分配为:
|重置|输入|历史|更新| hidden_state |
这样,由于(复位,输入)和(输入,历史记录)在存储器中被物理地隐含,所以自动完成隐含。
权重矩阵的顺序应相应调整。
CMSIS DSP 软件库使用的功能:
arm_fully_connected_mat_q7_vec_q15_opt()
arm_nn_activations_direct_q15()
arm_mult_q15()
arm_offset_q15()
arm_sub_q15()
arm_copy_q15()
请参阅
AT32_DSP_DEMO\project\at_start_f403a\examples\6_2_arm_nnexamples_gru
DSP Lib的生成和使用
本节主要讲解如何将DSP源码打包为不同内核MCU所使用的lib文件。在Artery所提供的DSP包中没有包含官方所提供的lib文件,但包含了可生成lib文件的ARM、GCC、IAR三种编译环境的工程,用户可根据自己的需要选择适用的lib文件来进行生成。亦可将生成的lib文件替换掉工程中的DSP源码。下面分为两个部分来讲解lib文件的生成和使用。
DSP Lib生成
下面以ARM编译环境为例,展示如何生成所需的lib文件:
1) 打开SourceCode\libraries\cmsis\DSP\Projects\ARM中的Keil工程;
2) 在①处select target下拉框选择所需生成的lib文件;
3) 点击②处进行编译;
4) 待③处显示lib文件生成信息;
5) 在SourceCode\libraries\cmsis\DSP\Lib\ARM中查看生成的lib文件。
DSP Lib使用
下面以5_1_arm_class_marks_example为例,展示如何使用lib文件:
1) 点击①处打开manage project items界面;
2) 点击②处,将③处内容全部删除;
3) 点击④处找到SourceCode\libraries\cmsis\DSP\Lib\ARM路径下的lib文件进行添加;
4) 点击OK,编译工程。
来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。