找回密码
 立即注册
查看: 41|回复: 4

新手求助,关于UART2

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-14 10:21:15

3

主题

7

回帖

33

积分

新手上路

积分
33
发表于 前天 20:55 | 显示全部楼层 |阅读模式
使用软件生成的代码该怎么用?以下为Uart.c文件

#include "Uart.h"

BOOL fPrintfBusy;
uint8_t xdata UART2_DAM1[16];           //串口2DMA发送缓冲区数组
uint8_t xdata UART2_DAM2[16];           //串口2DMA接收缓冲区数组
////////////////////////////////////////
// 定时器2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_Init(void)
{
#define T2_PSCR                 (0)
#ifdef BAUDRATE
#undef BAUDRATE
#endif
#define BAUDRATE                (115200UL)
#define T2_RELOAD               (65536 - (SYSCLK / 12 / BAUDRATE + 2) / 4)

    TIMER2_TimerMode();                 //设置定时器2为定时模式
    TIMER2_12TMode();                   //设置定时器2为12T模式
    TIMER2_SetPrescale(T2_PSCR);        //设置定时器2的8位预分频
    TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
    TIMER2_Run();                       //定时器2开始运行

    //<<AICUBE_USER_TIMER2_INITIAL_BEGIN>>
    // 在此添加用户初始化代码  
    //<<AICUBE_USER_TIMER2_INITIAL_END>>
}

////////////////////////////////////////
// 串口2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_Init(void)
{
    UART2_SwitchP4647();                //设置串口数据端口: RxD2 (P4.6), TxD2 (P4.7)

    UART2_Timer2BRT();                  //串口2固定选择定时器2作为波特率发生器(W1[S2CFG.0]必须设置为1)

    UART2_EnableRx();                   //使能串口2接收数据
    UART2_Mode1();                      //设置串口2为模式1 (8位数据可变波特率)
    UART2_SetIntPriority(0);            //设置中断为最低优先级
    UART2_EnableInt();                  //使能串口2中断

    DMA_UART2_SetTxAmount(15);          //设置串口DMA发送总字节数
    DMA_UART2_SetTxAddress(UART2_DAM1); //设置串口DMA发送缓冲区地址
    DMA_UART2_ClearTxFlag();            //清除串口发送DMA中断标志
    DMA_UART2_SetTxBusPriority(0);      //设置总线访问为最低优先级
    DMA_UART2_SetTxIntPriority(0);      //设置中断为最低优先级
    DMA_UART2_EnableTxInt();            //使能串口2DMA发送中断
    DMA_UART2_EnableTx();               //使能串口2DMA发送功能
//    DMA_UART2_DisableTx();              //关闭串口2DMA发送功能
//  DMA_UART2_TriggerTx();              //触发串口2DMA发送

    DMA_UART2_SetRxAmount(15);          //设置串口DMA接收总字节数
    DMA_UART2_SetRxAddress(UART2_DAM2); //设置串口DMA接收缓冲区地址
    DMA_UART2_ClearFIFO();              //清空串口DMA接收FIFO缓冲区
    DMA_UART2_ClearRxFlag();            //清除串口接收DMA中断标志
    DMA_UART2_SetRxBusPriority(0);      //设置总线访问为最低优先级
    DMA_UART2_SetRxIntPriority(0);      //设置中断为最低优先级
    DMA_UART2_EnableRxInt();            //使能串口2DMA接收中断
    DMA_UART2_EnableRx();               //使能串口2DMA接收功能
//    DMA_UART2_DisableRxInt();           //关闭串口2DMA接收功能
//  DMA_UART2_TriggerRx();              //触发串口2DMA接收

    fPrintfBusy = 0;                    //清除发送数据忙标志

    //<<AICUBE_USER_UART2_INITIAL_BEGIN>>
    // 在此添加用户初始化代码  
    //<<AICUBE_USER_UART2_INITIAL_END>>
}

////////////////////////////////////////
// 重写printf字符发送重定向函数
// 入口参数: dat (printf函数待打印的字符)
// 函数返回: 需要返回入口参数的数据
////////////////////////////////////////
char putchar (char dat)                 //将串口2和printf函数绑定
{
    while (fPrintfBusy);
    UART2_SendData(dat);
    fPrintfBusy = 1;

    return dat;
}





////////////////////////////////////////
// 串口2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_ISR(void) interrupt UART2_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码  
    if (UART2_CheckTxFlag())            //判断串口发送中断
    {
        UART2_ClearTxFlag();            //清除串口发送中断标志

        fPrintfBusy = 0;                //清除printf发送忙标志
    }

    if (UART2_CheckRxFlag())            //判断串口接收中断
    {
        UART2_ClearRxFlag();            //清除串口接收中断标志
    }
    //<<AICUBE_USER_UART2_ISR_CODE1_END>>
}

////////////////////////////////////////
// 串口2发送DMA中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void DMA_UART2TX_ISR(void) interrupt DMA_UR2T_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE2_BEGIN>>
    // 在此添加中断函数用户代码  
    if (DMA_UART2_CheckTxFlag())        //判断串口发送DMA中断
    {
        DMA_UART2_ClearTxFlag();        //清除串口发送DMA中断标志
    }
    //<<AICUBE_USER_UART2_ISR_CODE2_END>>
}

////////////////////////////////////////
// 串口2接收DMA中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void DMA_UART2RX_ISR(void) interrupt DMA_UR2R_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE3_BEGIN>>
    // 在此添加中断函数用户代码  
    if (DMA_UART2_CheckRxFlag())        //判断串口接收DMA中断
    {
        DMA_UART2_ClearRxFlag();        //清除串口接收DMA中断标志
    }
    //<<AICUBE_USER_UART2_ISR_CODE3_END>>
}


软件配置代码

软件配置代码

Uart.h文件

Uart.h文件
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:768
  • 最近打卡:2026-04-15 00:06:38
已绑定手机

19

主题

3362

回帖

7021

积分

论坛元老

积分
7021
发表于 前天 22:13 | 显示全部楼层
看你要怎么用了,现在可以putchar函数输出字符
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-14 10:21:15

3

主题

7

回帖

33

积分

新手上路

积分
33
发表于 昨天 10:21 | 显示全部楼层
so*** 发表于 2026-4-13 22:13
看你要怎么用了,现在可以putchar函数输出字符

我想做到电脑向单片机发送一个指令,然后单片机接收到之后做出对应操作,或者单片机发出一个指令,电脑这边显示
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:219
  • 最近打卡:2026-04-15 00:01:34
已绑定手机

17

主题

331

回帖

1622

积分

金牌会员

DIY玩家

积分
1622
发表于 昨天 12:01 | 显示全部楼层
圣灵*** 发表于 2026-4-14 10:21
我想做到电脑向单片机发送一个指令,然后单片机接收到之后做出对应操作,或者单片机发出一个指令,电脑这 ...

单片机接收到数据
解析指令数据
执行操作
如点灯
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-14 10:21:15

3

主题

7

回帖

33

积分

新手上路

积分
33
发表于 昨天 14:08 | 显示全部楼层
狂热*** 发表于 2026-4-14 12:01
单片机接收到数据
解析指令数据
执行操作

步骤大概知道一些,就是不太清楚怎么调用
下面的就是调用了,不管怎么写,串口都不打印

BOOL fPrintfBusy;
uint8_t xdata UART2_DAM1[16];           //串口2DMA发送缓冲区数组
uint8_t xdata UART2_DAM2[16];           //串口2DMA接收缓冲区数组

uint8_t  xdata UART2_RX_BUF[32];   // 最终接收数据
uint8_t  UART2_RX_LEN = 0;         // 收到的长度
bit      UART2_RX_OK = 0;          // 接收完成标志
////////////////////////////////////////
// 串口2接收DMA中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void DMA_UART2RX_ISR(void) interrupt DMA_UR2R_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE3_BEGIN>>
    // 在此添加中断函数用户代码  
    uint8_t i;
   
    if (DMA_UART2_CheckRxFlag())        //判断串口接收DMA中断
    {
        DMA_UART2_ClearRxFlag();        //清除串口接收DMA中断标志
        
        // 把 DMA 收到的数据拷贝到应用缓冲区
        UART2_RX_LEN = 15;              // 你设置的是16字节
        for(i=0; i<UART2_RX_LEN; i++)
        {
            UART2_RX_BUF = UART2_DAM2;
        }

        UART2_RX_OK = 1;                // 标记:一帧数据接收完成

        DMA_UART2_ClearFIFO();
        // 重新启动 DMA 接收,等待下一次数据
        DMA_UART2_SetRxAmount(15);
        DMA_UART2_SetRxAddress(UART2_DAM2);
        DMA_UART2_EnableRx();
    }
    //<<AICUBE_USER_UART2_ISR_CODE3_END>>
}

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    uint8_t i;
    SYS_Init();
   

    while (1)
    {
        // DMA 接收完成
        if(UART2_RX_OK)
        {
            printf("DMA收到数据:");
            for(i=0; i<UART2_RX_LEN; i++)
            {
               printf("%c",UART2_RX_BUF);
            }
            printf("\r\n");
            // 清空标志,准备下一次接收
            UART2_RX_OK = 0;
            UART2_RX_LEN = 0;
            //memset(UART2_RX_BUF, 0, sizeof(UART2_RX_BUF));//清空缓存区
        }
    }
}
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-15 07:16 , Processed in 0.130008 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表