首先感谢EEPW提供这次TI活动学习的机会。
本课程学习的主要目的是了解MSPM0L1306的GPIO和PWM的控制。
一、GPIO和PWM硬件。
1、按键输入:开发板提供两个按键S1和S2。
S1按键:PA18默认外部下拉,检测高电平有效,配置IO时需要内部下拉或悬空;
S2按键:PA14悬空无外部上下拉电阻,检测低电平有效,配置IO时需要内部上拉。
本次学习使用PA14按键。
2、LED指示灯:开发板提供2颗LED灯,一颗单红色LED1,一颗三色LED2。
LED1:LED阳极接电源,阴极接IO,为灌电流驱动方式,设置IO-PA0为输出0时点亮LED灯。
LED2:LED阴极接地,阳极接IO,为拉电流驱动方式,设置IO-PA26/PA13/PA27为输出1时点亮LED灯。
本次学习使用PA26/PA13/PA27,对应LED颜色为红绿蓝。设置红绿蓝灯循环点亮。
3、PWM:本次未使用杜邦线,选择使用PA0口为PWM输出,点亮LED1。
从规格书可以得知:PA0作为PWM使用时,需要配置为TIMG1_C0,即配置为TIMG1的通道0。
二、软件配置
TI提供多种IDE工具,本次学习使用TI原厂的IDE-CCS12.7.0.00007_win64,在TI官网即可下载。
另外还需要下载SDK和Sysconfig工具,本次学习资料包中有提供。
mspm0_sdk_2_00_00_03中包含MSPM0L1306的SDK开发板,有很多例程可直接用IDE导入。
sysconfig-1.20.0_3587-setup为Sysconfig硬件引脚配置工具,安装完后可以不管,在IDE工具中可直接调用。
三、代码实现
1、第一次打开IDE工具,是空白的,没有工程项目。若加载过工程项目,打开之后会自动加载默认路径下没有移除的工程。本次为了快捷开发,直接调用了SDK中的空例程。
在IDE工具 Project 中选择导入工程项目:Project -> Import CCS Projects...
2、由于导入的是空白工程,需要手动加入自己需要的硬件配置。
首先添加按键IO:
其次添加LED灯IO:
最后添加PWM:
3、配置完sysconfig之后,先保存,并编译一次。确保工程中的sysconfig得到更新。
ti_msp_dl_config.c和ti_msp_dl_config.h:配置完sysconfig后,编译更新。里面包含了系统和sysconfig中硬件配置的初始化,GPIO,PWM等函数。
empty.c:主函数main()。用户编写代码区域,实现用户功能。
4、配置烧录调试器。
四、完整代码。
#include "ti_msp_dl_config.h"
#define LEDR_ON DL_GPIO_setPins(USER_LEDS_PORT, USER_LEDS_LEDR_PIN)
#define LEDR_OFF DL_GPIO_clearPins(USER_LEDS_PORT, USER_LEDS_LEDR_PIN)
#define LEDG_ON DL_GPIO_setPins(USER_LEDS_PORT, USER_LEDS_LEDG_PIN)
#define LEDG_OFF DL_GPIO_clearPins(USER_LEDS_PORT, USER_LEDS_LEDG_PIN)
#define LEDB_ON DL_GPIO_setPins(USER_LEDS_PORT, USER_LEDS_LEDB_PIN)
#define LEDB_OFF DL_GPIO_clearPins(USER_LEDS_PORT, USER_LEDS_LEDB_PIN)
#define Key2Tmp DL_GPIO_readPins(USER_KEYS_PORT, USER_KEYS_KEY2_PIN)
int main(void)
{
uint32_t DutyTmp = 0;
SYSCFG_DL_init();
while (1)
{
if (Key2Tmp == 0)
{
LEDR_OFF;LEDG_OFF;LEDB_OFF;
delay_cycles(100000);
DutyTmp += 5;
if(DutyTmp > 5000) DutyTmp = 0;
DL_TimerG_setCaptureCompareValue(PWM0_INST, DutyTmp, DL_TIMER_CC_0_INDEX);
}else
{
DutyTmp = 0;
DL_TimerG_setCaptureCompareValue(PWM0_INST, 0, DL_TIMER_CC_0_INDEX);
LEDR_ON;LEDG_OFF;LEDB_OFF;
delay_cycles(16000000);
LEDR_OFF;LEDG_ON;LEDB_OFF;
delay_cycles(16000000);
LEDR_OFF;LEDG_OFF;LEDB_ON;
delay_cycles(16000000);
}
}
}
完结、共进!