This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
此外、在带有中断的 SCI 回送示例中、我无法理解以下行集:
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
PieVectTable.SCITXINTA =&sciaTxFifoIsr;
PieVectTable.SCIRXINTB =&scibRxFifoIsr;
PieVectTable.SCITXINTB =&scibTxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
1.此函数之前的'&'是什么意思? 注释行显示了它的重映射、但我无法理解它。 此外、该函数还有一个下划线、这显然意味着编译器和标准库使用的函数。 我无法理解这一点。
2.这些行是否也调用了各自的函数(sciRxFifoIs 等)? 因为在代码中没有其他地方调用此函数。 那么、如何执行该函数呢? 该行只是建议它被映射、并且没有函数调用。 但是
Anu、
您是否参加了有关该器件的一日技术讲座? 它通过中断服务例程。
https://training.ti.com/c2000-f2833x-microcontroller-workshop
我已经搜索过该手册、但无法找到有关 ISR 的信息。
您搜索了有关 ISR 的哪些手册?
这是编译器文档的链接
http://www.ti.com/lit/ug/spru514p/spru514p.pdf
您是否参加过技术讲座以更好地了解器件?
谢谢。 我现在可以理解。 但我无法理解如何在以下特定代码中调用 ISR:
根据 SCI 参考指南、如果 TXFFST 小于 TXFFIL、TX FIFO 将生成中断:
"当 FIFO 状态位(TXFFST4-0)小于或等于 FIFO 中断级别位(TXFFIL4-0)时、发送 FIFO 将产生中断"。
那么、在这里、只要 TxFifo 没有少于8个字、就会为 SciaTxFifoIsr 提供服务。 (因为在此代码中、TXFFIL 被写入8)
因此 ,在调用 scia_fifo_init()之后, 会立即设置 SciaRegs.SCIFFTX.All= 0xC028。 因此、现在 TXFFIL = 8个字、而 TxFifo 具有0个字。 因此、将输入 ISR SciaTxFifoIsr 并进行服务。 因此 SCITXBUF 将写入 sdataA[i]的值。
但 sdata[i]仅在步骤5中初始化(在 scia_fifo_init()之后;在步骤4中调用)。
那么、由于 sdata[i]的值在初始化前被写入、那么 SCITXBUF 中将写入什么值?
[初始化仅在步骤5中进行。 但是 ,在步骤4中调用 scia_fifo_init(),使中断服务例程作为 TXFFST (0个字)被调用,小于 FIFO 中断级别位(TXFFIL)-它有8个字 ]
Anu、
我仍然建议您浏览技术参考手册第1.6节的 PIE 控制部分。 这详细说明了如何在器件上管理中断。
http://www.ti.com/lit/ug/sprui07/sprui07.pdf。
在步骤5中启用中断后、才会生成中断。
// //启用此示例所需的中断 // PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块 PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE 组9,INT1 PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE 组9,int2 PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE 组9,INT3 PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE 组9,int4 IER = 0x100;//启用 CPU INT EINT;
专题讨论会链接:
https://training.ti.com/c2000-f2833x-microcontroller-workshop
谢谢。 这让我明白了。 不过、在同一个带有中断的 SCI 回送示例中、我有最后一个疑问。
SCITXFIFO 和 SCIRXFIFO 配置为:
SciaRegs.SCIFFTX.All=0xC028;// 1100 0000 0010 1000 // TXFFIL = 8个字,RXFFST =0
SciaRegs.SCIFFRX.All=0x0028;// 0000 0010 1000 // RXFFIL = 8个字,RXFFST=0
第一个问题是 Tx/RX FIFO 和 TX/RXBUF 只有8位宽-->一个字。 那么、它们如何容纳8个字呢? 如果 TXFFST = 8、则表示接收 FIFO 中有8个字对吗? 怎么可能?
2.根据 SCI 参考指南、如果 TXFFST 小于 TXFFIL、TX FIFO 将生成中断
"当 FIFO 状态位(TXFFST4-0)小于或等于 FIFO 中断级别位(TXFFIL4-0)时、发送 FIFO 将产生中断"。
因此、当 接收到一个字并且为所有 TXFFST <TXFFIL (8 words) right? 提供中断服务时、将从 sdataA[i]数组中读取数据
但是只有当 RXFFST 大于 RXFFIL 时、RX FIFO 才会产生中断
"当 FIFO 状态位(RXFFST4-0)大于或等于 FIFO 中断级别位(RXFFIL4-0)时、接收 FIFO 会产生中断"。
由于在内部回送中、Tx 和 Rx 短接、因此 Rx 中将接收相同的数据。
因此、数据将从 SCIRXBUF 阵列中读取。 但是只有当 RXFFST>=RXFFIL 时、才会为中断提供服务。 因此、这意味着 ISR 将仅在 RXFFST 达到8时运行。 但 FIFO 本身只能保存8位(1个字)。 那么、如何一次读取8个字的数据呢? 此外、示例代码中的 ISR 表明读取的数据仅为一个字。 如果仅在 RXFIFO 有8个字且只读一个字时才调用中断、则7个字的其余部分将永远不会被读取。 那么、这是否意味着数据是作为接收字时读取的? 但定义说明了其他情况。 (也就是说、只有在 RXFFST >= RXFFIL 时才会处理中断)。
for (i=0;i<8;i++)
{
rdataA[i]=SciaRegs.SCIRXBUF.all;//读取数据
}
这是怎么可能的?
谢谢!
好的、那么只需澄清一下。
Tx/Rx FIFO 是一个16 x 8位的堆栈、因此可以容纳16个字。
根据示例中 Tx 和 Rx FIFO 的配置、数据将被写入 SCITXBUF 1字一次。
但是、在 FIFO 被启用时、TXSHF 将在一个可选延迟值(SCIFFCT)后被直接载入;TXBUF 将不被使用。 那么、在 ISR 中写入 TXBUF 有什么意义呢?
3.当 SCI 接收到数据时、RXENA (SCICTL1.0)被置位、 RXSHF 寄存器中的数据被传输到 SCIRXBUF 寄存器。 此操作将置位 RXRDY 标志(SCIRXST、位6)、如果 RX/BK INT ENA 位(SCICTL2.1)被置位、 则会启动一个中断。
但是在 FIFO 被启用的情况下、如果 RXFFIL 被置位并且 RXFFIENA 被启用、中断将被处理。 RXFFIENA 在 RXFIFO 中的字数量达到8时置1;并且第一个字被读取。
由于它是无限循环、因此最终将读取 RXFIFO 中的所有字。 但是、当它不是无限循环时、情况会怎样呢? 那么、RXFFIL 应该设置为1对吧? 那么、每个字在何时以及何时被读取?