- 2024-03-15
-
回复了主题帖:
车规级的MCU芯片,与常规芯片开发有何不同?
其实车规级和普通的使用倒没什么区别 就是车规级可靠性更高一些
- 2024-02-17
-
回复了主题帖:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
秦天qintian0303 发表于 2024-2-14 23:26
准备避坑啊
主要是之前我这里测试是坏的 厂家说没坏 寄回来 然后又坏了
-
回复了主题帖:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
秦天qintian0303 发表于 2024-2-14 23:26
不过体积和便捷性上有优势啊
这个倒是 一般测试要求的话便携示波器是能胜任的
- 2024-02-13
-
回复了主题帖:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
qwqwqw2088 发表于 2024-2-13 09:56
示波器是不是按键设置乱了,复位键一下自动测试试试,一般不容易坏的
虚拟示波器还是没台式的靠谱啊
-
回复了主题帖:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
littleshrimp 发表于 2024-2-13 09:02
什么示波器这么爱坏?
虚拟示波器 梦源的
-
回复了主题帖:
【雅特力AT32A403A 车规MCU开发板】+定时器输出不同占空比带死区的互补方波
qwqwqw2088 发表于 2024-2-13 10:00
最后测试的定时器输出不同占空比带死区的互补方波波形还是比较标准的
是的 比较标准
- 2024-02-12
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+用DAC输出可调正弦波
第八篇:用DAC输出可调正弦波
这篇文章将来测评AT32A403A的DAC输出正弦波。
AT32A403A搭载一个12位的DAC,更新速率最快为1MSPS,共有两个通道。同时内置的输出增益可以用来减少输出阻抗,无需外部运放即可直接驱动负载。
不使能输出增益时的输出电压范围更大,输出基本轨到轨,使能后输出不是轨到轨,有200mV左右的抬升。
-----------------------开始移植------------------------
这里需要用到的资源包括DAC。
首先,在Hardware文件夹中新建DAC.c等C文件及其对应的h头文件。
选择DAC1对应的PA4输出,使用软件触发,不开启缓存。不采用例程中的DMA,初始化比较简单。
因为这里我们要生成一个正弦波,所以要计算出输出正弦波所需要的数字量。这里直接用sin()函数计算,要添加<math.h>头文件,具体的计算公式为:
其中Sine_Dot_Num为一个波形所包含的点数,点数越多,波形越精细,但生成的波形频率越低,因为DAC的更新速率是固定的。
这里需要注意的是,DAC的正弦波数据表要先生成好再一起写入输出,因为一边计算一边输出可能会影响DAC每个点的更新速率。
最后,通过dac_1_data_set函数输出模拟量
。
-----------------------实际测试------------------------
尝试不同的输出点数:50、100、200,经过实际测试,点数100基本能用,因为示波器突然损坏,过年的时候没法修,所以无法截图,等有机会再截图吧。(已经坏了两次了 很难受)
得出结论,如果用这个DAC输出正弦波的话,频率最好限制在10KHz以下,不然基本不可用。当然了MCU内置的DAC也一般不是用来生成中高频的任意波的,毕竟不是高速DAC,就是用来生成静态的电压。
至此,DAC输出正弦波就测评好啦,处于可用状态。
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+定时器输出不同占空比带死区的互补方波
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+定时器输出不同占空比带死区的互补方波
第十篇:定时器输出不同占空比带死区的互补方波
这篇文章将来测评AT32A403A的硬件定时器输出方波
AT32A403A有17个定时器,包括2个高级定时器、10个通用定时器、2个基本定时器、2个WDT定时器和1个系统滴答定时器。这里我将用AT32A403A的高级定时器定时器1输出方波。
定时器1支持输出7个通道的PWM,其中3组可为互补通道,这次测试就用到这3组。
首先,在hardware文件夹中新建TIMER1.cc等C文件及其对应的h头文件。
第二步,通过WorkBench配置AT32A403A的硬件定时器,选择TIMER1,GPIO的话选择PE脚,以免跟PA9、PA10冲突
通道模式选择通道X和通道X互补输出,通道4关闭。
周期值选择9999,这样就能输出20KHz的方波
这里的周期缓冲没有使能,开启后在溢出事件发生后才将寄存器里的数据更新
接下来设置通道的输出模式,这里选择PWM模式A,其他模式可查看参考手册。设置的占空比为正占空比,而通道数据是用来调整占空比的。其他通道类似。
最后来设置一个死区时间。死区时间能设置成0-255,具体这个数值不知道代表多少时间,我这里先设置成10,看看实际效果。
最后导出代码,记得要使能PE GPIO的时钟,可以看到输出的波形是正常,分别是第一通道、第二通道、第三通道,占空比分别为10%、40%、80%。至于为什么测量到的占空比不是设置的值,那是因为加入了死区。死区时间大致为83ns。至此定时器测试完毕。
- 2024-02-08
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+ CoreMark跑分
第九篇:CoreMark跑分
接下来,我将给单片机跑个分。选择MCU时,我们一方面当然是要满足自身项目的要求,另一方面更偏向于选择性价比更高的MCU。
基于单片机的性能跑分就应运而生了,常见的性能测试就包括CoreMark和Dhrystone。
Dhrystone是由Reinhold P. Weicker在1984年提出来的一个基准测试程序,其主要目的是测试处理器的整数运算和逻辑运算的性能。Dhrystone首先用Ada语言发布,后来Rick Richardson为Unix开发了用C语言编写的Version 1.1,这个版本也成功的推动了Dhrystone的广泛应用。Dhrystone标准的测试方法很简单,就是单位时间内跑了多少次Dhrystone程序,其指标单位为DMIPS/MHz。MIPS是Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。DMIPS中的D是Dhrystone的缩写,它表示了在Dhrystone标准的测试方法下的MIPS。
但其缺陷在于它易受编译器影响。在Dhrystone中有大量的字符串复制语句,用来测量字符串复制的性能。然而Dhrystone中字符串的长度不变,并且均开始于自然对齐的边界,这两点便与真实的程序不同。因此一个优化性能好的编译器能够在去掉循环的情形下通过一连串字的移动替代对字符串的复制,这将会快很多。同时Dhrystone代码量过小,在现代CPU中,它能够被放进指令缓存中,所以它并不能严格的测量取指性能。虽然Dhrystone的测试可以作为参考,但更容易受到其他因素的影响下。
而CoreMark能接近实际地反应出工作能力。它是由嵌入式微处理器基准测试联盟(EEMBC)开发,为了取代过时的Dhrystone标准。ARM官方也是建议使用CoreMark而不是Dhrystone来进行基准测试。
软件使用C语言编写,是一个免费使用,易于移植的基准测试程序。目前CoreMark已经成为测量与比较各类处理器性能的业界标准基准测试。CoreMark得分越高,意味着性能更高。下图为CoreMark与Dhrystone对比
来源于网络
CoreMark的模拟工作负载主要包含几种常用的算法:
矩阵操作core_matrix.c:模拟常用的运算;
链表操作core_list_join.c:模拟指针的各种用法;
状态机操作core_state.c:模拟程序分支运行操作;
循环冗余校验core_util.c:嵌入式系统常见的功能。
接下来,我们开始移植CoreMark。
第一步,先去官网在相应位置下载源代码,网站为www.eembc.org
第二步,新建一个工程,添加好必要组件,再新建一个子文件夹CoreMark,将core_list_join.c、core_main.c、core_matrix.c、core_state.c、core_util.c、coremark.h放入其中,再新建一个子文件夹CoreMark_Test,将simple文件夹中的core_portme.c和core_portme.h放入其中。同时打开工程,将上述的c文件添加到工程,记得不要忘了添加路径哦。
第三步,因为在core_main.c文件里已经有main()函数,所以我们要将原来工程中的main函数屏蔽或删除,我这里选择屏蔽,选择main.c,右键选择第一个,将下图include in Target Build勾选去掉,如下图所示,
最重要的移植工作是适配core_portme.c,,其他C文件不动。
首先,添加
------------------------------------------------------------------
#define SysTick_Counter_Disable ((uint32_t)0xFFFFFFFE)
#define SysTick_Counter_Enable ((uint32_t)0x00000001)
#define SysTick_Counter_Clear ((uint32_t)0x00000000)
__IO uint32_t Ticks;
#define ITERATIONS 6666;
------------------------------------------------------------------
前三行是系统滴答定时器SysTick的配置参数,全局变量Ticks ITERATIONS这个视情况而定,如果出现ERROR! Must execute for at least 10 secs for a valid result!,那么需要将此数值变大使程序运行时间至少在10秒以上。
同时,将以下代码屏蔽
------------------------------------------------------------------
#define NSECS_PER_SEC CLOCKS_PER_SEC
#define CORETIMETYPE clock_t
#define GETMYTIME(_t) (*_t = clock())
#define MYTIMEDIFF(fin, ini) ((fin) - (ini))
#define TIMER_RES_DIVIDER 1
#define SAMPLE_TIME_IMPLEMENTATION 1
#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)
static CORETIMETYPE start_time_val, stop_time_val;
------------------------------------------------------------------
添加
#define EE_TICKS_PER_SEC 1000.0
将原有这三个函数修改为以下内容
------------------------------------------------------------------
void start_time(void)
{
Ticks=0;
SysTick_Config(SystemCoreClock / 1000);//1ms中断
}
void stop_time(void)
{
/* Stop the Timer and get the encoding time */
SysTick->CTRL &=SysTick_Counter_Disable;
/* Clear the SysTick Counter */
SysTick->VAL = SysTick_Counter_Clear;
}
CORE_TICKS get_time(void)
{
CORE_TICKS elapsed=(CORE_TICKS) Ticks;//(MYTIMEDIFF(stop_time_val, start_time_val));
return elapsed;
}
------------------------------------------------------------------
同时由于core_main.c中的main函数执行时先调用core_portme.c中的portable_init函数,因此需要将原来main函数中的初始化函数放到core_portme.c同时在portable_init函数里调用,如下图所示
第四步,修改core_portme.h和coremark.h.首先要适配ee_printf打印函数,因为我们的板子已经实现了printf函数,所以保持coremark.h下面代码块不变
------------------------------------------------------------------
#if HAS_PRINTF
#define ee_printf printf
#endif
------------------------------------------------------------------
这样程序调用时会将ee_printf替换成printf实现打印功能
如果板子没有printf函数,得自己实现打印函数并进行相应替换.
同时,将core_portme.h中的下列函数改成你对应的编译器版本和优化等级
------------------------------------------------------------------
#ifndef COMPILER_VERSION
#ifdef __GNUC__
#define COMPILER_VERSION "GCC"__VERSION__
#else
#define COMPILER_VERSION "ARM Compiler 5.06 update 7 (build 960)"//changed
#endif
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-g -O3 -Otime"//changed /* "Please put compiler flags here (e.g. -o3)" */
#endif
#ifndef MEM_LOCATION
#define MEM_LOCATION "STACK"
#endif
------------------------------------------------------------------
最后,因为我们是用系统滴答定时器来计时的,也就是start_time、stop_time、get_time所需要定时基准,所以要在at32a403a_int.c文件里面添加以下SysTick_Handler代码,并添加声明:extern uint32_t Ticks;
------------------------------------------------------------------
void SysTick_Handler(void)
{
Ticks++;
}
------------------------------------------------------------------
最后一步,将Optimization,也就是优化等级改成Level 3,同时勾选MDK 5的一个优化选项Optimize for time,当勾选时,CoreMark跑分会变高,原因大概是在keil中,在不选择"Optimize for time"编译选项时,局部float变量占用8个字节(编译器默认自动扩展成double类型),一旦你使用"Optimize for time"编译选项,局部float变量只会占用4个字节.也就是优化了很多不必要的累赘变量定义,能大大优化编译速度。
这里还需要注意一点,如果出现以下报错,可以尝试将Target中的“Use MicroLIB”勾选上,大概率解决报错。
编译,下载好后,如果都正常的话,用串口助手观察会出现以下信息
最后CoreMark分数为469分,这里尝试一下超频跑分,这里仅作示范,实际要稳定运行不建议超频,会存在隐患。超频是通过将crm_pll_config函数中的CRM_PLL_MULT_50改成CRM_PLL_MULT_64,就是将200MHz改成256MHz主频,最后的CoreMark为601分,与主频的提升幅度一致。
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+ CoreMark跑分
- 2024-01-31
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+ADC各通道的初步测试
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+ADC各通道的初步测试
第六篇:ADC各通道的初步测试
这篇文章将来测评AT32A403A的ADC、DMA。
首先,在hardware文件夹中新建ADC.c等C文件及其对应的h头文件。
第二步,通过WorkBench配置AT32A403A的硬件ADC,选择ADC1,这里我选择测三个电压:PA5外部电压、内部温度传感器、内部参照电压。采用的模式是序列模式,就是依次采样电压通道。具体参数看下图
这里需要注意几个点:
1、如果你想循环采样设置的电压通道,可以将反复模式开启。因为其一次触发后可以反复循环采样,不需要反复触发再采样,这样方便一些。ADC的触发方式有好多种,这里我就选择软件触发,简单一些。
2、然后你要采样几通道,就选择几个普通组通道数目,然后设置这几个电压通道的转换顺序和采样时间。
3、通常来说基本会把单片机的主频设定在最高频,也就是200MHz,这是这样就会出现一个问题,根据下面的时钟配置,ADC的时钟如果2分频,那么频率将会超过50M,这不符合最高28M的规定,但如果4分频,那么频率只有25M,达不到最高采样时钟,这就比较难受,或者可以将主频设置成112M,这样可以实现28M,但这就属于得不偿失了。所以它的采样率常用配置的话最高也就1、78MSPS。
第三步,配置ADC的DMA,这里我们通过DMA来将转换后的数据从外设转移到某一数组中,也就是外设到内存。至于为什么要用DMA来传输数据而不是用一个函数来读取呢,一是我发现所有的例程都是DMA来传输的,很奇怪,二来是我查看了给的库函数,发现没有读取序列模式下ADC的数据的库函数,其中第一个库函数不支持多个通道的情况。(注:也可能是我没注意到)
DMA的配置比较简单,数据宽度因为是12位,所以是半字,因为包含3个通道的数据,所以存放这3个数据的数组的内存地址是要递增的,外设地址则不需要。
这里也需要注意几个点:
WB生成的初始化代码是将①DMA的初始化;②DMA的外设和内存基址、数据个数设置;③DMA通道使能(main函数里)分开了,这里建议合在一起,免得搞乱,就像下图这样。
最后配置好所有所需函数,先初始化DMA,再初始化ADC。通过printf函数来打印PA5的ADC值、内部温度传感器的温度(电压)和内部基准电压。其中内部温度传感器的温度与电压的关系由数据手册提供,近似成线性关系。
这是串口打印结果,其中内部基准电压约为1.2V,符合1.16-1.24V的电压范围。内部温度约为40摄氏度,当然了,这温度肯定不是很准确,仅供参考嘛。
- 2024-01-30
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+结合NVIC进一步分析ADC采样
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+结合NVIC进一步分析ADC采样
第七篇:结合NVIC进一步分析ADC采样
这篇文章将通过NVIC来分析AT32A403A的ADC和DMA。
首先这里我要吐槽一点,雅特力的AT32A403A的参考手册和数据手册竟然都没有专门的篇幅讲NVIC,有也是散在了系统介绍中的《中断和异常向量》章节,像什么抢占优先级和子优先级都没介绍,这点对我来说是个不足的地方。
接着上一篇的的配置和程序,这次要开启NVIC中断。
一个是DMA的中断。DMA的中断总共有3种,这里我们选择传输完中断DMA_FDT_INT,使能方式也比较简单,就是在之前的代码上修改一下。
一个是ADC的中断,总共也有3种中断源,这里我选择通道转换结束标志位ADC_CCE_INT,使能要加一条语句:adc_interrupt_enable(ADC1, ADC_CCE_INT, TRUE);
然后要配置NVIC,这里选择NVIC_PRIORITY_GROUP_4,也就是16级的抢占优先级,数字越小优先级越高,系统级中断都是0级抢占优先级。
然后要在at32a403a_int.c里面添加对应的中断入口,当然了,这些WB都能生成的。在对应的中断入口函数中,首先要清零对应的中断标志位,这里为了查看中断发生的时间等参数,我在DMA传输完成后翻转LED2,ADC1转换好后翻转LED3.
这里注意一点,我发现在ADC的中断服务函数里面不加上adc_flag_clear(ADC1, ADC_CCE_INT);也就是不清零通道转换结束标志位也可以,刚开始我很奇怪,后来发现单片机内部在读取ADC的数据寄存器时就会自动清零了,而DMA已经设计好在转换好后读取ADC的数据寄存器,所以不软件清零也没关系,但是这只是这个标志位特殊,所以强烈建议在以后进入对应的中断服务函数后,一定首先要清零对应标志位。
最后用逻辑分析仪查看对应中断的时间。白色的是DMA中断、橙色的是ADC中断。
首先可以看到ADC每翻转一次的时间为30.25us,也就是说ADC1序列转换完成的间隔时间为30.25us,相对应的转换速率为33.06KHz。为什么是这个速率呢。首先我设置的采样时间为239.5个周期,加上固定的12.5周期,在25MHz的ADC时钟驱动下,单通道的转换速率为99.21KHz,因为是采集3个通道,所以理论上应为33.07KHz,与实际相符。
上图是DMA中断和ADC中断的时延,可以看到在ADC转换完成后,过了大约300ns,DMA也传输完成了,说明DMA从开始接收外设的请求到完成数据传输用了300ns,数据量为6个字节数据。速度不慢,估计数据量再大一些的话速度优势将更加明显。
这就是我对ADC采样的进一步分析,均符合理论设计。
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+ADC各通道的初体验
- 2024-01-27
-
发表了主题帖:
【雅特力AT32A403A 车规MCU开发板】+在OLED上显示RTC
第五篇:在OLED上显示RTC
这篇文章将来测评AT32A403A的硬件RTC。
我选用的OLED是市面上常见的0.96寸OLED,它支持I2C和SPI接口,这里我用AT32的硬件I2C将其驱动。
首先,在hardware文件夹中新建RTC.c等C文件及其对应的h头文件。新建的RTC.c文件源于官方提供的RTC例程,位置在AT32A403A_Firmware_Library_V2.0.1\project\at_start_a403a\examples\rtc\calendar\src里面
第二步,通过WorkBench配置AT32A403A的硬件RTC,记得要使能外部的32.768K晶振,是在CRM模块使能,要选择时钟振荡器。然后在时钟配置里面选择外部低速时钟lext,不然会选择到内置的lick作为时钟源,其为40khz,精度差。
最后在main函数里面放入对应的API,这里将RTC初始化和设置时间分离开,并将读取到的时间显示在OLED上。
这是最后的效果
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+在OLED上显示RTC
-
发表了日志:
【雅特力AT32A403A 车规MCU开发板】+I2C通讯及OLED显示