新手求助,关于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>>
}
看你要怎么用了,现在可以putchar函数输出字符 soma 发表于 2026-4-13 22:13
看你要怎么用了,现在可以putchar函数输出字符
我想做到电脑向单片机发送一个指令,然后单片机接收到之后做出对应操作,或者单片机发出一个指令,电脑这边显示 圣灵主宰 发表于 2026-4-14 10:21
我想做到电脑向单片机发送一个指令,然后单片机接收到之后做出对应操作,或者单片机发出一个指令,电脑这 ...
单片机接收到数据
解析指令数据
执行操作
如点灯 狂热主宰 发表于 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]