串口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函数延时。