本帖最后由 jinglixixi 于 2022-6-14 23:04 编辑
由相关资料可知,在LKS32MC081内部有2路UART通讯模块,分别是UART0和UART1。 要掌握其串口通信,我们可以从相应的例程来进行学习。就例程3种使用方式,即DMA方式、单线方式及双线方式,在双线方式,则方便给出了UART0和UART1的通讯程序。至于单线方式方式,则是一种双机间的单工通讯,即通过功能切换来决定其作为接收端或发送端,而不能同时进行收发处理。 对于调试下载工具来讲,尽管它也是以虚拟串口的形式出现,但却不能用于串行通讯的测试,因此对串口的通讯测试需要自行外挂一个USB转TTL的通讯模块来实现,其在设备管理器中的表现形式见图1所示。 图1串口设备 对于UART0的通讯来讲,其使用的引脚为P1.0和P0.15,其引脚功能见图2所示。
图2引脚功能 其程序功能是通过UART0向外方式十六进制数AA,见图3所示。若向其发送单字节的数据,则会加以回显,见图4所示。由于程序是在不间断地向外发送数据,故回显内容会淹没其中,不易发现。
图3发送数据
图4回显数据 对于串行通讯来讲,是有一定参数要求的,如波特率、数据位数、校验方式等,这可以在函数UART_init()中加以修改,其内容如下: void UART_init(void)
{
UART_InitTypeDef UART_InitStruct;
UART_StructInit(&UART_InitStruct);
UART_InitStruct.BaudRate = 38400;
UART_InitStruct.WordLength = UART_WORDLENGTH_8b;
UART_InitStruct.StopBits = UART_STOPBITS_1b;
UART_InitStruct.FirstSend = UART_FIRSTSEND_LSB;
UART_InitStruct.ParityMode = UART_Parity_EVEN;
UART_InitStruct.IRQEna = UART_IRQEna_SendOver | UART_IRQEna_RcvOver;
UART_Init(UART0, &UART_InitStruct);
UART0_IF = 0xff;
}
由于字节数据功能在串行通讯中十分重要,因此可以对例程加以修改,使之成为一个发送字节指令的程序,其内容如下: uint8_t SendArray[4] = {8, 9, 7, 6};
int main(void)
{
u8 i;
Hardware_init();
delay(0X2FFFF);
while (1)
{
for(i=0;i<4;i++)
{
UART_SendData(UART0, SendArray[i]);
delay(0X2FFFF);
}
delay(0X2FFFF);
delay(0X2FFFF);
}
}
图5发送多字节指令 这样再遇到那些以指令来控制的串口设备,就可以用它来解决,如控制MP3语音播放模块等。 在例程中,UART1的通讯程序所用的引脚是P2.4和P2.5,而非扩展接口上的P2.8和P3.9,见图6所示。 而P2.4和P2.5在开发板上是已被分配给HALL_W和HALL_V,这在使用时,是格外加以注意的。
图6引脚连接 UART1的通讯程序如下: int main(void)
{
Hardware_init();
GPIO_LED(ALL_OFF);
while (1)
{
UART1->BUFF = 0x12;
for (Timer = 20; Timer > 0; Timer--)
delay(60000);
}
}
其功能是不断向外发送字节数据12,若向其发送单字节数据,也会以中断的方式加以回显处理,见图7所示
图7 UART1测试 若将程序修改为如下内容: int main(void)
{
Hardware_init();
GPIO_LED(ALL_OFF);
while (1)
{
for (Timer = 20; Timer > 0; Timer--)
delay(60000);
}
}
则可实现发送内容的回显处理,将图8所示。 在此基础上加以适当的修改,则可实现串口设备间的交互应答及指令控制。
图8 方式测试
此外,在添加函数fputc()的情况下,可实现printf()函数的使用。 int fputc(int ch, FILE *f)
{
UART0_BUFF = (uint8_t)ch;
while(!(UART0_IF & UART_IF_SendOver));
UART0_IF = UART_IF_SendOver;
return ch;
}
|