前言:由于自己是第一次参加论坛上面的活动,在实际的调试代码中遇到了不少的问题,本来学习TI公司的MSPM0开发板的原则,本着以谦虚的态度,向大佬们进行学习,也很感谢EEPW举办的这次活动,不仅学到的知识,认识了很多志同道合的朋友,跟着视频一起学习,和网友们一起讨论,一起进步。
准备工作:如果对CCS编译器比较熟悉的话,有一定的使用基础,强烈建议使用该软件,虽然keil,iar也支持软件开发,但是远远不如CCS编译器用起来顺手,配置底层驱动真的很方便,根据视频里面的讲解,轻轻松松的学到知识。
是这里我使用的是keil5.39(keil版本必须在5.38A以上),编译器使用的是6.21版本,安装教程官网上面有详细的介绍,这里就不过多的说明了,如果说在使用keil版本出现问题的话,还是建议大家学习一下ccs编译环境,真的很好用。
1.1点亮板载的LED点亮LED灯的原理就是根据硬件连接确定下,是拉高GPIO口,还是拉低GPIO口,不过在大多数情况下,单片机的IO口驱动能力不是很强,使用的灌电流的方式,及拉低控制LED的GPIO口。
软件调试操作步骤如下:
1:检测J2处的跳线帽是否安装牢固。
2:利用CCS的配置文件将其配置成输出模式
3:将GPIO口拉低,即将其配置成低电平。
原理图如下:
CCS 配置图如下:
配置完成后,直接利用CCS编译一下,配置IO口的底层宏定义就配置好了 如下所示:
/* Port definition for Pin Group GPIO_LEDS */
#define GPIO_LEDS_PORT (GPIOA)
/* Defines for USER_Twinkle_LED: GPIOA.0 with pinCMx 1 on package pin 1 */
#define GPIO_LEDS_USER_Twinkle_LED_PIN (DL_GPIO_PIN_0)
#define GPIO_LEDS_USER_Twinkle_LED_IOMUX (IOMUX_PINCM1)
GPIO口的初始化,可以一同自动生成,真的是很方便然后为了显示GPIO口的工作状态,这里我使用系统电平翻转的函数DL_GPIO_togglePins();
/*该处代码用于,点亮LED闪烁使用 2024-5-2*/
delay_cycles(32000*500);;
DL_GPIO_togglePins(Blinky_PORT, GPIO_LEDS_USER_Twinkle_LED_PIN);
实际的使用效果图如下:
1.2:调试按键检测功能
按键检测实现方式:时间延时法,中断触发法,定时器查询法。
主要实现功能:按键按下,点亮板载LED(PA0);按键松开,熄灭
LED(PA0)
软件调试操作步骤如下:
1:配置按键检测,LED灯的端口
2:读取按键IO口的电平
3:利用条件语句判断函数编写
4:控制LED的功能引脚
软件配置如下:
主程序:
KeyValue = DL_GPIO_readPins(Blinky_PORT,GPIO_LEDS_USER_KEY_01_PIN); // Read the state of key input
if(KeyValue == 0)
{
DL_GPIO_clearPins(Blinky_PORT, GPIO_LEDS_USER_Twinkle_LED_PIN); //PA0= 0;turn on led
}
else
{
DL_GPIO_setPins(Blinky_PORT, GPIO_LEDS_USER_Twinkle_LED_PIN); //PA0= 1;turn off led
}
效果图:
1.3:调试PWM功能
简单介绍一下PWM:脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 pwm的频率:
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz
pwm的周期:
T=1/f
周期=1/频率
50Hz = 20ms 一个周期
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
占空比:
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%
软件配置如下:
然后编译一下,生产的代码如下:
/* Defines for PWM_LED_PA12 */
#define PWM_LED_PA12_INST TIMG0
#define PWM_LED_PA12_INST_IRQHandler TIMG0_IRQHandler
#define PWM_LED_PA12_INST_INT_IRQN (TIMG0_INT_IRQn)
#define PWM_LED_PA12_INST_CLK_FREQ 32000000
/* GPIO defines for channel 0 */
#define GPIO_PWM_LED_PA12_C0_PORT GPIOA
#define GPIO_PWM_LED_PA12_C0_PIN DL_GPIO_PIN_12
#define GPIO_PWM_LED_PA12_C0_IOMUX (IOMUX_PINCM13)
#define GPIO_PWM_LED_PA12_C0_IOMUX_FUNC IOMUX_PINCM13_PF_TIMG0_CCP0
#define GPIO_PWM_LED_PA12_C0_IDX DL_TIMER_CC_0_INDEX
static const DL_TimerG_ClockConfig gPWM_LED_PA12ClockConfig = {
.clockSel = DL_TIMER_CLOCK_BUSCLK,
.divideRatio = DL_TIMER_CLOCK_DIVIDE_1,
.prescale = 0U
};
static const DL_TimerG_PWMConfig gPWM_LED_PA12Config = {
.pwmMode = DL_TIMER_PWM_MODE_CENTER_ALIGN,
.period = 10000,
.startTimer = DL_TIMER_START,
};
SYSCONFIG_WEAK void SYSCFG_DL_PWM_LED_PA12_init(void) {
DL_TimerG_setClockConfig(
PWM_LED_PA12_INST, (DL_TimerG_ClockConfig *) &gPWM_LED_PA12ClockConfig);
DL_TimerG_initPWMMode(
PWM_LED_PA12_INST, (DL_TimerG_PWMConfig *) &gPWM_LED_PA12Config);
DL_TimerG_setCaptureCompareValue(PWM_LED_PA12_INST, 4500, DL_TIMER_CC_0_INDEX);
DL_TimerG_setCaptureCompareOutCtl(PWM_LED_PA12_INST, DL_TIMER_CC_OCTL_INIT_VAL_LOW,
DL_TIMER_CC_OCTL_INV_OUT_DISABLED, DL_TIMER_CC_OCTL_SRC_FUNCVAL,
DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
DL_TimerG_setCaptCompUpdateMethod(PWM_LED_PA12_INST, DL_TIMER_CC_UPDATE_METHOD_IMMEDIATE, DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
DL_TimerG_enableClock(PWM_LED_PA12_INST);
DL_TimerG_setCCPDirection(PWM_LED_PA12_INST , DL_TIMER_CC0_OUTPUT );
}
其效果图如下:
课后作业:
点亮RGB,实现红色、绿色、蓝色的循环显示
硬件如下:
软件控制流程:
初始化所使用得三个IO口引脚。
利用延时函数分别开启、关闭引脚
软件代码如下:
led2_r_on();
delay_cycles(32000*200);
led2_r_off();
delay_cycles(32000*200);
led2_g_on();
delay_cycles(32000*200);
led2_g_off();
delay_cycles(32000*200);
led2_b_on();
delay_cycles(32000*200);
led2_b_off();
delay_cycles(32000*200);
效果图如下: