# 【MSPM0L1306 LaunchPad】 小白上手日记 part3
自从上一次搭建好了开发环境以后,接下来就是一些点灯操作了。这一次我试验了三个不同的例程,以及一个板载自带的温度传感器的例程,来试验一下这个板子的性能。不过在开发的时候也遇到了很多的问题。
# 点灯例程
首先就是官方自带的三个gpio翻转的例程。
这三个例程是通过三种不同的方法进行点灯操作的
第一个是使用硬件切换寄存器的三个 GPIO 引脚。第二个是使用C++切换三个GPIO引脚。第三个是切换已配置为高阻抗(Hi-Z)的 GPIO。主动地强制逻辑低,而逻辑高将引脚设置为高阻抗。
而在使用这三个官方例程进行点灯操作的时候,我发现只有第一个和第二个例程可以刷写进开发板,而第三个不论怎么他都刷不进开发板中,总是会出现下面这样的错误报告。
再然后我又尝试了热敏电阻控制LED的官方示例发现也同样出现了上面的错误。
最后鼓捣了半天,我发现只要将示例中的项目名称、C文件以及system config文件的名称缩短就可以正常的进行编译和刷写了。
感觉是因为文件名称太长了,编译器无法识别或者无法进行生成,TI这么大个厂,这个BUG就有点说不过去了。
# 点灯效果
```
#include "ti_msp_dl_config.h"
int main(void)
{
/* 打开GPIO电源,将引脚初始化为数字输出。 */
SYSCFG_DL_init();
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_2_PIN);
DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_LED_3_PIN);
while (1)
{
/*调用togglePins来翻转LED 1-3的当前值。该函数会导致GPIO硬件中的相应位被翻转,无需处理器执行额外的读-修改-写循环*/
delay_cycles(10000000);
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN|GPIO_LEDS_USER_LED_2_PIN|GPIO_LEDS_USER_LED_3_PIN);
}
}
```
根据上面的代码,可看到,其实TI也像STM32一样封装了一层类似HAL库的函数,无需直接操作寄存器就可以实现功能,而且也大大的增加了代码的可读性。
# 热敏电阻控制LED效果
```
#include "ti_msp_dl_config.h"
#include
#define CHANGEFACTOR 10
volatile uint16_t gThermistorADCResult = 0;
volatile bool gCheckThermistor = false;
volatile uint32_t gCelcius_reading = 0;
volatile uint32_t gInitial_reading = 0;
volatile uint16_t gAlivecheck =0;
int main(void)
{
SYSCFG_DL_init();
DL_GPIO_clearPins(RGB_PORT,(RGB_RED_PIN | RGB_GREEN_PIN | RGB_BLUE_PIN));
NVIC_EnableIRQ(ADC_INST_INT_IRQN);
gCheckThermistor = false;
/* 启动定时器,触发ADC采样。 */
DL_TimerG_startCounter(THERMISTOR_TIMER_ADC_INST);
bool first_reading = true;
while (1)
{
while (gCheckThermistor == false)
{
__WFE();
}//Insert Thermistor Algorithm
gCelcius_reading = gThermistorADCResult;
if (first_reading) {
gInitial_reading = gCelcius_reading;
first_reading = false;
}
/*LED的变化基于当前样本与前一个样本的比较。如果新样本比初始温度高CHANGEFACTOR,将LED设置为红色。 如果新样本比初始温度低CHANGEFACTOR,将LED设置为蓝色。否则,LED保持绿色。变量gAlivecheck用于调试窗口,以确认代码是否正在执行。在最终应用中不需要它。*/
gAlivecheck++;
if(gAlivecheck >= 0xFFF0){gAlivecheck =0;}
if (gCelcius_reading - CHANGEFACTOR > gInitial_reading)
{
DL_GPIO_clearPins(RGB_PORT, (RGB_GREEN_PIN | RGB_BLUE_PIN));
DL_GPIO_setPins(RGB_PORT, RGB_RED_PIN);
}
else if (gCelcius_reading < gInitial_reading - CHANGEFACTOR)
{
DL_GPIO_clearPins(RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
DL_GPIO_setPins(RGB_PORT, RGB_BLUE_PIN);
}
else
{
DL_GPIO_clearPins(RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
DL_GPIO_setPins(RGB_PORT, RGB_GREEN_PIN);
}
gCheckThermistor = false;
__WFI();
}
}
/* 此中断在每当新的ADC转换结果准备就绪时触发,转换结果存储在gThermistorADCResult中。*/
void ADC_INST_IRQHandler(void)
{
switch (DL_ADC12_getPendingInterrupt(ADC_INST)) {
case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
gThermistorADCResult =
DL_ADC12_getMemResult(ADC_INST, DL_ADC12_MEM_IDX_0);
gCheckThermistor = true;
break;
default:
break;
}
}
```