gpt4 book ai didi

c - 带 PDC 的 UART 写缓冲器

转载 作者:行者123 更新时间:2023-12-01 04:42:01 24 4
gpt4 key购买 nike

我在使用 const char buffer 和 char arrray 写入 USARt 时遇到问题。

这是我的 UART 写函数:

unsigned int USART_Send(  unsigned char *p_pucData, 
unsigned int p_unLen)
{


AT91C_BASE_US2->US_TPR = (unsigned int)p_pucData;
AT91C_BASE_US2->US_TCR = p_unLen;
AT91C_BASE_US2->US_PTCR = AT91C_PDC_TXTEN;


while((AT91C_BASE_US2->US_CSR & ((0x1 << 11) | (0x1 << 4) ) ) == 0);

AT91C_BASE_US2->US_PTCR = AT91C_PDC_TXTDIS;

return p_unLen;
}

以下使用 const char* 的函数如下:

USART_Send("IsitDone?",9);   //Working

如果我使用如下所示的数组缓冲区,它会显示乱码,想知道为什么吗?

 unsigned char arr[10];
memcpy(arr, "HelloWorld", 10);
USART_Send(arr, sizeof(arr)); //Not working properly displaying Garbage chars

最佳答案

Ricardo Crudo 是正确的。您遇到了以下问题:

arr is created on the stack
arr is filled
call USART_Send
fill transmit pointer, counter, enable tx requests
/* peripheral state is TXBUFE = '0' and ENDTX = '0' because: */
/* TXBUFE = '0' when PERIPH_TCR != 0 and */
/* ENDTX = '0' when PERIPH_TCR != 0 */
/* but we just wrote to PERIPH_TCR, so it's != 0 */
/* both conditions are satisfied, b/c the transfer hasn't started yet! */
wait until (TXBUFE = '0' and ENDTX = '0')
/* your code thinks PDC is done here */
/* but in reality, PDC is getting started */
disable tx requests
return from sub-function
overwrite stack (and arr) with unrelated data here
/* PDC might push out last word(s) here due to pipelining/ */
/* instruction cache/side effects/you-name-it */
/* even though its matrix requests were disabled a few cycles ago */

解决方案:

  • 复制到全局缓冲区
  • 在启用 tx 请求和检查 PDC 是否完成之间等待一些周期(可能是整个波特率 tick)
  • 读回 PERIPH_TCR 并检查它是否为零而不是检查标志

理想情况下,您将为字符串分配一些动态内存,并在 PDC 与您的实际代码异步完成后释放它。您可能想检查在 PDC/外围设备完成后是否可以获得某种中断,然后释放它读取的内存。

如果您没有动态内存分配,则使用全局环形缓冲区并将您的字符串/字符发送函数抽象化以改为使用此缓冲区。

关于c - 带 PDC 的 UART 写缓冲器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25680878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com