入门教程:
玩转TI MSPM0L1306需要理解硬件特性和软件编程。
以下是我这边进行的步骤和考虑因素:
1. 了解硬件特性:
MSPM0L1306是一款基于Arm® Cortex®-M0+的32位微控制器,主频高达32MHz。
具有64KB的嵌入式闪存和4KB的片上RAM。
配备有高性能的模拟外设,12位1Msps SAR ADC、零漂移和零交叉斩波运算放大器(OPA)和通用放大器(GPAMP)等。
有四个16位通用定时器(TIMG),每个定时器具有两个捕捉/比较寄存器,支持待机模式下的低功耗运行。
内部ADC参考电压为1.4V或2.5V。
2. 工具:
安装TI提供的Code Composer Studio(CCS)或Keil等集成开发环境(IDE),这里我两个都安装了。
使用板载调试工具。
3. 编程方向:
需要有一定的C编程语言,MSPM0L1306的主要我这里是用的C编程语言。
微控制器的编程概念,中断、定时器、GPIO控制等就可以对入门任务基本完成了。
查阅MSPM0L1306的数据手册和参考手册,了解各个寄存器和功能的详细说明,这个非常的关键,不然不知道怎么玩,如果没有配对,也会出现错误,所以一定要先对手册查阅一遍。
4. 编写代码:
使用IDE创建一个新的项目,并配置好目标硬件和开发工具,我这里直接使用以前写好的GPIO示例,直接在上面更改。
编写代码以控制MSPM0L1306的功能,,gpio输入输出、 PWM输出、定时器中断等。
上面自己给了方向 ,下面就是行动。
下面正式开始点灯:
步骤 1:检测J2处的跳线帽是否安装牢固
确保硬件连接正确,LED灯与GPIO口正确连接,有的时候会拿掉这个跳帽,不装回去,一定要先看一下,我这里以前就出现过这个情况,所以这里提一下。
步骤 2:利用CCS的配置文件将其配置成输出模式
CCS:首先是安装CCS这个软件,装好后,就直接打开示例,然后再配置IO的相关信息,配置和生成嵌入式系统的初始化代码。
先看CCS的配置:
操作:
打开CCS软件,并加载与你的硬件相匹配的工程或配置文件。
在GPIO配置部分,找到控制LED的GPIO口。
将该GPIO口配置模式。
根据需要配置其他参数,输出速度、上拉/下拉等。
生成初始化代码根据自己要实现的功能,增加代码。
步骤 3:将GPIO口拉低,配置成低电平
目的:将GPIO口设置为低电平,驱动LED灯点亮。
代码解析:
学习GPIO配置为输出,点亮LED
GPIO初始化:
SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
{
DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_LED_1_IOMUX);
DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_LED_2_IOMUX);
DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_LED_3_IOMUX);
DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_TEST_IOMUX);
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
GPIO_LEDS_USER_LED_2_PIN |
GPIO_LEDS_USER_LED_3_PIN |
GPIO_LEDS_USER_TEST_PIN);
DL_GPIO_enableOutput(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
GPIO_LEDS_USER_LED_2_PIN |
GPIO_LEDS_USER_LED_3_PIN |
GPIO_LEDS_USER_TEST_PIN);
}
LED宏定义:
#define GPIO_LEDS_PORT (GPIOA)
/* Defines for USER_LED_1: GPIOA.27 with pinCMx 28 on package pin 31 */
#define GPIO_LEDS_USER_LED_1_PIN (DL_GPIO_PIN_27)
#define GPIO_LEDS_USER_LED_1_IOMUX (IOMUX_PINCM28)
/* Defines for USER_LED_2: GPIOA.26 with pinCMx 27 on package pin 30 */
#define GPIO_LEDS_USER_LED_2_PIN (DL_GPIO_PIN_26)
#define GPIO_LEDS_USER_LED_2_IOMUX (IOMUX_PINCM27)
/* Defines for USER_LED_3: GPIOA.13 with pinCMx 14 on package pin 17 */
#define GPIO_LEDS_USER_LED_3_PIN (DL_GPIO_PIN_13)
#define GPIO_LEDS_USER_LED_3_IOMUX (IOMUX_PINCM14)
/* Defines for USER_TEST: GPIOA.1 with pinCMx 2 on package pin 2 */
#define GPIO_LEDS_USER_TEST_PIN (DL_GPIO_PIN_1)
#define GPIO_LEDS_USER_TEST_IOMUX (IOMUX_PINCM2)
学习GPIO配置为输入,实现按键输入检测
按键控制LED:
CCS按键配置:
代码:
int main(void)
{
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();
/* Default: LED1 and LED3 ON, LED2 OFF */
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 |
GPIO_LEDS_USER_TEST_PIN);
while (1) {
/*
* Call togglePins API to flip the current value of LEDs 1-3. This
* API causes the corresponding HW bits to be flipped by the GPIO HW
* without need for additional R-M-W cycles by the processor.
*/
delay_cycles(DELAY);
// DL_GPIO_togglePins(GPIO_LEDS_PORT,
// GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_LED_2_PIN |
// GPIO_LEDS_USER_LED_3_PIN | GPIO_LEDS_USER_TEST_PIN);
keyTmep = DL_GPIO_readPins(GPIO_LEDS_PORT, KEY_SW1_PIN);
if(keyTmep ==0)
{
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_LED0_PIN);
}
else
{
DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_LED0_PIN);
}
}
}
学习PWM的配置,实现LED亮暗程度的调节
MSPM0L1306是一款内置了四个16位通用计时器的微控制器,计时器支持PWM(脉宽调制)功能。PWM是一种模拟控制技术,通过数字信号来模拟输出模拟信号。在MSPM0L1306中,PWM功能是通过定时器的比较功能实现的。
MSPM0L1306的每个定时器可以输出两个通道的PWM信号,这两个通道可以是同周期但不同占空比的。占空比是指PWM信号中高电平持续的时间与整个周期时间的比例。通过修改定时器的比较寄存器值,可以控制PWM信号的占空比。
MSPM0L1306还支持两种PWM模式:边缘对齐PWM和中心对齐PWM。边缘对齐PWM在定时器计数开始时输出高电平,当计数值与输出通道的比较值相同时输出低电平,直到定时器的计数值计数到0。而中心对齐PWM在定时器开始时输出低电平,在定时器向上计数和向下计数两次到达输出通道的比较值相等的时候各翻转一次电平。
在实际应用中,可以使用MSPM0L1306的PWM功能来控制LED的亮度、电机的速度等。通过改变PWM信号的占空比,可以控制LED的亮度变化,实现呼吸灯等效果。以下是我实现呼吸灯的效果。
CCS PWM配置:
代码:
#include "ti_msp_dl_config.h"
/* This results in approximately 0.5s of delay assuming 32MHz CPU_CLK */
#define DELAY (16000000)
uint16_t keyTmep;
uint16_t DutyTmep = 0;
uint16_t i,j;
uint8_t dir = 1;
int main(void)
{
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();
/* Default: LED1 and LED3 ON, LED2 OFF */
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 |
GPIO_LEDS_USER_TEST_PIN);
while (1) {
if (dir)
{
DutyTmep++;
}
else
{
DutyTmep--;
}
if (DutyTmep > 5000)
{
dir = 0;
}
if (DutyTmep == 0)
{
dir = 1;
}
DL_TimerG_setCaptureCompareValue(PWM_0_INST, DutyTmep, DL_TIMER_CC_0_INDEX);
}
}
PWM实现的波形:
实现呼吸灯的效果。
点亮RGB,实现红色、绿色、蓝色的循环显示
程序:
RGB闪烁
int main(void)
{
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();
/* Default: LED1 and LED3 ON, LED2 OFF */
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 |
GPIO_LEDS_USER_TEST_PIN);
while (1) {
delay_cycles(DELAY);
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_LED_2_PIN |
GPIO_LEDS_USER_LED_3_PIN | GPIO_LEDS_USER_TEST_PIN);
}
}
原理图: