今天在做一个华大的串口配置的时候,一直卡在了这个问题上,串口发送没有问题(单个字节和字符串都没有问题),以下是串口的配置,串口助手调试如下图:/***************************
串口配置
***************************/
#include "usart.h"
_UART_Rx_Data UART1_Rx_Data;
void Uart1RC_CallBackFun(void)
{
if(Uart_GetStatus(UARTCH1,UartRC))
{
Uart_ClrStatus(UARTCH1,UartRC);
Tim3_M0_Cnt16Set(Timer3_Count);
Tim3_M0_Run();//开始计时
if(UART1_Rx_Data.UART_Rx_Len < 512)
{
UART1_Rx_Data.UART_Rx_Buf[UART1_Rx_Data.UART_Rx_Len++] = Uart_ReceiveData(UARTCH1);
printf("buf:%s\r\n",UART1_Rx_Data.UART_Rx_Buf);
}
}
}
/************************
函数名称:USART_Config
函数作用:串口初始化
函数入口:brr 波特率
函数出口:无
************************/
void USART_Config(uint32_t brr)
{
uint16_t u16Scnt = 0;
//开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
//串口物理层配置
stc_gpio_config_t GPIO_InitStructure;
DDL_ZERO_STRUCT(GPIO_InitStructure);
GPIO_InitStructure.enDir = GpioDirOut; //Tx
Gpio_Init(GpioPortD,GpioPin0,&GPIO_InitStructure);
Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3);
GPIO_InitStructure.enDir = GpioDirIn; //Rx
Gpio_Init(GpioPortD,GpioPin1,&GPIO_InitStructure);
Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3);
//串口协议层配置
stc_uart_config_t UART_InitStructure;//总体配置
stc_uart_irq_cb_t UartIrq_InitStructure;//发送接收中断处理函数接口
stc_uart_multimode_t UartMulti_InitStructure;//多主机模式及从机地址和地址掩码配置
stc_uart_baud_t UartBaud_InitStructure;//通道波特率计算参数
DDL_ZERO_STRUCT(UART_InitStructure);
DDL_ZERO_STRUCT(UartIrq_InitStructure);
DDL_ZERO_STRUCT(UartMulti_InitStructure);
DDL_ZERO_STRUCT(UartBaud_InitStructure);
UartMulti_InitStructure.enMulti_mode = UartNormal;//正常工作模式
UartIrq_InitStructure.pfnRxIrqCb = Uart1RC_CallBackFun;//接受中断服务函数
UartBaud_InitStructure.enRunMode = UartMode1;//模式1
UartBaud_InitStructure.u32Baud = brr;
UartBaud_InitStructure.u32Pclk = Sysctrl_GetPClkFreq();
UART_InitStructure.bTouchNvic = TRUE;//中断使能
UART_InitStructure.enRunMode = UartMode1;//模式1
UART_InitStructure.enStopBit = Uart1bit;//一个停止位
UART_InitStructure.pstcIrqCb = &UartIrq_InitStructure;
UART_InitStructure.pstcMultiMode = &UartMulti_InitStructure;
Uart_Init(UARTCH1,&UART_InitStructure);//初始化
Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//设置分频
u16Scnt = Uart_CalScnt(UARTCH1,&UartBaud_InitStructure);//计算uart1波特率
Uart_SetBaud(UARTCH1,u16Scnt);//设置波特率
Uart_ClrIsr(UARTCH1);//清中断
Uart_ClrStatus(UARTCH1,UartTC);//清发送完成标志位
Uart_ClrStatus(UARTCH1,UartRC);//清接收完成标志位
Uart_EnableIrq(UARTCH1,UartRxIrq);//使能接收中断
Uart_EnableFunc(UARTCH1,UartRx);//使能中断服务函数
EnableNvic(UART1_IRQn,IrqLevel1,TRUE);//中断优先级配置
}
/************************
函数名称:USART_SendByte
函数作用:串口发送字节
函数入口:byte 发送数据
函数出口:无
************************/
void USART_SendByte(uint8_t byte)
{
Uart_SendData(UARTCH1,byte);
}
/************************
函数名称:USART_RecByte
函数作用:串口接收字节
函数入口:无
函数出口:byte 接收数据
************************/
uint8_t USART_RecByte(void)
{
uint8_t byte = 0;
while(Uart_GetStatus(UARTCH1,UartRC) == FALSE); //直到接收完成
byte = Uart_ReceiveData(UARTCH1);
return byte;
}
/************************
函数名称:USART_SendStr
函数作用:USART发送字符串--查询
函数入口:str 发送字符串
Length 长度
函数出口:无
************************/
void USART_SendStr(char* str,uint32_t Length)
{
uint8_t i = 0;
for(i=0;i<Length;i++)
{
Uart_SendData(UARTCH1,*str);
str++;
}
}
/************************
函数名称:USART_Echo
函数作用:USART回显
函数入口:无
函数出口:无
************************/
void USART_Echo(void)
{
uint8_t byte;
byte = USART_RecByte();
USART_SendByte(byte);
}
/************************
函数名称:fputc
函数作用:printf重定义
函数入口:无
函数出口:无
************************/
int fputc(int c, FILE *stream)
{
USART_SendByte(c);
return c;
}
下图1
把回显函数放到主函数中运行没有任何现象,(一般在调试串口的时候我都会写一个回显函数来判断串口是否调通)
debug调试如下图(断点在回显之前,还没进入函数)
下图2
debug下一步进入函数(串口助手上发送了一个 2 ),此时现象如下图
下图3
按照常理来说,2 应该在上位机上显示出来才对呀,为什么没有显示呢?发送函数是通的,说明是接收出了问题,然后debug单步运行,好像是卡在了这里
|