串口TI基本通信(学不会电磁场)(阻塞式串口接收中断)
实现效果:电脑向单片机发送什么,单片机通过串口向电脑返回什么在调试助手里
主要知识点:阻塞式串口接收中断
实现过程:(保证时钟主频80M,勾选use clock tree,中断回调函数写在usart.c里面)
1.配置sysconfig
添加一组UART,名字自定义,然后波特率也自定义,这里用9600
打开接收中断
选择引脚
在empty工程里面加入usart.c和usart.h文件
usart.c
#include "uart.h" /** * @brief UART发送单个字节(阻塞式发送,等待发送完成才返回) * @param uart: UART外设寄存器基地址指针,指向目标UART实例 * @param chr: 需要发送的8位字节数据(字符/数值均可) * @note 底层调用TI DriverLib阻塞发送接口,函数会一直阻塞直到发送寄存器为空 */ void UART_send_char(UART_Regs *uart, uint8_t data) { // 等待UART发送硬件空闲,上一字节发送完成 while (DL_UART_isBusy(uart) == true); // 写入数据寄存器,启动发送 DL_UART_transmitData(uart, data); } /** * @brief UART发送完整字符串(自动遍历直到字符串结束符'\0') * @param uart: UART外设寄存器基地址指针,指定发送使用的UART外设 * @param str: 待发送字符串首地址,必须以'\0'作为结束标志 * @note 循环逐个取出字符调用单字节发送函数,阻塞发送,无长度限制,依赖字符串终止符 */ void UART_send_string(UART_Regs *uart, const char *str) { // 判断当前指针指向字符是否不为'\0',非0则继续发送 while (*str) { // 将char类型强转为uint8_t无符号字节,调用单字节发送接口输出 UART_send_char(uart, (uint8_t) *str); // 字符串指针向后偏移1字节,指向下一个待发送字符 str++; } } /** * @brief PRINT_INST串口中断服务函数,实现串口回显功能(收到什么立刻发回) * @note PRINT_INST为工程中宏定义的调试打印串口实例(如UART0/UART1) * 该函数在UART产生中断时由中断向量自动进入,不可手动调用 */ void PRINT_INST_IRQHandler() { // 获取当前UART挂起的中断类型,用于区分是接收中断、发送中断还是错误中断 switch (DL_UART_getPendingInterrupt(PRINT_INST)) { // 接收数据中断:RX缓冲区收到有效字节触发此中断 case DL_UART_IIDX_RX: { // 读取UART接收缓冲区中的1字节数据,读取后硬件自动清除RX中断标志 uint8_t rec = DL_UART_receiveData(PRINT_INST); // 将刚收到的数据原路发回串口,实现收发回显 UART_send_char(PRINT_INST, rec); break; } // 其他所有中断类型(发送完成、溢出、奇偶校验错误等)不作处理,直接退出 default: break; } }usart.h
#ifndef UART_H #define UART_H /** * @file uart.h * @brief MSPM0 通用串口驱动头文件 * @details 封装串口单字节、字符串发送接口,基于TI DriverLib库实现 * @author 嵌入式开发 * @note 依赖ti_msp_dl_config.h,需提前完成串口外设初始化配置 */ // 引入TI MSPM0官方驱动库总头文件,提供UART_Regs、DL_UART系列函数、PRINT_INST等宏定义 #include "ti_msp_dl_config.h" /** * @brief 串口阻塞发送单个字节 * @param uart UART外设寄存器基地址指针,指定要操作的串口外设 * @param chr 待发送的8位无符号字节数据 */ void UART_send_char(UART_Regs *uart, const uint8_t chr); /** * @brief 串口阻塞发送完整字符串 * @param uart UART外设寄存器基地址指针,指定要操作的串口外设 * @param str 待发送字符串首地址,字符串必须以'\0'结尾 */ void UART_send_string(UART_Regs *uart, const char *str); #endif /* UART_H */main.c里面测试:
#include "ti_msp_dl_config.h" #include <stdio.h> #include "uart.h" int main(void) { SYSCFG_DL_init(); // 使能PRINT_INST对应的UART串口中断,开启串口接收中断响应 NVIC_EnableIRQ(PRINT_INST_INT_IRQN); while (1) { } }想单独向串口调试助手发送内容,在while循环里面写:
UART_send_string(PRINT_INST, "hello, ti!\n");不过要加delay函数延时。