今天在做一个华大的串口配置的时候,一直卡在了这个问题上,串口发送没有问题(单个字节和字符串都没有问题),以下是串口的配置,串口助手调试如下图:- /***************************
- 串口配置
- ***************************/
- #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单步运行,好像是卡在了这里
|