串口0能正常通信,但是我配置串口1用串口0一样的方法,死活通信不正常,发送给电脑上位机的数据动不动就少了几个位。感觉设置的波特率偏差比较大造成的。
我用的是内部时钟,RCH=24MHZ。波特率我配置成9600bps也不行。不知道问题出在哪里?
void App_Uart1Init(void)
{
uint16_t u16Scnt = 0;
stc_uart_config_t stcConfig;
stc_uart_irq_cb_t stcUartIrqCb;
stc_uart_multimode_t stcMulti;
stc_uart_baud_t stcBaud;
stc_gpio_config_t stcGpioCfg;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//使能GPIO模块时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//使能uart1模块时钟
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA,GpioPin2,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin2,GpioAf1);
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA,GpioPin3,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin3,GpioAf1);
stcUartIrqCb.pfnRxIrqCb = RxIntCallback1;//中断入口地址
stcUartIrqCb.pfnTxIrqCb = TxIntCallback1;
stcUartIrqCb.pfnRxFEIrqCb = ErrIntCallback1;
stcUartIrqCb.pfnPEIrqCb = PErrIntCallBack1;
stcUartIrqCb.pfnCtsIrqCb = CtsIntCallBack1;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;
if(TRUE == stcConfig.bTouchNvic)
{
EnableNvic(UART1_IRQn,IrqLevel2,TRUE);
}
stcConfig.enRunMode = UartMode1;//模式1
stcConfig.enStopBit = Uart1bit; //1bit停止位
Uart_Init(UARTCH1, &stcConfig);//串口初始化
Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.enRunMode = UartMode1;
stcBaud.u32Baud = 9600;
u16Scnt = Uart_CalScnt(UARTCH1,&stcBaud);//波特率计算
Uart_SetBaud(UARTCH1,u16Scnt);//波特率设置
Uart_ClrStatus(UARTCH1,UartRC);//清接收请求
Uart_EnableIrq(UARTCH1,UartRxIrq);//使能串口中断
Uart_EnableFunc(UARTCH1,UartRx);//使能收发
}
下面这个是发送函数,每隔1s发送这个数据给上位机
void Uart1_ACK_modbus(void)
{
uint8_t sendtab[20];
uint16_t crcnum;
uint8_t i;
sendtab[0]=0XAA;
sendtab[1]=0xBB;
sendtab[2]=0xCC;
sendtab[3]=0xDD;
sendtab[4]=0xEE;
sendtab[5]=0XFF;
sendtab[6]=0;
for(i=0;i<7;i++)
{
Uart_SendData(UARTCH1,sendtab[i]);
}
}
|