DSP28335的SCI的FIFO中断使用心得

2023-05-16

自学了一段时间的DSP28335的串口设置,写下来帮助更多的新手,遇到了很多问题也记录一些解决办法。

以下全都是我个人的理解,可能说的不对,大家讨论。

1、关于为什么必须用FIFO

一般的DSP系统,尤其是控制类的,都要使用串口FIFO。如果不用FIFO,假设传八个数据包(也就是八帧数据)要进八次中断,非常影响主函数的控制效果。用FIFO的话,让数据在FIFO等待(可以理解为一个长空间,暂时存放数据用的临时场所),进一次中断就可以了。

2、串口以及FIFO的设置

这个到处都能查得到,找个中文手册一步一步设置就行了

注意几个我遇到的坑

(1)SCI的每一个数据包最多可以包含8位数据(也就是8个二进制,就是0和1嘛),这个在SCICCR这个寄存器设置;

(2)SCI的FIFO最多可以收发16个数据包,但是这个设置也有讲究,在SCIFFTX和SCIFFRX李设置,其中TXFFST和RXFFST叫状态位,TXFFIL和RXFFIL叫深度,他们都是用5位数据来设定的,我最开始把16理解成11111了,其实应该是10000;

(3)尽量在DSP别用除法,用移位去运算;

(4)中断那得好好学,按照流程设置,先是各种初始化,然后设置串口的波特率与寄存器配置,然后确定中断函数的入口,(搞清楚串口的ABC用的到底是哪个,很关键,不然调程序这种小错很烦人)然后使能中断,具体使能哪条线路,得去查PIE的一张表,网上都有,最后使能CPU级别的中断,就是IER,别忘了用或运算,例如  IER |= M_INT9;

3、FIFO使用的一些问题

先放代码。

void main()
{
    int i;
    InitSysCtrl();
    InitGpio();
    InitSciGpio();
    InitPieCtrl();
    DINT;
    IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
    IFR = 0x0000;

    InitPieVectTable();

    SCI_Init(9600);

    EALLOW;        // This is needed to write to EALLOW protected registers
    PieVectTable.SCIRXINTB = &ScibRxFifoIsr;
    PieVectTable.SCITXINTB = &ScibTxFifoIsr;
    EDIS;   // This is needed to disable write to EALLOW protected registers

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx3=1;     // PIE Group 9, INT3
    PieCtrlRegs.PIEIER9.bit.INTx4=1;

    IER |= M_INT9; // Enable CPU INT9--- SCIA/B     INT8--- SCIC/D
    IER |= M_INT1; //定时器0//或运算不干扰其他中断

    EINT;//使能全局中断
    ERTM;//使能全局实时中断

    for(i = 0; i<12; i++) //缓存初始化
    {
        buffer[i] = '0';
    }

    while(1)
    {

    }
}

void SCI_Init(Uint32 baud)
{
    unsigned char sci_h_baud = 0;
    unsigned char sci_l_baud = 0;
    Uint16 sci_baud = 0;

    sci_baud = 37500000 / (8 * baud) - 1;//baud是输入的波特率
    sci_h_baud = sci_baud >> 8;
    sci_l_baud = sci_baud & 0xff;//按位与运算,均为1才能为1,0000 0000 1111 1111

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;//SCIB使能
    EDIS;

    ScibRegs.SCICCR.all = 0x0007;

    ScibRegs.SCIHBAUD = sci_h_baud;
    ScibRegs.SCILBAUD = sci_l_baud;
    //功能初始化
    ScibRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
    ScibRegs.SCICTL2.all = 0x0003;
    //FIFO初始化
    ScibRegs.SCIFFTX.all = 0xC028;
    ScibRegs.SCIFFRX.all = 0x0028;

    ScibRegs.SCIFFCT.all = 0x0000;

    ScibRegs.SCICTL1.all = 0x0023;
    ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;    // 重新使能发送FIFO的操作
    ScibRegs.SCIFFRX.bit.RXFIFORESET=1;     // 重新使能接收FIFO的操作
}
//----------------------------------------------------------

interrupt void ScibTxFifoIsr(void) //fifo发送中断服务子程序

{
    Uint16 i;
    for(i=0;i<8; i++)
    {
        ScibRegs.SCITXBUF=buffer[i];     // Send data 将缓存中的数据发出
    }
    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;      // Issue PIE ACK
}

interrupt void ScibRxFifoIsr(void)//fifo接收中断服务子程序
{
    Uint16 i;
    for(i=0; i<8; i++)
    {
        buffer[i]=ScibRegs.SCIRXBUF.all; // 将fifo中的数据读到缓存
    }
    ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;  // 很重要 若不清fifo发送中断标志则,不进入发送中断
    ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // 清接收中断标志
    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;    // Issue PIE ack
}

这个代码的变量声明部分不全,懒得粘了,自己补一下吧~尽量用全局变量,也好用仿真器观察

函数的流程是

(1)从上位机发8个数据包到RX,每发一个包,RXFFST这个状态位就加1,加到8,与设置的接收深度相等了,就跳入接收中断里,然后给buffer这个数组赋值,for循环每走一次,状态位就减1,最终减到0,意味着接收FIFO里没数据了,这时候for循环也跳出了。然后两个清零标志位置1,这个得好好理解,看看书也好懂。(可以自己试试for循环不跑8次是啥结果)

然后最后响应PIE级中断,这个语句执行完,CPU才算真的收到数据了,保存在内存了。

(2)然后准备从发送发出来。一定要明白发送和接收是一个反过程,这时先给寄存器赋值,然后再进入FIFO,这里有个小细节,比如发进去的是‘AAAA   AAAB’,按顺序的八个字符。执行完发送中断里的for循环后,在SCITXBUF里的是‘B’,此时TXFFST状态位是7,并不是8。然后执行完PIE以后串口发出,显示在上位机里。该过程遵循FIFO的先入先出原则。发送完以后标志位自动置1

想下次再进入中断,就得根据清除标志位是0还是1了。如果置1,说明标志位被清除,这时就自动又跳入发送中断了。

这点东西其实很浅显,但是也花费了一些精力琢磨整个流程,多改动关键代码自己研究吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DSP28335的SCI的FIFO中断使用心得 的相关文章

  • 超9成SCI论文发在国外!中文期刊到底差在哪?

    来源 科学网 撰文 卜叶 编辑 宗华 学术界不投中文期刊的原因是什么 xff1f 这一老生常谈的问题 xff0c 最近再次出现在某知识问答平台热榜 短短两周 xff0c 便吸引了180个回答 xff0c 浏览量超过34万 中文期刊到底差在哪
  • 推荐EI、SCI期刊及投稿建议-备忘(转)

    推荐EI SCI期刊及投稿建议 备忘 EI检索期刊计算机方面SCI和EI期刊 xff08 EI期刊会议注册前推荐 xff09 大会注册前推荐的EI期刊 xff1a 英文投稿的一点经验 转载 再加两封催稿信 英语不好 xff0c 但意思表达到
  • Java中队列FIFO(First-In-First-Out),栈LIFO(Last-In-First-Out)的实现

    size 61 small Deque接口定义了QUEUE First In First Out 的功能 xff0c 同时也定义了Stack Last In First Out 的功能 java util Deque lt E gt A l
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • FIFO和DMA

    FIFO SPI端口增加了FIFO xff0c 使得传输数据有了缓冲区间 FIFO存储器是一个先入先出的双口缓冲器 xff0c 即第一个进入其内的数据第一个被移出 xff0c 其中一个存储器的输入口 xff0c 另一个口是存储器的输出口 主
  • DSP28335笔记--SCI篇

    采用FIFO来实现数据的发送与接收 xff0c 一般就是指采用FIFO中断 在标准SCI模式下通过中断方式来接收或者发送数据可以发现 xff0c 每接收或者发送一个字符就要进一次中断 xff0c 如果发送的字符比较多的话 xff0c 很明显
  • DSP28335 printf重定向问题调试记录

    最近几天在玩DSP28335板子 xff0c 在实现printf重定向功能时 xff0c 遇到很多问题 xff0c 最终结合网上一些人的经验和个人实践 xff0c 最终解决了问题 本文做一个简单的总结 xff0c 以便后续查阅 同时也是希望
  • DSPF28335 SCI FIFO串口通讯

    在工作过程中 xff0c 通过串口进行上位机与控制器之间进行数据的传输 xff0c 标准的串口通讯容易造成数据的丢失和内存堆满的现象 xff0c 便使用SCI中的FIFO对数据进行中断处理 一 串口通信基本知识 F28335 处理器共有 3
  • [论文阅读] (15)英文SCI论文审稿意见及应对策略学习笔记总结(letpub爬虫)

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇介绍英文论文实验评估
  • DSP28335的AD采样读数一直是4095

    这几天做的一个DSP28335控制板测试时发现PWM没问题 但是测AD读数时A0和B0的读数都是4095 简单分析一下 对于DSP的供电 分为3 3V A 1 9V A 3 3V D 1 9V D 其中3 3V是给芯片外围供电 1 91V是
  • GEO2R数据下载速度慢、基因注释、差异分析、火山图、热图及后续处理

    GEO2R数据分析 首先感谢生信技能树大神jmzeng1314提供的github包 由于我这边访问github比较困难 因此我已经导入到我的 gitee 托管平台 https gitee com swcyo 特别声明 正版托管地址是http
  • 用R获取芯片探针与基因的对应关系三部曲-bioconductor

    用R获取芯片探针与基因的对应关系三部曲 bioconductor 现有的基因芯片种类不要太多了 soft和miniml都是表示该platform的基础信息 比如GPL编号 上传日期等 soft文件的部分内容如下 但是重要而且常用的芯片并不多
  • 【Latex排版】使用Latex 排版过程中的那些一二三问题汇总

    排版错误问题总结 1 在 maketitle 位置处报错 Missing inserted 2 添加参考文献 编译后显示错误 并且pdf中引用文献处为问号 持续更新问题 近期用Latex整理期刊论文时遇到了不少问题 现把遇到的问题及最终解决
  • 中科院分区和JCR分区查询

    本文将讨论中科院分区和JCR分区查询的三种方法 包括可以同时查询的LetPub查询方法 中科院分区的官方查询方法和JCR分区的查询方法 具体内容见正文 附 本所述方法为本人研究总结 在这里以开放交流的心态与大家分享 欢迎留言讨论 通过Let
  • AXI总线之DDR控制器的实现

    由于FPGA的内部RAM资源实在有限 同时又不得不面临大数据量缓存的问题 因此 将DDR进行共享成了最为直接有效的解决方案 设计目标 PL端有多个需要大量数据缓存的通道 让每个通道都将DDR作为外部缓存 FIFO 注意 总的突发在1Gbps
  • RAM IP core(2)

    例化5种RAM IP core 1 单端口RAM Single port RAM RAM参数设置如上图所示 输入输出位宽都为8位 深度为16 采用一级输出寄存器 读写模式为no change 用COE文件对RAM进行初始化 关于COE文件的
  • 写入/读取 FIFO 文件 - linux

    我一直在尝试了解 FIFO 并提出了一个简单的服务器和客户端程序 我不想做任何花哨的事情 只是让一个进程扮演 服务器 的角色 这个进程将 监听 另一个进程传递的任何消息 客户端 这是我写的 server c include
  • 通过 FIFO 重定向 stdin

    我正在 GNU Linux 下运行一个服务器应用程序 用 Java 编写 它接收输入 我猜是来自标准输入 并解释它以运行一些命令 我不想在终端窗口内运行应用程序 我想运行守护程序 但我仍然希望能够随时输入命令 我想我也许可以使用 fifos
  • 在 C++ 中创建 Windows 命名管道

    我正在尝试在 C Windows 中创建两个进程之间的简单通信 就像 Linux 中的 FIFO 一样 这是我的服务器 int main HANDLE pipe CreateFile TEXT pipe Pipe GENERIC READ
  • Unix 上具有多个读取器的命名管道 (FIFO)

    我有两个程序 Writer 和 Reader 我有一个从写入器到读取器的 FIFO 因此当我向写入器中的标准输入写入内容时 它会从读取器打印到标准输出 我尝试在打开两个 Reader 的情况下执行此操作 并且仅从两个 Reader 程序之一

随机推荐

  • 如何使用VSCode编译调试C语言程序

    一 前言 Visual Studio Code可通过安装插件来支持C 43 43 C Python PHP等语言 xff0c 使用的工程师越来越多 xff0c 本文介绍如何使用VS Code进行C语言的编译与调试 二 安装VS Code V
  • 修改一个工作空间中的工程文件目录结构

    如果有两个工程 xff0c Test1 Test2 xff0c 那么 默认目录结构的是 Test1 dsw Test1 dsp Test2 Test2 dsp 这个结构不太清晰 xff0c 用过vc7或更高的朋友知道 xff0c 他们的目录
  • C语言50题之百度笔试题

    判断你的电脑存储方式是大端还是小端 大端模式 xff0c 是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 xff0c 这样的存储模式有点儿类似于把数据当作字符串顺序处理 xff1a 地址由小向大增加 x
  • 关于C语言中return的总结

    return break和continue 这三个关键字有一个共同点 xff0c 那就是读能让后面的语句不执行 xff0c 不同的地方就是挑的距离不一样 return很强大 xff0c 如果一个函数中有一个return xff0c 并且执行
  • Windows下Cmake的简单使用

    一 安装Cmake 官网 xff1a https cmake org 本文以Windows64为例 二 项目目录如下 xff1a 1 新建demo文件夹 2 在demo文件夹下新建bin文件夹 HelloWorld cpp CMakeLis
  • Cmake的动态链接库dll的生成并测试

    一 项目任务 1 完成一个CMake工程生成一个动态库 xff0c 该动态库包含内容 xff1a 1 包含一个StringUtil类 xff0c 该类具有Split和Trim2个静态方法 上述2个接口的定义如下 xff1a 删除字符串两侧的
  • cmd/dos批处理脚本出错-is not recognized as an internal or external command

    cmd xff08 dos xff09 批处理脚本执行出现错误 xff1a is not recognized as an internal or external command xff0c 运行中断 脚本文件无语法错误 xff0c 编辑
  • CTF竞赛介绍及刷题网址更新---2020.08

    CTF xff08 Capture The Flag xff09 中文一般译作夺旗赛 xff0c 在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会 xff0c 以代替之前黑
  • VS2008与Matlab混合编程设置

    VS2008 与MATLAB R2009b 混合编程环境配置 一 xff0c VS2008 中的函数调用matlab的写好的函数 1 Matlab 生成 DLL 1 1 编译器的安装 实验环境 xff1a XP 32 位机MATLAB R2
  • System.console().readPassword() java.lang.NullPointerException

    java核心技术 卷I 书籍中有关 java io Console 类的1个示例 System console readLine 与 System console readPassword 在 idea 中运行出现 java lang Nu
  • Linux man中文手册的安装与使用

    概要 xff1a 在 ubuntu 20 04 中下载 安装使用 man 中文手册 文章目录 linux shell命令学习法宝 man 手册man中文手册的下载 安装及环境变量的配置下载安装环境变量配置及 cman 命令使用 man 中文
  • X window selection --- xclip

    原文 英文 url xff1a https encyclopedia thefreedictionary com X 43 Window 43 selection 本文为笔者的翻译 xff0c 红色部分为笔者增加的批注 文章目录 Activ
  • linux安装xclip实现终端与剪贴板之间的通道

    概要 xff1a ubuntu 20 04 通过安装 xclip 来实现终端与剪贴板之间的数据通道 xff1a xclip 类似 dos 中的 clip命令 xff0c xclip 可将命令执行的结果保存到剪贴板 xff0c 还允许将文件的
  • java中GBK与UTF-8编码的转换

    文章目录 java源文件中中文字符的编码的问题UTF 8和GBK格式的文件相互转换java实现文件编码的转换 java不同编码的字节数组的转换Java判断文件编码格式对于UTF 8格式文件的判断 xff1a 利用cpdetector开源库确
  • GBK编码表

    全国信息技术标准化技术委员会 汉字内码扩展规范 GBK Chinese Internal Code Specification 1 0 版 xff08 按编码顺序排列 xff09 其编码范围 xff1a 8140 xff0d FEFE xf
  • dll文件下载网址

    https cn dll files com
  • windows中dos命令汇总及获取管理员权限

    文章目录 windows 获取管理员权限的2种方式runas 用法 windows dos 命令行语法项windows dos命令总述 windows dos命令详细介绍 win7及以前 微软官网 windows dos命令详细介绍 win
  • windows比cmd更强大的 WMIC命令使用详解

    文章目录 什么是wmic WMIC能做什么 WMIC命令使用帮助文档WMIC命令使用实例wmic的运行方式可以有两种法1 显示进程的详细信息2 停止 暂停和运行服务功能3 显示出BIOS信息4 停止进程的操作5 连接远程电脑6 BIOS 基
  • 编程意识——宏定义封装多个函数参数

    作者 釜薪君 公众号 嵌入式杂牌军 文章目录 前言一 这种意识的来源二 实现源码分析1 函数调用2 宏定义部分3 函数实现4 宏替换后的函数调用 总结 前言 今天带小伙伴们分析一段不错的代码 xff0c 学习一下关于宏封装的一种意识 xff
  • DSP28335的SCI的FIFO中断使用心得

    自学了一段时间的DSP28335的串口设置 xff0c 写下来帮助更多的新手 xff0c 遇到了很多问题也记录一些解决办法 以下全都是我个人的理解 xff0c 可能说的不对 xff0c 大家讨论 1 关于为什么必须用FIFO 一般的DSP系