圣灵主宰 发表于 2026-4-13 20:55:43

新手求助,关于UART2

使用软件生成的代码该怎么用?以下为Uart.c文件

#include "Uart.h"

BOOL fPrintfBusy;
uint8_t xdata UART2_DAM1;         //串口2DMA发送缓冲区数组
uint8_t xdata UART2_DAM2;         //串口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必须设置为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>>
}


soma 发表于 2026-4-13 22:13:39

看你要怎么用了,现在可以putchar函数输出字符

圣灵主宰 发表于 2026-4-14 10:21:15

soma 发表于 2026-4-13 22:13
看你要怎么用了,现在可以putchar函数输出字符

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

狂热主宰 发表于 2026-4-14 12:01:08

圣灵主宰 发表于 2026-4-14 10:21
我想做到电脑向单片机发送一个指令,然后单片机接收到之后做出对应操作,或者单片机发出一个指令,电脑这 ...

单片机接收到数据
解析指令数据
执行操作
如点灯

圣灵主宰 发表于 2026-4-14 14:08:06

狂热主宰 发表于 2026-4-14 12:01
单片机接收到数据
解析指令数据
执行操作


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

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

uint8_txdata UART2_RX_BUF;   // 最终接收数据
uint8_tUART2_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));//清空缓存区
      }
    }
}
页: [1]
查看完整版本: 新手求助,关于UART2