2227|0

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

[MSPM0L1306 LaunchPad 开发套件] 3-UART的使用,以及不定长数据的接收 [复制链接]

 
本帖最后由 manhuami2007 于 2023-10-30 18:01 编辑

串口是一个经常使用的接口,能够与其它芯片通信,也能输出运行信息。这次在上一个帖子的基础上使用UART,向电脑输出消息。

1. 在CCS中,打开工程里的”empty.syscfg”文件,先对UART进行一下设置。Launchpad上的UART使用的是PA8和PA9,因此需要在UART的PinMux中进行设置。其它的使用默认参数

2. 还需要一个延时函数,其提供了一个延时函数是delay_cycles(cycles) ,这个函数是按照时钟周期进行延时的,有点像nop函数。

3. TI提供的库函数中,包括轮询形式去发送或者接收1个字符,函数如下

  • DL_UART_transmitDataBlocking()
  • DL_UART_receiveDataBlocking()
    下面的代码实现了串口发送的功能:

 

4. TI的库函数中,还提供了一些接收和发送的函数:

  • void DL_UART_transmitData(UART_Regs *uart, uint8_t data)
  • uint8_t DL_UART_receiveData(UART_Regs *uart)
    这两个函数很基础,就是返回接收和发送寄存器的值,因此在使用之前需要确定,确实收到了数据,或者确实能够发送数据。
  • bool DL_UART_transmitDataCheck(UART_Regs *uart, uint8_t data)
  • bool DL_UART_receiveDataCheck(UART_Regs *uart, uint8_t *buffer)

          这两个函数则是会去检查FIFO,也就是说会去确认是否收到了数据或者能够发送数据,如果发送或者接收成功则返回true。

5. 在上面的函数中提到了FIFO。这款芯片的UART是包含4个字节的发送FIFO和4个字节的接收FIFO的,有FIFO可以降低MCU处理数据的负担。FIFO默认是不开启的,没开启的时候就相当于是1个字节的FIFO了。如果想要开启,见下图。

6. 如果想实现不定长数据的接收,可以使用IDLE LINE模式,IDLE LINE模式下,当大于10出现大于10个位的高电平之后,就会置IDLE标志位,正好适合不定长数据的接收,设置方式如下图所示:

注意有个地址的设置,因为我们不去管地址位,因此需要将mask设置为0 。

这里要提交一个BUG,软件生成的初始化函数有错误,见下图。下图的两个函数,在库函数里是没有的,是生成的函数名字不对。正确的名字见下下图。

这两个函数要换成下图的这两个:

因此我们需要自己创建初始化函数,要不编译通不过。

初始化代码如下

DL_UART_Main_Config mygUART_0Config = {
    .mode        = DL_UART_MAIN_MODE_IDLE_LINE,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

void APP_DL_UART_0_init(void)
{

    DL_UART_Main_init(UART_0_INST, (DL_UART_Main_Config *) &mygUART_0Config);
    /* Set the address mask and the address to match */
    DL_UART_setAddressMask(UART_0_INST, 0);
    DL_UART_setAddress(UART_0_INST, 0);
    DL_UART_Main_enable(UART_0_INST);
}

实现不定长数据接收,并回送回去的代码:

int main(void)
{
    uint8_t str[50];
    int i = 0,j;
    SYSCFG_DL_init();
    APP_DL_UART_0_init();

    while (1) {
        i = 0;
        while(DL_UART_isIdleModeDetected(UART_0_INST) == false){
            if(DL_UART_receiveDataCheck(UART_0_INST,&str[i]) == true){
                i++;
            }
        }
        for(j=0;j<i;j++){
            DL_UART_transmitDataBlocking(UART_0_INST,str[j]);
        }
    }
}

 

此帖出自MSPM0 MCU论坛
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表