首页 > 评测 > 又一款IoT开发板-ADICUP3029开发板评测

又一款IoT开发板-ADICUP3029开发板评测

ADI   CUP3029   M3   ADICUP360   物联网    ESP8266   
  • 作者:zhanzr
  • 来源:21ic
  • [导读]
  • 最近在深圳的嵌入式展上,MOUSER携手ADI等厂牌推出现场免费送开发板的活动,笔者也去薅了一把羊毛。ADI的板子,平常大家应该接触的不多,从ADICUP3029来管窥一豹吧。

软件开发

因为是Cortex M3的内核,理论上使用任何可以开发Cortex M3的开发工具均可以开发之.当然需要有配合的芯片寄存器支持包才好,否则若要开发者按照数据手册来自己整理头文件,当然不是提倡的高效开发方式.目前该芯片支持的几种开发方式:

mbed篇

此方式为较为直观,但作者认为只是少数派人士的选择.本文不涉及.

IAR篇

此种方式与MDK工具类似,但是开发环境建立不如MDK方便,故此本文也不详述.

MDK篇

这个是作者提倡的方式.Keil MDK在经过ARM公司多年的悉心培养,已经是当今开发Cortex M应用的最佳工具之一.这里做重点介绍,本文的几个Demo也都是使用该工具开发的.

Demo1:最简单的程序框架

首先安装相关的设备包:

image13.png

图 相关设备支持包

以上几个设备支持包,都进行安装.

建立新工程,选择正确的芯片:

image14.png

图 选择器件

再选择如下几个RTE选项:

image15.png

图 选择RTE选项

严格说来,目前MDK对该设备的支持还不符合CMSIS标准,但是凑和着够用了.

再新建一个main.c,内容如下:

#include

#include

#include

#include

#include

typedef struct {

ADI_GPIO_PORT Port;

ADI_GPIO_DATA Pins;

} PinMap;

/* LED GPIO assignments */

PinMap LDS4 = {ADI_GPIO_PORT1, ADI_GPIO_PIN_15}; /* Blue LED on GPIO31 (DS4) */

PinMap LDS3 = {ADI_GPIO_PORT2, ADI_GPIO_PIN_0}; /* Green LED on GPIO32 (DS3) */

extern uint32_t SystemCoreClock;

int main(void)

{

uint8_t gpioMemory[ADI_GPIO_MEMORY_SIZE] = {0};

ADI_PWR_RESULT ePwrResult;

ADI_GPIO_RESULT eGpioResult;

ePwrResult = adi_pwr_Init();

ePwrResult = adi_pwr_SetClockDivider(ADI_CLOCK_HCLK, 1u);

ePwrResult = adi_pwr_SetClockDivider(ADI_CLOCK_PCLK, 1u);

/* common init */

common_Init();

/* Initialize GPIO driver */

eGpioResult= adi_gpio_Init(gpioMemory, ADI_GPIO_MEMORY_SIZE);

/* Enable LDS4 output */

eGpioResult = adi_gpio_OutputEnable(LDS4.Port, LDS4.Pins, true);

/* Enable LDS3 output */

eGpioResult = adi_gpio_OutputEnable(LDS3.Port, LDS3.Pins, true);

printf("ADICUP3029 LED UART Demo by zhanzr21 for 21ic BBS @ %u Hz\n", SystemCoreClock);

/* Loop indefinitely */

while (1)

{

adi_gpio_SetHigh(LDS3.Port, LDS3.Pins);

/* Delay between iterations */

for (volatile uint32_t i = 0; i < 1000000; i++)

;

adi_gpio_SetLow(LDS3.Port, LDS3.Pins);

/* Delay between iterations */

for (volatile uint32_t i = 0; i < 1000000; i++)

;

adi_gpio_SetHigh (LDS4.Port, LDS4.Pins);

/* Delay between iterations */

for (volatile uint32_t i = 0; i < 500000; i++)

;

adi_gpio_SetLow (LDS4.Port, LDS4.Pins);

/* Delay between iterations */

for (volatile uint32_t i = 0; i < 500000; i++)

;

}

return 0;

}

至此,我们的第一个demo,包含LED闪烁与串口的例程即宣告大功告成.如果需要修改默认的9600的波特率,请修改adi_uart_config.h中的相关系数.这就是上文提到的不规范之处,即某些内容(如波特率)还不能以图形化方式直观修改. 由此点可见,该器件的软件支持包还处在一个比较初级的状态,期待官方尽快加以完善.如果一切无误,该工程即可编译下载,现象是两灯闪烁以及串口有输出.代码的下载连接请参考文末的git连接.

Demo2: Dhrystone评测

有了以上的基础,下面来做一个dhrystone的评测,毕竟该MCU的性能也是值得关注的.

作评测,除了打印函数用以输出结果之外,最重要的就是计时函数.因为此芯片属于Cortex M3内核,所以有现成的SysTick可以使用.SysTick属于内核中的定时器而非外设,所以几乎所有的Cortex M3的MCU的该段代码完全一模一样:

#define HZ 1000

/* Configure SysTick */

SysTick_Config(SystemCoreClock/HZ);

volatile static uint32_t g_Ticks;

//SysTick的ISR

void SysTick_Handler(void)

{

g_Ticks++;

}

这样就可以了,值得一提的是上述这段代码可以直接拿到任何Cortex M内核的MCU上用.对于某些Cortex M内核,ARM公司的规范是SysTick可选,并非一定需要实现.但是截止目前还没有见到没有实现此定时器的例子.

  • 本文系21ic原创,未经许可禁止转载!

网友评论