悦诗风吟网站建设策划书,招聘网站建设的目的,广州公共资源交易中心官网,做网站建设需要做哪些工作DSP开发#xff1a;串口sci的发送与接收实现 文章目录 DSP开发#xff1a;串口sci的发送与接收实现串口配置串口SCI初始化详细分析串口SCI使用 串口配置
/*--------------------------------------------scia----------------------------*/
/*----------------------------…DSP开发串口sci的发送与接收实现 文章目录 DSP开发串口sci的发送与接收实现串口配置串口SCI初始化详细分析串口SCI使用 串口配置
/*--------------------------------------------scia----------------------------*/
/*--------------------------------------------串口1----------------------------*/void UARTa_Init(Uint32 baud)
{unsigned char scihbaud0;unsigned char scilbaud0;Uint16 scibaud0;scibaud37500000/(8*baud)-1;scihbaudscibaud8;scilbaudscibaud0xff;EALLOW;SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; // SCI-AEDIS;InitSciaGpio();//Initalize the SCI FIFOSciaRegs.SCIFFTX.all0xE040;SciaRegs.SCIFFRX.all0x204f;SciaRegs.SCIFFCT.all0x0;// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionSciaRegs.SCICCR.all 0x0007; // 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocolSciaRegs.SCICTL1.all 0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all 0x0003;SciaRegs.SCICTL2.bit.TXINTENA 1;SciaRegs.SCICTL2.bit.RXBKINTENA 1;SciaRegs.SCIHBAUD scihbaud; // 9600 baud LSPCLK 37.5MHz.SciaRegs.SCILBAUD scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA 1; // Enable loop backSciaRegs.SCICTL1.all 0x0023; // Relinquish SCI from Reset
}
// Transmit a character from the SCI
void UARTa_SendByte(int a)
{while (SciaRegs.SCIFFTX.bit.TXFFST ! 0);SciaRegs.SCITXBUFa;
}void UARTa_SendString(char * msg)
{int i0;while(msg[i] ! \0){UARTa_SendByte(msg[i]);i;}
}char SCITXDA_TX_BUF[400];void printf_SCITXDa(char *fmt, ...)
{Uint16 i, j;va_list ap;va_start(ap, fmt);vsprintf((char*) SCITXDA_TX_BUF, fmt, ap);va_end(ap);i strlen((const char*) SCITXDA_TX_BUF); //此次发送数据的长度for (j 0; j i; j) //循环发送数据{while (SciaRegs.SCIFFTX.bit.TXFFST ! 0);SciaRegs.SCITXBUF SCITXDA_TX_BUF[j];}
}
/** name fputc,fputs* brief 串口打印重定向* param None* retval None*/
int fputc(int _c, register FILE *_fp)
{UARTa_SendByte(_c);return _c;
}
int putc(int _c, register FILE *_fp)
{UARTa_SendByte(_c);return _c;
}
int putchar(int data)
{UARTa_SendByte(data);return data;
}
int fputs(const char *_ptr, register FILE *_fp)
{unsigned int i, len;len strlen(_ptr);for (i 0; i len; i){UARTa_SendByte((char) _ptr[i]);}return len;
}这段代码实现了串口SCI串行通信接口的初始化以及向串口发送数据的功能并且通过函数重定向将标准库的输出函数重定向到串口SCI上实现了通过类似于标准库的 printf 函数的格式化字符串向串口SCI发送数据的功能。
以下是代码的详细解释
UARTa_Init 函数 这个函数用于初始化串口SCI通信。它接收一个参数 baud表示所需的波特率。函数通过计算波特率分频寄存器的值来设置波特率。
UARTa_SendByte 函数 这个函数用于将一个字符发送到串口SCI。它通过检查发送FIFO的状态位来判断是否可以发送数据然后将字符 a 发送到SCI的发送缓冲区SCITXBUF中。
UARTa_SendString 函数 这个函数用于将一个字符串发送到串口SCI。它通过循环逐个字符地将字符串中的字符发送到串口SCI。
printf_SCITXDa 函数 这是一个自定义的输出函数。它采用了与标准库函数 printf 类似的格式支持格式化字符串通过变参列表处理不定数量的参数。
char *fmt, …第一个参数 fmt 是格式化字符串后续参数使用 … 表示不定数量的变参。 va_list apva_list 是C标准库中用于处理变参的类型。ap 是一个变参列表指针用于访问传递给函数的变参。 标准库函数重定向 代码中重定义了标准库中的 fputc、putc、putchar 和 fputs 函数使它们调用 UARTa_SendByte 函数向串口SCI发送数据。 通过这些函数的重定向程序可以使用类似于标准库的 printf 函数的格式化字符串将数据输出到串口SCI。同时fputc、putc、putchar 和 fputs 函数也能直接将数据输出到串口SCI方便地进行调试和输出结果信息。需要注意的是由于串口发送速率有限如果发送数据过于频繁可能会导致数据丢失或串口阻塞。因此在实际使用中应该适度控制发送频率确保数据发送的稳定性。
串口SCI初始化详细分析
void UARTa_Init(Uint32 baud)
{unsigned char scihbaud0;unsigned char scilbaud0;Uint16 scibaud0;scibaud37500000/(8*baud)-1;scihbaudscibaud8;scilbaudscibaud0xff;EALLOW;SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; // SCI-AEDIS;InitSciaGpio();//Initalize the SCI FIFOSciaRegs.SCIFFTX.all0xE040;SciaRegs.SCIFFRX.all0x204f;SciaRegs.SCIFFCT.all0x0;// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionSciaRegs.SCICCR.all 0x0007; // 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocolSciaRegs.SCICTL1.all 0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all 0x0003;SciaRegs.SCICTL2.bit.TXINTENA 1;SciaRegs.SCICTL2.bit.RXBKINTENA 1;SciaRegs.SCIHBAUD scihbaud; // 9600 baud LSPCLK 37.5MHz.SciaRegs.SCILBAUD scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA 1; // Enable loop backSciaRegs.SCICTL1.all 0x0023; // Relinquish SCI from Reset
}这段代码是用于初始化串口SCI串行通信接口的函数 UARTa_Init该函数用于配置SCI的寄存器和相关参数以便实现指定的波特率和通信设置。让我们逐个分析设置的寄存器对应位的功能和效果
unsigned char scihbaud0; unsigned char scilbaud0; Uint16 scibaud0; 这里定义了用于保存波特率计算结果的变量 scihbaud 和 scilbaud 作为高8位和低8位以及 scibaud 作为16位整数用于计算波特率分频寄存器的值。
scibaud37500000/(8*baud)-1; 这行代码根据输入的波特率值 baud 计算波特率分频寄存器的值 scibaud。LSPCLK低速外设时钟的频率为 37.5MHzSCI的分频因子为 8由于设置了 SCIHBAUD 和 SCILBAUD 分别为高8位和低8位所以分频后的SCI时钟频率为 37.5MHz / 8 4.6875MHz。因此计算公式为波特率分频值 SCI时钟频率 / 波特率 - 1。
scihbaudscibaud8; scilbaudscibaud0xff; 这两行代码将计算得到的波特率分频寄存器的值 scibaud 分解成高8位和低8位分别存储在 scihbaud 和 scilbaud 中。
EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; // SCI-A EDIS; 这部分代码使能了SCI-A模块的时钟PCLKCR0 寄存器的 SCIAENCLK 位设置为1从而允许对SCI-A进行配置。
InitSciaGpio(); 这是一个初始化SCI-A相关的GPIO通用输入输出端口的函数。通过这个函数将相应的GPIO引脚设置为与SCI-A功能相匹配从而实现SCI-A的通信。
SciaRegs.SCIFFTX.all0xE040; SciaRegs.SCIFFRX.all0x204f; SciaRegs.SCIFFCT.all0x0; 这些代码用于配置SCI FIFOFirst In, First Out寄存器用于配置SCI发送和接收的FIFO的触发阈值等参数。
SciaRegs.SCICCR.all 0x0007; SciaRegs.SCICTL1.all 0x0003; SciaRegs.SCICTL2.all 0x0003; SciaRegs.SCICTL2.bit.TXINTENA 1; SciaRegs.SCICTL2.bit.RXBKINTENA 1; 这些代码配置了SCI的控制寄存器SCICCR、控制寄存器1SCICTL1和控制寄存器2SCICTL2。其中的设置如下
SCICCR.all 0x0007设置为 1 停止位无环回无奇偶校验8 个字符位异步模式空闲线协议idle-line protocol。 SCICTL1.all 0x0003使能发送TX、接收RX和内部 SCICLK。同时禁用接收错误、睡眠模式和发送唤醒。 SCICTL2.all 0x0003使能发送中断TXINTENA和接收中断RXBKINTENA。 SciaRegs.SCIHBAUD scihbaud; SciaRegs.SCILBAUD scilbaud; 这里将之前计算得到的波特率分频寄存器值 scihbaud 和 scilbaud 分别设置到 SCI 模块的高位波特率寄存器SCIHBAUD和低位波特率寄存器SCILBAUD从而配置了SCI的波特率。
SciaRegs.SCICTL1.all 0x0023; 最后这行代码将 SCI 模块的控制寄存器1设置为 0x0023从而解除 SCI 模块的复位状态使得SCI模块开始工作。
通过上述配置串口SCISCI-A已经被成功初始化并配置了指定的波特率和通信设置。接下来可以通过串口SCI进行数据的发送和接收操作。
串口SCI使用
/** main.c** Created on: 2023年7月9日* Author: 黎*/#include main.h
#define MAX_STRING_LENGTH 100 // 定义字符串的最大长度void main()
{int i 0;char *msg;Uint16 ReceivedChar 0;char scia_rx_buf[MAX_STRING_LENGTH] { 0 };int rx_flag 1;int StringIndex 0; // 字符串索引InitSysCtrl();InitPieCtrl();IER 0x0000;IFR 0x0000;InitPieVectTable();UARTa_Init(4800);while (1){printf(\r\nEnter a character: );while (rx_flag){// Wait for inc character// 等待接收字符while (SciaRegs.SCIFFRX.bit.RXFFST ! 1); // wait for XRDY 1 for empty state// 等待 XRDY 1表示缓冲区非空// Get character读取接收到的字符ReceivedChar SciaRegs.SCIRXBUF.all;// 检查是否为换行符或字符串超过最大长度if (ReceivedChar \n || StringIndex MAX_STRING_LENGTH - 1){scia_rx_buf[StringIndex] \0; // 在字符串末尾添加空字符rx_flag 0;break; // 结束接收字符串}// 存储接收到的字符scia_rx_buf[StringIndex] ReceivedChar;StringIndex;}// Echo character backprintf( You sent: );printf(\n scia_rx_buf %s\r\n,scia_rx_buf);rx_flag 1;StringIndex 0;DELAY_US(1000);}
}
这段代码是一个示例程序主要功能是通过串口SCISCI-A接收用户输入的字符并将输入的字符显示回终端上。
以下是代码的详细解释
#define MAX_STRING_LENGTH 100 这里定义了一个宏 MAX_STRING_LENGTH用于指定字符串的最大长度。在这个示例中最大长度被设置为100。
void main() 这是程序的主函数入口。
变量初始化
int i 0;一个用于循环计数的变量。 char *msg;未使用的指针变量。 Uint16 ReceivedChar 0;用于存储接收到的字符的变量初始值为0。 char scia_rx_buf[MAX_STRING_LENGTH] { 0 };用于存储接收到的字符串的字符数组初始值全部为0。 int rx_flag 1;用于控制接收字符的标志位初始值为1表示正在接收字符。 int StringIndex 0;字符串索引用于指示当前接收到的字符在 scia_rx_buf 数组中的位置。 初始化系统控制和中断控制寄存器。
初始化串口SCISCI-A UARTa_Init(4800);这个函数用于初始化SCI-A通信并设置波特率为4800。
进入主循环 while (1)
通过 printf 函数提示用户输入字符“Enter a character: ”。 等待接收字符while (rx_flag) 表示一直等待接收字符直到 rx_flag 变为0。 在接收到字符时通过 SciaRegs.SCIFFRX.bit.RXFFST 检查SCI接收缓冲区是否有字符到达。 读取接收到的字符并存储在 ReceivedChar 中。 判断接收的字符是否为换行符或字符串长度是否超过最大长度MAX_STRING_LENGTH如果是则结束接收并在字符串末尾添加空字符‘\0’同时将 rx_flag 置为0退出接收字符的循环。 否则将接收到的字符存储在 scia_rx_buf 数组中并增加 StringIndex 值指示下一个字符应该存储在数组的下一个位置。 回显接收到的字符
通过 printf 函数显示 You sent: 。 通过 printf 函数显示接收到的字符串 scia_rx_buf。 最后将 rx_flag 和 StringIndex 重置为初始值然后通过 DELAY_US 函数延迟一段时间这里是1000微秒。
循环会不断重复用户可以在终端输入字符程序会接收并显示回显字符直到结束。
如果文章对您有所帮助点赞支持感谢