LP-MSPM0L1306开发板试用体验---数字电源输出模块
开箱照
在拿到开发板之前,我在21ic平台及TI的教育在线课堂收看多期MSPM0L1306这颗Cortex-M0+内核的芯片的讲座。MSPM0L1306具有我们现在常用的Cortex-M0+的内核指令集,与现在的通用MCU一致,最主要是Keil无需要更换,代码编译环境不用变更,没有再学习的成本。MSPM0L1306又具有较其它通用MCU更强大的模拟外设功能,比如ADC模数转换,OP放大器,COMP比较器等。总之,挺期待这颗芯片的。这不,试用的机会就来了,赶紧申请之。
拿到快递后,我迫不及待地拆开包装。映入眼帘的是TI公司万年不变的红色主题,仍然是lanchpad系列的基调——从MSP430,再到Tiva系列。拿到板子,仔细端详,可以深刻体会到设计人员的良苦用心:
- 跳线帽设计,同一个功能,通过跳线帽可以直接对比。做对比实验,完全不需要再自行设计电路;
- 按键凹槽设计,设计人员将按键放置在PCB板的边缘,并贴心地设计了凹槽,特别方便按键按下,即使表贴按键比较小;
- 芯片小小的三围设计,应该面向于小模块,如Iot设备,电表等,芯片的三围非常小,与板载的调试器芯片形成了鲜明对比
接下来,让我们通过一组照片来欣赏一下吧!
开发环境搭建
Keil MDK是ARM旗下的一款嵌入式编译开发环境,拥有多年的行业应用经验。本人也一直使用Keil开发环境做为主要的嵌入式软件代码编译工具。前面提到过,MSPM0L1306芯片是基于Cortex-M0+内核的芯片,因此,Keil软件可以通过安装器件包的方式增加其编译器件支持。于是,我们在Keil官方网站上下载支持MSPM0L1306器件的器件包TexasInstruments.MSPM0L11XX_L13XX_DFP.1.2.1.pack,并安装,如下图所示:
为了加快我们开发,我还下载了官方的SDK,里面包含了TI公司MSPM0系列的硬件驱动库,外设示例代码,开发板的项目示例代码等。
另外,官方的外设、引脚配置工具sysconfig也建议下载,方便我们配置GPIO、时钟、外设功能等寄存器。
下图就是我的工程文件图:
文档结构完成了,剩下的就是编写代码了。先编写一个LED灯闪烁与Uart输出字符串的实验。由于使用了sysconfig工具软件,其实我自己编写的代码量挺低的。
int main(void)
{
uint8_t i;
DL_SYSCTL_disableSleepOnExit();
DL_SYSTICK_init(32000);
DL_SYSTICK_enableInterrupt();
DL_SYSTICK_enable();
bsp_init();
while (1)
{
if (timeline_ms > 500)
{
timeline_ms = 0;
DL_GPIO_togglePins(GPIO_RGB_PORT, GPIO_RGB_GREEN_PIN);
JPRINTF("hello 21ic.com\r\n");
}
}
}
void SysTick_Handler(void)
{
timeline_ms++;
}
我们再来看看实验效果:
也玩模拟,小试模拟外设
之前很少接触模拟电路,主要原因还是自己的模拟电路知识不扎实,不实用,而模拟电路又很吃水平,所以一直对模拟电路相关的应用敬而远之。今天借MSPM0L1306开发板小试一下,不过,也仅仅使用ADC外设来读取电压值。
实验的硬件电路图如下:
原理图上的J1跳线帽我们短接1-2。将RT热敏电阻直接分压进入ADC_CHANNEL_9(PA15引脚)。
我们再使用TI官方的SysConfig图形化配置软件配置ADC外设,并生成C语言代码。
这里,我没有使用示例里面的TIMER触发的方式,而是采用了软件触发,但转换完成依然使用了中断的方式。
我设计了ADC采样流程的状态机,所以在ADC转换完成后,触发完成中断后将信号量通知Poll程序的方式升级为了状态机转换。状态机流转图如下图所示:
核心代码如下:
int main(void)
{
uint8_t i;
uint16_t val;
uint32_t ret;
int16_t rt_temperature = 0;
DL_SYSCTL_disableSleepOnExit();
SYSCFG_DL_init();
JPRINTF("hello 21ic.com\r\n");
rt_adc_state = adc_idle;
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
/* Confirm VREF has settled before triggering ADC12 conversion */
while (DL_VREF_CTL1_READY_NOTRDY == DL_VREF_getStatus(VREF))
;
while (1)
{
if (timeline_ms > 1000)
{
timeline_ms = 0;
DL_GPIO_togglePins(GPIO_GRP_0_PORT, GPIO_GRP_0_PIN_0_PIN);
if (rt_adc_state == adc_idle)
{
DL_ADC12_startConversion(ADC12_0_INST);
rt_adc_state = adc_converting;
}
}
if (rt_adc_state == adc_ready)
{
val = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
DL_ADC12_enableConversions(ADC12_0_INST);
rt_temperature = thermistor_calc_temperature(val);
JPRINTF("temperature is %d[%04X]\r\n", rt_temperature, val);
rt_adc_state = adc_idle;
}
}
}
void SysTick_Handler(void)
{
timeline_ms++;
}
void ADC12_0_INST_IRQHandler(void)
{
switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
{
case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
{
rt_adc_state = adc_ready;
break;
}
default:
break;
}
}
我们将结果通过串口打印出来,显示如下:
我家的室温24度左右,中间部分数据升高是我在向温度电阻吹气。
我在本实验中,没有使用示例中的VCCA做为参考电压,而是使用了内部2.5v。对于ADC转换值与温度的对应关系我也没有采用官方的曲线拟合的方式,而是使用查表的方式。
从上面的实验看,似乎TI的MSPM0L1306与其它MCU没有什么区别!其实是我没有发挥其高级功能,比如低功率模式。此部分待**后有需求再来验证。
试试OPA
TI推出MSPM0L1306其芯片内部集成了OPA,至此,硬件电路设计上面完全可以抛弃外部OPA的分离器件了。在测量电流时亦能根据电流的大小来动态配置OPA的增益值来实现对测量精度,测量范围,从而达到收益最大化。
本次实验的硬件电路,我们选择光电二极管。
跳线帽全部安装上,即使用OPA0外设,驱动代码的生成我们仍然使用SysConfig软件。
本次实验中,ADC外设我们采用Timer触发的方式,采集数据结果通过串口打印出来。
下面贴出来核心代码和运行结果。
总结
TI沉寂多年后,再次牵手ARM公司推出Cortex-M0+内核MCU,发力低功耗与模拟外设,充分利用其强大模拟与数字技术雄厚背景。通过几个亲测实验,大家应该也都深刻体会到了其高集成度下的优势,这种优势一定会转化为我们项目中的效益!
致谢
感谢TI公司提供MSPM0L1306开发板!感谢21ic论坛提供机会!感谢论坛网友,群友提供的各种帮助!
|