MSPM0L1306例程学习系列
写在前边的话:
UART部分的例程有10个,按照内容顺序重新排序整理如下:
本节讲解的例程是uart_rw_multibyte_fifo_poll.c。
UART模块通过FIFO+查询方式收发字符串的功能演示。启用了内部环回(RX和TX内部短接),MCU发什么就收什么。
各部分的配置如下:
代码简单注释如下:
/*
* UART模块使用的SDK例程
* 文件名:uart_rw_multibyte_fifo_poll.c
* 描述:
* UART模块通过FIFO+查询方式收发字符串的功能演示。
* 1、系统的时钟配置:LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=32MHz;
* 2、串口的基本配置:BUSCLK, 波特率9600,数据位8,无校验位,停止位1,未使用硬件流控
* 3、使用UART0,发送和接收,引脚为RX-PA9, TX-PA8
* 使用发送FIFO和接收FIFO,未使用中断,未使用DMA;
* 4、PA0引脚连接有LED灯;
*
* 操作描述:
* 1、下载程序,设置断点;
* 2、添加数组txPacket和rxPacket到变量观察窗口;
* 3、点击RUN全速运行;
* 4、查看变量;
*
* 注意事项:
* 1、可以直接通过设置断点的方式来观察实验现象;
* 2、如果不用环回模式,那么可以配合串口助手来做相关实验;
* 3、PC端需要安装串口调试助手;
* 也可以直接使用CCS的调试终端, 菜单栏/View/Terminal 打开新的窗口,Open a terminal...
*
* 思考:
* 1、不用环回模式,实验应该怎么设计?
* 2、如果数组长度超过了4个,怎么办?
*
* 修改:
* 基于官方的sdk例程增加注释,xie_sx@126.com
*
*/
#include "ti_msp_dl_config.h"
//宏定义:配置系统环回模式
//RX外部引脚会断开,外部发来的数据被忽略
#define ENABLE_LOOPBACK_MODE true
//宏定义:数据包的大小
//例程使用查询FIFO的方式,FIFO最大深度为4
#define UART_PACKET_SIZE (4)
//延时5ms,确保在启动传输前,UART TX处于空闲状态
#define UART_TX_DELAY (160000)
//数组,存放要发送的数据
uint8_t txPacket[UART_PACKET_SIZE] = {'M', 'S', 'P', '!'};
//数组,存放接收的数据
uint8_t rxPacket[UART_PACKET_SIZE];
int main(void)
{
//SysConfig图形配置工具初始化配置函数
SYSCFG_DL_init();
//延时(可选),系统启动后等待TX准备OK
delay_cycles(UART_TX_DELAY);
//通过宏定义配置是否启用内部环回模式,即内部RX接TX
#if (ENABLE_LOOPBACK_MODE == true)
DL_UART_enableLoopbackMode(UART_0_INST);
#endif
//点亮LED灯,指示传输开始
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
//往TX FIFO中写入数据并传输数据
//往发送数据寄存器写数据就自动发送(FIFO不需要用户参与)
DL_UART_Main_fillTXFIFO(UART_0_INST, &txPacket[0], UART_PACKET_SIZE);
//等待所有的字节被传输并且TX FIFO为空
//非busy状态,说明数据已经传输完成
while (DL_UART_Main_isBusy(UART_0_INST));
//等待UART接收数据并读取
//读取RXFIFO中的数据,循环读取UART_PACKET_SIZE次
for (uint8_t i = 0; i < UART_PACKET_SIZE; i++)
{
rxPacket[i] = DL_UART_receiveDataBlocking(UART_0_INST);
}
//传输成功后,led灯闪烁指示
while (1)
{
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
delay_cycles(5000000);
}
}