查看: 1169|回复: 0

[评测分享] 【NXP OKdo E1双核Cortex M33开发板】-4-USART 2以中断方式通讯讲解

[复制链接]
  • TA的每日心情
    无聊
    2022-4-28 09:50
  • 签到天数: 443 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2020-12-1 19:27:56 | 显示全部楼层 |阅读模式
    分享到:
      在上一篇帖子中,笔者规划的是用OK DoE1板子上的2路串口来进行数据的收发交互。碰巧笔者最近也各种忙,但笔者从未放弃过自己的想法,忙里偷闲,偶尔得空,笔者也会去看看小伙伴们的技术分享、学学经验;同时笔者也尝试了NXP官方LPC55S69 SDK的关于串口的例程;几乎所有的例程中都是用到的调试串口即 UART0 来做演示,笔者所有UART0的例程也都跑通了。
    那么问题来了:UART1、UART2 可以用吗?怎么用?
    答案: UART1 不可用,因为RX TX接口没引出来;
        UART2 可用, RX PIO 1.24 ,TX PIO 0.27;
        UART3 不可用,因为TX接口没引出来;
        UART4 不可用,因为RX接口没引出来;
        UART5 不可用,因为RX TX接口没引出来;
        UART6 不可用,因为RX TX接口没引出来;
        UART7 不可用,因为RX TX接口没引出来;

       NXP官方LPC55S69SDK中,串口提供了三种通讯方式:DMA、轮询、中断。
    串口通讯方式3种.png
      笔者测试了这三种,发现使用DMA方式,当缓存buffer中的数据上一个操作没有处理完,会留在下一个操作中。这种方式可以避免数据的丢失。笔者比较喜欢采用中断方式的进行通讯,现跟大家分享一下我是如何用中断方式编写USART2的串口收发例程:

    步骤1:建工程;
    首先时用MCUXpressoIDE导入SDK example,导入driver_examples->usart->usart_interrupt例程;

    步骤2:配时钟;
    接着打开“配置工具”--->“时钟”—>“时钟显示图”,修改功能组为BOARD_BootClockPLL150M的时钟配置情况:
    时钟配置1.png
    时钟配置2.png
    如上图所示,笔者把系统时钟配置为150Mhz,把FXCOMCLK2.clock配置为12Mhz.

    步骤3:配置I/O引脚;
    配置IO.png

    如图配置USART2的RXD\TXD引脚:PIO 1_24、PIO 0_27;

    步骤4:配置USART2 串口相关参数;
    1. usart_config_t      UART2Config;
    2. USART_GetDefaultConfig(&UART2Config);
    3. UART2Config.baudRate_Bps = 9600U;
    4. UART2Config.enableTx = true;
    5. UART2Config.enableRx = true;
    6. USART_Init(USART2, &UART2Config, 12000000);
    复制代码
    步骤5:使能相关的中断资源;
    1. /* 使能串口接收中断函数-Enable RX interrupt. */
    2. USART_EnableInterrupts(USART2,kUSART_RxLevelInterruptEnable|kUSART_RxErrorInterruptEnable);//使能串口2中断
    3. EnableIRQ(FLEXCOMM2_IRQn);//使能FLEXCOMM2中断服务
    复制代码
    步骤6:编写中断处理函数USART2_IRQHandler()
    1. void USART2_IRQHandler(void)
    2. {
    3.   uint8_t data;
    4.   /* If new data arrived.*/
    5. if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(USART2))
    6.     {
    7.   data = USART_ReadByte(USART2);
    8. /* If ring buffer is not full, add data to ring buffer. */
    9.             if (((rxIndex + 1) % RING_BUFFER_SIZE) != txIndex)
    10.             {
    11.   RingBuffer[rxIndex] = data;
    12.   rxIndex++;
    13.   rxIndex %= RING_BUFFER_SIZE;
    14.             }
    15.         }
    16.         SDK_ISR_EXIT_BARRIER;
    17. }
    复制代码
    步骤7:业务函数的编写;
    1. while (1)
    2.     {
    3.   while ((kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(USART2)) && (rxIndex != txIndex))
    4. {
    5.    USART_WriteByte(USART2,RingBuffer[txIndex]);
    6.    txIndex++;
    7.    txIndex %= RING_BUFFER_SIZE;
    8. }
    9. }
    复制代码
       至此,完成了以中断方式进行USART2串口收发数据的例程介绍。该例程显示的效果是把串口2 RX引脚接收到的数据直接通过串口2 TX引脚发送出来,波特率设为9600。
    串口效果.png
    传一张实物接线图:
    实物.jpg
    最后,随附件附上工程全部源码,希望对小伙伴们有所帮助。




    lpcxpresso55s69_usart2_interrupt.rar

    3.94 MB, 下载次数: 1

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-7 00:43 , Processed in 0.119808 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.