#申请原创#
在芯片国产化日益高涨的情况下,一些新的芯片厂家脱颖而出如以串口通讯发展起来字的沁恒微电子的WCH、兆易创新的GD、雅特力的AT、中科蓝讯的AB及国民技术等。 其中的国民技术则属于后起之秀,其主打的产品有基于M0内核的N32G03X 通用系列、基于M4内核的N32G45X 通用系列及面向低功耗的N32L4XX系列。 这样在选取低功耗MCU时,我们就多出了一种选择,也加大了设计的灵活性。 此外,国民技术所主打的3个系列产品是支持以MDK来进行开发的,这样对于那些出道早的程序者就天然地增添了一份亲近感,你可别 小看了这份亲近感,常言道“不怕千招会,就怕一招熟”,用惯的东西好上手,它起到事半功倍的性能。 下面就有请我们的主角N32L43XRL-STB开发板上场,它的MCU为N32L436CBL7,其最高主频可达108MHz,是采用LQFP48 管脚封装。 该芯片的主要性能及参数为: l 采用 32 位 ARMCortex-M4 内核+ FPU,支持单周期硬件乘除法指令,支持 DSP 指令和 MPU。 l 高达 128KByte片内 Flash,10万次擦写次数,10 年数据保持。 l 高达 32KByte片内 SRAM ,包括 24KbyteSRAM1和 8 Kbyte SRAM2。 l 高性能模拟接口,含 1 个 12bit 5MspsADC,且多种精度可配置、2 个轨到轨运算放大器、2 个高速模拟比较器、多达 24 通道电容式触摸按键、1 个采样率为1Msps的12bit DAC。 l 丰富的通信接口,有3 个 USART接口、2 个 UART接口、1 个 LPUART、2 个速率高达 27 MHz的 SPI 接口、2 个速率高达 1 MHz 的I2C 接口、1 个 USB2.0 Fullspeed Device 接口及1 个 CAN 2.0A/B总线接口。 l 多样的定时计数器,有2 个 16bit 高级定时计数器、5 个 16bit 通用定时计数器、2 个 16bit 基础定时计数器、1 个 16bit 低功耗定时计数器、1x24bit SysTick、1x 7bit 窗口看门狗、1x 12bit 独立看门狗 所以它在性能方面是完成可以胜任常规芯片要求的,下面再看一下我们最为关注的一个指标,那就是它的功耗情况。 在Standby模式下:典型值为1.5uA,即所有备份寄存器保持, IO保持,可选 RTC Run,8KByte Retention SRAM 保持,可快速唤醒。 在Stop2 模式下:典型值为3uA,RTC Run ,8KByte Retention SRAM2 保持,CPU寄存器保持, IO保持,可快速唤醒。 在Run 模式下:90uA/MHz @108MHz/3.3V, 100uA/MHz @72MHz/3.3V。 下面就将N32L43XRL-STB开发板与N32G45XVL-STB开发板放到一起做一下功耗的对比。当然这是在都配有调试下载工具的情况下,会比单纯的芯片对比要大一些,但相对来讲还是比较公平。 经检测,N32L43XRL-STB开发板的功耗为0.13135W,N32G45XVL-STB开发板的功耗为0.15392W,净差值为0.02257 W。 图1 开发板的对比 图2 N32L43XRL-STB的功耗 图3 N32G45XVL-STB的功耗
如何构建开发环境: 前面说过国民技术的MCU是支持MDK来开发的,那么对于N32L4x系列的开发板是如何来构建其开发环境的呢? 首先要做的自然是要安装MDK,其版本可以是V5.25。 随后为支持此类芯片的使用,需安装Nationstech.N32L43x_DFP.0.1.0。 这样再打开MDK,就可在芯片列表中见到N32L4x系列的身影,见图4所示。 图4 添加芯片支持 至此,开发环境就基本构建好了。 此外,为了便于了解和学习程序的设计方法,还应下载一个函数库与例程,其压缩包为Nationstech.N32L43x_Library.1.1.0.7Z。 以例程LedBlink为例,经编译其结果如图5所示。 图5 完成编译 为进行下载测试,需按图6所示来设置调试工具的类型,并按图7所示来选取烧录算法。 图6 设置调试工具 图7 设置烧录算法
在开发板上载有3个彩色LED,其电路原理图见图8所示,使用例程就可见到图9所示的流水灯效果。 仿照该例程,可获得GPIO口的使用方法,并实现开发板的功能扩展。 图8 原理图 图9 测试效果
驱动相应器件的功耗对比 1)OLED屏显示及功耗 OLED屏是一种自发光的显示器件,但又较之数码管要更节省电能。此外,对I2C接口的OLED屏来讲,它的引脚少又能节省对GPIO口资源的占用,且所显示的信息及形式更丰富,故极适合与N32L43X系列这样的芯片相配合来设计低功耗产品。 那在N32L43X系列芯片的开发环境下,要实现I2C接口的OLED屏驱动是否容易呢? 其实要实现起来并不复杂,所需要的只是2个GPIO口及相应等级的延时函数支持,从而保证以GPIO口模拟的方式来完成I2C通讯。 在OLED屏与开发板按一下关系来连接的情况下: SCL----PA1 SDA----PA2 对引脚功能的配置函数为: void OLEDInit(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}
而输出高低电平的引脚定义为: #define OLED_SCLK_Clr() GPIOC->PBA = GPIO_PIN_1 #define OLED_SCLK_Set() GPIOA->PBSC = GPIO_PIN_1 #define OLED_SDIN_Clr() GPIOA->PBC = GPIO_PIN_2 #define OLED_SDIN_Set() GPIOA->PBSC = GPIO_PIN_2
延时函数的配备: 由于在MDK的开发板平台下,并未提供毫秒级和微秒级延时的函数,因此需要使用系统的滴答时钟来自行设计。 微秒级延时函数: void Delayus(uint32_t count)
{
SysTick_Delay_Us(count);
}
毫秒级延时函数: void Delayms(uint32_t count)
{
count=count*1000;
SysTick_Delay_Us(count);
}
使用微秒级延时函数的I2C启动函数为: void IIC_Start()
{
OLED_SCLK_Set();
Delayus(2);
OLED_SDIN_Set();
Delayus(2);
OLED_SDIN_Clr();
Delayus(2);
OLED_SCLK_Clr();
Delayus(2);
}
有了以上的基础,就不难将OLED屏的驱动功能移植给N32L43X系列芯片。 实现OLED屏显示功能测试的主程序为: int main(void)
{
LedInit(PORT_GROUP2, LED3_PIN);
OLEDInit();
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"N32L43x ",16);
OLED_ShowString(20,2,"OLED TEST",16);
OLED_ShowString(20,4,"jinglixixi",16);
OLED_ShowString(20,6,"2022.3.2",16);
while (1)
{
LedOn(PORT_GROUP2, LED3_PIN);
Delayms(500);
LedOff(PORT_GROUP2, LED3_PIN);
Delayms(500);
}
}
在OLED屏显示的情况下,其整体功耗如图10所示。 图10 功耗测试
2)传感器检测及功耗 以BMP085温度大气压传感器为例,其器件的连接关系为: OLED_CLK_PIN --- PA1 OLED_DIN_PIN --- PA2 BMP_CLK_PIN --- PB0 BMP_DIN_PIN --- PB1
读取传感器数据的语句定义为: #define IIC_SDA_IN GPIO_ReadInputDataBit(GPIOB, GPIO_PIN_1)
实现数据引脚输入输出功能定义的函数为: void IIC_INPUT_MODE_SET()
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up; //GPIO_No_Pull GPIO_Pull_Down
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
}
void IIC_OUTPUT_MODE_SET()
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
}
模拟I2C发送字节数据的函数为: void BMP085_Send_Byte(char txd)
{
char t;
IIC_OUTPUT_MODE_SET();
SCL_Clr();
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
SDA_Set();
else
SDA_Clr();
txd<<=1;
SysTick_Delay_Us(2);
SCL_Set();
SysTick_Delay_Us(2);
SCL_Clr();
SysTick_Delay_Us(2);
}
}
读取温度大气压的函数为: void bmp085Convert()
{
unsigned int ut;
unsigned long up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;
ut = bmp085ReadTemp();
up = bmp085ReadPressure();
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = ((b5 + 8) >> 4);
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
pressure = p+((x1 + x2 + 3791)>>4);
}
检测温度大气压的主程序为: int main(void)
{
LedInit(PORT_GROUP2, LED3_PIN);
BMP085_Init();
Init_BMP085();
OLEDInit();
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"N32L43x ",16);
OLED_ShowString(20,2,"OLED & BMP085",16);
OLED_ShowString(20,4,"t= C",16);
OLED_ShowString(20,6,"p= KPa",16);
while (1)
{
bmp085Convert();
OLED_ShowNum(44,4,temperature/10,3,16);
OLED_ShowNum(44,6,pressure/100,5,16);
LedOn(PORT_GROUP2, LED3_PIN);
Delayms(500);
LedOff(PORT_GROUP2, LED3_PIN);
Delayms(500);
}
}
在添加传感器的情况下,其显示效果及整体功耗分别如图11和图12所示。 图11 显示效果 图12 整体功耗
至此,就在N32L43XRL-STB开发板上完成了温度大气压检测装置的设计,并针对其低功耗的特点对相应环境的功耗进行了跟踪测量。尽管测试的工具不很专业,但它还是能够带来一个很直观的感性认识。所以在低功耗的设计中,使用N32L43X芯片是可行的也是十分方便的,其功耗也是能够达到认可的!
源码:
|