学习MSP432M0手册——第五节systick和UART接收

本文介绍了如何使用MSP432M0平台的SYSTICK、UART0和GPIO进行LED2三色灯的控制,包括不同颜色和亮灭频率的切换,以及利用串口接收数据触发灯的状态变化。

一、本节内容

通过SYSTICK设置LED2三色灯的亮灭控制,要求实现1秒钟白色灯(三色灯全亮)亮灭翻转一次。

加入UART0串口,实现串口接收中断,根据接收的字符,实现下述功能:

a : 设置为白灯,亮灭频率不变

b: 设置为蓝灯,亮灭频率不变

c: 设置为绿灯,亮灭频率不变

d: 设置为红灯,亮灭频率不变

e: 亮灭翻转频率:1秒,亮灯颜色不变

f: 亮灭翻转频率:0.5秒,亮灯颜色不变

g: 亮灭翻转频率:2秒,亮灯颜色不变

二、原理讲解

本次实验先使用syscfg配置GPIO口,UART串口,TICK时钟,然后使用直接生成的初始化代码,再设置一个检测输入数据并赋值的switch函数,用所赋的值去管理具体行为,并且使用电脑的串口助手接受发出去的信息。

三、库函数

 部分寄存器和库函数:

学习MSP432M0手册——第一节GPIO输出功能

学习MSP432M0手册——第二节GPIO输入和输出

学习MSP432M0手册——第三节GPIO中断

学习MSP432M0手册——第四节SDK和UART

NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//取消中断挂起
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);//中断使能

这两个是初始化编译后自动生成在其他库的,可以直接调用。

7921f15e5ecf4d0281fee4b0e642991f.png

453b8ff7b6c44bfd8693ccdcfadaa614.png DL_UART_Main_getPendingInterrupt()这个函数调用的是DL_UART_getPendingInterrupt()这个函数,其中用途是检查有无任何uart中断处于挂起状态,中断不必提前初始化(这一点我没试过,不知道为什么,希望有大佬来补充)

输入值:寄存器地址的指针

返回值:最高优先级的中断挂起,例:UART的IIDX返回值:DL_UART_MAIN_IIDX_RX

451d89f2824f4250851bbc5d8f2bafa9.png

98e62bd6834d41c8a9a2e949359cacc5.png

 从RX的缓存区读取数据

输入值:寄存器地址的指针

返回值:RX缓存区数据

a97a5ad93b844d53aec4001bc1b7dd3c.png设置系统时钟周期

调用此函数不会立即重新加载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 提供的代码

 

encoder_init(); // 初始化编码器中断 encoder_value_up(); while (1) { Motor_SetSpeed(300, 300); printf("%d %d\n\r",Get_Encoder_countA); } } void TIMER_0_INST_IRQHandler(void) { if(DL_TimerA_getPendingInterrupt(TIMER_0_INST)) { if(DL_TIMER_IIDX_ZERO) { encoderA_cnt = Get_Encoder_countA; } } } //搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) { delay_times = ms; while( delay_times != 0 ); } //串口发送单个字符 void uart0_send_char(char ch) { //当串口0忙的时候等待,不忙的时候再发送传进来的字符 while( DL_UART_isBusy(UART_0_INST) == true ); //发送单个字符 DL_UART_Main_transmitData(UART_0_INST, ch); } //串口发送字符串 void uart0_send_string(char* str) { //当前字符串地址不在结尾 并且 字符串首地址不为空 while(*str!=0&&str!=0) { //发送字符串首地址中的字符,并且在发送完成之后首地址自增 uart0_send_char(*str++); } } //滴答定时器的中断服务函数 void SysTick_Handler(void) { if( delay_times != 0 ) { delay_times--; } } //串口的中断服务函数 void UART_0_INST_IRQHandler(void) { //如果产生了串口中断 switch( DL_UART_getPendingInterrupt(UART_0_INST) ) { case DL_UART_IIDX_RX://如果是接收中断 //接发送过来的数据保存在变量中 uart_data = DL_UART_Main_receiveData(UART_0_INST); //将保存的数据再发送出去 uart0_send_char(uart_data); break; default://其他的串口中断 break; } }#include "ti_msp_dl_config.h" M0g3507的MCU改串口0为串口1
最新发布
08-04
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值