一、本节内容
通过SYSTICK设置LED2三色灯的亮灭控制,要求实现1秒钟白色灯(三色灯全亮)亮灭翻转一次。
加入UART0串口,实现串口接收中断,根据接收的字符,实现下述功能:
a : 设置为白灯,亮灭频率不变
b: 设置为蓝灯,亮灭频率不变
c: 设置为绿灯,亮灭频率不变
d: 设置为红灯,亮灭频率不变
e: 亮灭翻转频率:1秒,亮灯颜色不变
f: 亮灭翻转频率:0.5秒,亮灯颜色不变
g: 亮灭翻转频率:2秒,亮灯颜色不变
二、原理讲解
本次实验先使用syscfg配置GPIO口,UART串口,TICK时钟,然后使用直接生成的初始化代码,再设置一个检测输入数据并赋值的switch函数,用所赋的值去管理具体行为,并且使用电脑的串口助手接受发出去的信息。
三、库函数
部分寄存器和库函数:
NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//取消中断挂起
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);//中断使能
这两个是初始化编译后自动生成在其他库的,可以直接调用。

DL_UART_Main_getPendingInterrupt()这个函数调用的是DL_UART_getPendingInterrupt()这个函数,其中用途是检查有无任何uart中断处于挂起状态,中断不必提前初始化(这一点我没试过,不知道为什么,希望有大佬来补充)
输入值:寄存器地址的指针
返回值:最高优先级的中断挂起,例:UART的IIDX返回值:DL_UART_MAIN_IIDX_RX


从RX的缓存区读取数据
输入值:寄存器地址的指针
返回值:RX缓存区数据
设置系统时钟周期
调用此函数不会立即重新加载SysTick计数器。如果想更改周期并重置计数器,使用DL_SYSTICK_init函数或DL_SYSTICK_resetValue。
输入值:时钟周期
四、软件代码
#include "ti_msp_dl_config.h"
#include <sys/_stdint.h>
#include <sys/cdefs.h>
volatile uint8_t rec,flag=0;//定义返回值和标志位
int main(void)
{
SYSCFG_DL_init();//全部初始化
NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//取消中断挂起
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);//中断使能
while (1) {
}
}
void UART0_IRQHandler(void)//接收中断函数
{
switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {//接收信息
case DL_UART_MAIN_IIDX_RX:
rec = DL_UART_Main_receiveData(UART_0_INST);//发回信息进行
DL_UART_Main_transmitData(UART_0_INST, rec);
switch (rec)//接收数据处理
{ case 'a' :
flag='a';//赋值
break;
case 'b' :
flag='b';
break;
case 'c' :
flag='c';
break;
case 'd' :
flag='d';
break;
case 'e' :
DL_SYSTICK_setPeriod(4000000);//调整时钟周期,1s
break;
case 'f' :
DL_SYSTICK_setPeriod(2000000);
break;
case 'g' :
DL_SYSTICK_setPeriod(1000000);
break;
default:
break;
}
}
}
void SysTick_Handler(void)//灯闪烁函数
{
switch (flag) {//使用赋值进行灯的闪烁处理
case 'a':
DL_GPIO_setPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN|GPIO_GRP_LED_PIN_G_PIN|GPIO_GRP_LED_PIN_B_PIN);flag=0;//设置高电平并设置标志位
break;
case 'b':
DL_GPIO_setPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_B_PIN);
DL_GPIO_clearPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN|GPIO_GRP_LED_PIN_G_PIN);flag=1;//清除GPIO的PIN设置,并设置标志位
break;
case 'c':
DL_GPIO_setPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_G_PIN);
DL_GPIO_clearPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN|GPIO_GRP_LED_PIN_B_PIN);flag=2;
break;
case 'd':
DL_GPIO_setPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN);
DL_GPIO_clearPins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_B_PIN|GPIO_GRP_LED_PIN_G_PIN);flag=3;
break;
case 1:
DL_GPIO_togglePins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_B_PIN);
break;
case 2:
DL_GPIO_togglePins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_G_PIN);
break;
case 3:
DL_GPIO_togglePins (GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN);
break;
default:
DL_GPIO_togglePins(GPIO_GRP_LED_PORT,GPIO_GRP_LED_PIN_R_PIN|GPIO_GRP_LED_PIN_G_PIN|GPIO_GRP_LED_PIN_B_PIN);
break;
}
}
本次节介绍了使用syscfg配置GPIO口,UART串口,TICK时钟,然后使用直接生成的初始化代码,再设置一个检测输入数据并赋值的switch函数,用所赋的值去管理具体行为,并且使用电脑的串口助手接受发出去的信息。
特别感谢@上善若水1068 提供的代码
本文介绍了如何使用MSP432M0平台的SYSTICK、UART0和GPIO进行LED2三色灯的控制,包括不同颜色和亮灭频率的切换,以及利用串口接收数据触发灯的状态变化。
4764

被折叠的 条评论
为什么被折叠?



