[LKS32 硬件]

【LKS32MC081评测 】+串行通讯及应用

[复制链接]
472|1
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2022-6-11 13:27 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2022-6-14 23:04 编辑

由相关资料可知,在LKS32MC081内部有2路UART通讯模块,分别是UART0和UART1。
要掌握其串口通信,我们可以从相应的例程来进行学习。就例程3种使用方式,即DMA方式、单线方式及双线方式,在双线方式,则方便给出了UART0和UART1的通讯程序。至于单线方式方式,则是一种双机间的单工通讯,即通过功能切换来决定其作为接收端或发送端,而不能同时进行收发处理。
对于调试下载工具来讲,尽管它也是以虚拟串口的形式出现,但却不能用于串行通讯的测试,因此对串口的通讯测试需要自行外挂一个USB转TTL的通讯模块来实现,其在设备管理器中的表现形式见图1所示。
1.jpg
图1串口设备
对于UART0的通讯来讲,其使用的引脚为P1.0和P0.15,其引脚功能见图2所示。
2.jpg
图2引脚功能
其程序功能是通过UART0向外方式十六进制数AA,见图3所示。若向其发送单字节的数据,则会加以回显,见图4所示。由于程序是在不间断地向外发送数据,故回显内容会淹没其中,不易发现。
3.jpg
图3发送数据
4.jpg
图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.jpg
图5发送多字节指令
这样再遇到那些以指令来控制的串口设备,就可以用它来解决,如控制MP3语音播放模块等。
在例程中,UART1的通讯程序所用的引脚是P2.4和P2.5,而非扩展接口上的P2.8和P3.9,见图6所示。
而P2.4和P2.5在开发板上是已被分配给HALL_W和HALL_V,这在使用时,是格外加以注意的。
6.jpg
图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.jpg
图7 UART1测试
若将程序修改为如下内容:
int main(void)
{
         Hardware_init();
         GPIO_LED(ALL_OFF);
         while (1)
         {
                     for (Timer = 20; Timer > 0; Timer--)
                              delay(60000);
         }
}

则可实现发送内容的回显处理,将图8所示。
在此基础上加以适当的修改,则可实现串口设备间的交互应答及指令控制。
8.jpg
图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;
}


使用特权

评论回复
上下而求索| | 2022-6-11 13:47 | 显示全部楼层
速度

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

36

粉丝