5、DSP28335 串口发送接收FIFO中断,自定义printf函数

2024-02-04 11:44

本文主要是介绍5、DSP28335 串口发送接收FIFO中断,自定义printf函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include "uart.h"unsigned char data[8];void MyUartInit(Uint32 baud)
{unsigned char scihbaud = 0;unsigned char scilbaud = 0;Uint16 scibaud = 0;EALLOW;InitSciaGpio();EDIS;EALLOW;//0:一位停止位;1:两位停止位SciaRegs.SCICCR.bit.STOPBITS = 0;//0:偶校验;1:奇校验SciaRegs.SCICCR.bit.PARITY = 0;//0:校验位失能,1:校验位使能SciaRegs.SCICCR.bit.PARITYENA = 0;//0:回环测试功能失能;1:回环测试功能使能SciaRegs.SCICCR.bit.LOOPBKENA = 0;//SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0;//字长:8位字长SciaRegs.SCICCR.bit.SCICHAR = 0x7;
//  SciaRegs.SCICCR.all = 0x0007;//该DSP主频为 60MHz,通过LOSPCP寄存器将系统时钟分频为低速时钟//在main函数的InitSysCtrl()里面配置了//SysCtrlRegs.LOSPCP.all = 0x0002; 4分频 15MHz 串口时钟//15M时钟 / (8 * baud) - 1, 分高八位和低八位scibaud = 15000000 / (8 * baud) - 1;scihbaud = scibaud >> 8;scilbaud = scibaud & 0xff;//设置波特率SciaRegs.SCIHBAUD = scihbaud;   //高8位SciaRegs.SCILBAUD = scilbaud;   //低8位//发送接收使能,1:使能;0:失能SciaRegs.SCICTL1.bit.RXENA = 1;SciaRegs.SCICTL1.bit.TXENA = 1;
//  SciaRegs.SCICTL1.all = 0x0003;//接收中断使能,这里使用FIFO接收中断,就不用配置
//  SciaRegs.SCICTL2.bit.RXBKINTENA = 1;//0:FIFO失能;1:FIFO使能SciaRegs.SCIFFTX.bit.SCIFFENA = 1;//0:复位SCI接收和发送通道;1:SCI的FIFO恢复发送和接收SciaRegs.SCIFFTX.bit.SCIRST = 1;//0:失能FIFO发送中断;1:使能FIFO发送中断SciaRegs.SCIFFTX.bit.TXFFIENA = 0;//设置FIFO发送中断深度SciaRegs.SCIFFTX.bit.TXFFIL = 0x00;//0:无影响;1:清除TXFFINT标志7位SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;//0:重置FIFO指针和保持复位;1:重启发送FIFO操作SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0;//0:无影响;1:清除RXFFOVF标志第15位SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//0:无影响;1:清除RXFFINT标志第7位SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//0:重置FIFO指针和保持复位;1:重启接收FIFO操作SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;//0:接收FIFO中断失能;1:接收FIFO中断使能SciaRegs.SCIFFRX.bit.RXFFIENA = 1;//FIFO接收中断深度SciaRegs.SCIFFRX.bit.RXFFIL = 0x08;SciaRegs.SCIFFCT.all = 0x0000;SciaRegs.SCICTL1.all = 0x0023;SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;PieVectTable.SCIRXINTA = &SciRxFifoIsr;EDIS;//使能PIE、CPU中断PieCtrlRegs.PIECTRL.bit.ENPIE = 1;PieCtrlRegs.PIEIER9.bit.INTx1 = 1;IER |= M_INT9;EINT;ERTM;
}void UartSendByte(Uint32 a)
{while (SciaRegs.SCIFFTX.bit.TXFFST != 0);SciaRegs.SCITXBUF = a;
}void UartSendArray(unsigned char *Array, Uint16 ArrayLength)
{Uint16 i;for(i = 0; i < ArrayLength; i++){UartSendByte(Array[i]);}
}void UartSendString(char *msg)
{Uint32 i = 0;while(msg[i] != '\0'){UartSendByte(msg[i]);i++;}
}void uart_printf(char * fmt, ...) //自定义变参函数
{char *  arg_ptr;unsigned int  i ,  len;static char write_buf[MAX_WRITE_LEN];va_start(arg_ptr, fmt);len = vsprintf((char *)write_buf, fmt, arg_ptr);va_end(arg_ptr);for (i = 0; i < len; i++){if ( '\0' != write_buf[i] ){while (SciaRegs.SCIFFTX.bit.TXFFST != 0); //使用SCIASciaRegs.SCITXBUF=write_buf[i];}}
}interrupt void SciRxFifoIsr(void)
{Uint16 i;for(i = 0; i < 8; i++){data[i] = SciaRegs.SCIRXBUF.all;}SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}

注:自定义的uart_printf函数需要修改cmd文件中分区的大小,根据报错信息修改即可,烧录到Flash和ram的两种方法,cmd文件也不同。

这篇关于5、DSP28335 串口发送接收FIFO中断,自定义printf函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677382

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT