MSPM0L1306例程学习系列
1.背景介绍
写在前边的话:
- 这个系列比较简单,主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。
- 所有的例程均来自MSPM0 SDK的安装包,具体可到官网下载并安装: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/
- 因为例程多数包含sysconfig文件,也就是配合图形配置工具进行的外设初始化。因此在学习时,不能只看主函数的代码,还要重点看下系统是怎么配置的。因此,每个例程都有一部分内容是PPT截图,来讲解图形配置文件。
- 使用时,可以直接把添加注释的代码拷贝到自己的工程中进行阅读,比较方便。
UART部分的例程有10个,按照内容顺序重新排序整理如下:
2.例程描述
本节讲解的例程是uart_external_loopback_interrupt。
UART模块的基本收发功能演示,外部环回(RX和TX短接),MCU发什么就收什么。
3.SysConig配置描述
各部分的配置如下:
4.代码注释
代码简单注释如下:
/*
* UART模块使用的SDK例程
* 文件名:uart_external_loopback_interrupt.c
*
* 配置描述:
* UART模块的基本收发功能演示,外部环回。
* 1、系统的时钟配置:LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=32MHz;
* 2、串口的基本配置:BUSCLK, 波特率9600,数据位8,无校验位,停止位1,未使用硬件流控
* 3、使用UART0,发送和接收,引脚为RX-PA9, TX-PA8
* 仅使能接收中断,未使用DMA,未使用FIFO
*
* 操作描述:
* 1、将uart的tx和rx通过杜邦线连接;
* 2、下载程序,在串口接收中断里设置断点;
* 3、点击RUN全速运行;
* 4、可以观察看到串口接收到的数据等于发送的数据;
*
* 注意事项:
* 1、该例程可以不用串口调试助手;
* 2、如果使用的是红色的launchpad套件LP-MSPM0L1306,要注意跳线帽的设置;
* J16和J17两个跳线帽的位置要做调整,连接到BP端,芯片的引脚才会连接到侧面的双排针;
* 然后再用杜邦线连接PA8和PA9. 也可以用偷懒的方法,J16和J17跳线帽拔掉后,直接短接中间两个;
* 3、要特别注意实验的顺序,TX和RX要先连接,不然程序跑起来,Tx发送了,而Rx没收到,就进不了中断了!
*
* 思考:
* 1、也可以考虑uart的tx和rx引脚,方便连接。也特别注意引脚复用的情况,避免出错!
*
* 修改:
* 基于官方的sdk例程增加注释,xie_sx@126.com
*
*/
#include "ti_msp_dl_config.h"
//延时5ms,确保在启动传输前,UART TX处于空闲状态
#define UART_TX_DELAY (160000)
uint8_t txData = 0, rxData = 0;
//用于表示数据接收的标志位
bool dataReceived;
int main(void)
{
//SysConfig图形配置工具初始化配置函数
SYSCFG_DL_init();
//清除中断标志,使能中断
NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
//延时(可选),确保UART TX处于空闲状态
delay_cycles(UART_TX_DELAY);
while (1)
{
//数据接收的标志位清零
dataReceived = false;
//更新要发送的数据(+1处理)
txData = txData + 1;
//发送一个字节的数据
DL_UART_Main_transmitData(UART_0_INST, txData);
while (dataReceived == false)
{
__WFE();
}
//延时,避免数据发送太频繁
delay_cycles(10000);
}
}
/*
* uart中断处理函数
*
* --读取uart接收到的数据, rxData;
* --判断接收到的数据rxData是否等于发送的数据txData
*
*/
void UART_0_INST_IRQHandler(void)
{
switch (DL_UART_Main_getPendingInterrupt(UART_0_INST))
{
case DL_UART_MAIN_IIDX_RX:
//读取接收到的数据,存入rxData
rxData = DL_UART_Main_receiveDataBlocking(UART_0_INST);
//设置数据接收的标志位,这样主函数才会发送下一个数据
dataReceived = true;
//判断接收到和发送的数据是否相等。正常来说,里边要增加处理的,写例程的人偷懒了:(
while (rxData != txData)
{
};
break;
default:
break;
}
}