38.4K低速工作,lpuart用2400收发正常,uart1或uart0的2400收发不正常,这有什么坑吗?hc32l110的,,,,
情况描述:lpuart能正常收发,uart1或uart0的2400收发不正常,完整的数据包是10个字节,最终只接收了5个字节或者6个字节,
分析:1、电压不一致,pass掉,我切换为4M时钟uart0就能正常收发
2、硬件问题,pass,同1一样操作正常
3、波特率误差问题,计算过了,波特率误差在38.4k用2400可以说是0误差。
4、中断优先级冲突,pass,提为最高优先级了
5、使能双倍波特率才能接收到5个字节,不使能都是乱码。
配置代码如下
nt32_t main(void)
{
uint8_t falg=0;
uint8_t i = 0;
uint8_t txLen = 0;
volatile uint8_t u8TestFlag = 0;
uint8_t arr[5]={1,2,3,4,5};
stc_lpuart_config_t stcConfig;
stc_lpuart_irq_cb_t stcLPUartIrqCb;
stc_lpuart_multimode_t stcMulti;
stc_lpuart_sclk_sel_t stcLpuart_clk;
stc_lpuart_mode_t stcRunMode;
stc_bt_config_t stcBtConfig;
stc_lpm_config_t stcLpmCfg;
stc_wdt_config_t stcWdt_Config;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcLPUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBtConfig);
DDL_ZERO_STRUCT(stcLpmCfg);
Clk_Enable(ClkRCL, TRUE);
Clk_SetRCLFreq(ClkFreq38_4K);//内部38.4K ClkFreq32768 ClkFreq38_4K
Clk_SwitchTo(ClkRCL);//使用rcl做主时钟,串口9600唤醒有问题,300波特率可以接收完整数据唤醒
//看门狗配置
stcWdt_Config.u8LoadValue = 0x0b;//3.2s
stcWdt_Config.enResetEnable = WINT_EN;//WRESET_EN;////
stcWdt_Config.pfnWdtIrqCb = WdtCallback;//
Clk_SetPeripheralGate(ClkPeripheralWdt,TRUE);//
Wdt_Init(&stcWdt_Config);
Wdt_Start();
//LpTimer配置
LptTimerTest();
Flash_Init(FlashInt, 0);//0.8ma
Read_BaseData();
//LpUart配置
Clk_SetPeripheralGate(ClkPeripheralLpUart,TRUE);//使能LPUART时钟
Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);
//通道端口配置
Gpio_InitIOExt(2,5,GpioDirIn,TRUE,FALSE,FALSE,FALSE);
Gpio_InitIOExt(2,6,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
Gpio_SetFunc_UART2RX_P25();
Gpio_SetFunc_UART2TX_P26();
stcLpuart_clk.enSclk_sel = LPUart_Rcl;//LPUart_Pclk LPUart_Rcl
stcLpuart_clk.enSclk_Prs = LPUartDiv32;//Div:1-9600,32-300bps,4-2400bps
stcConfig.pstcLpuart_clk = &stcLpuart_clk;
stcRunMode.enLpMode = LPUartLPMode;//正常工作模式或低功耗工作模式配置,Baud = fclk/(prescale*4)
stcRunMode.enMode = LPUartMode1;//LPUartMode3
stcConfig.pstcRunMode = &stcRunMode;
stcLPUartIrqCb.pfnRxIrqCb = bspLPUuart_RxIntCallback;//RxIntCallback bspLPUuart_RxIntCallback
stcLPUartIrqCb.pfnTxIrqCb = NULL;
stcLPUartIrqCb.pfnRxErrIrqCb = NULL;
stcConfig.pstcIrqCb = &stcLPUartIrqCb;
stcConfig.bTouchNvic = TRUE;
stcMulti.enMulti_mode = LPUartNormal;//只有模式2/3才有多主机模式
stcConfig.pstcMultiMode = &stcMulti;
LPUart_EnableIrq(LPUartRxIrq);
LPUart_Init(&stcConfig);
for(txLen=0;txLen<sizeof(u8TxData);txLen++)
{
LPUart_SendData(u8TxData[txLen]);
}
// Flash_Init(FlashInt, 0);//0.8ma
// Read_BaseData();
//
LPUart_EnableFunc(LPUartRx);
bspUsart1_Init();
bspUsart0_Init();
Usart1Tx(arr,5);
Usart0Tx(arr,5);
for (i = 0; i < ARRAY_SZ(gGpiolist); i++)
{
Gpio_InitIOExt(gGpiolist[i].u8Port,
gGpiolist[i].u8Pin,
GpioDirIn, TRUE, FALSE, FALSE, FALSE);
}
导致SWD连接不上
delay1ms(2500);
stcLpmCfg.enSLEEPDEEP = SlpDpEnable;//SlpDpDisable;//
stcLpmCfg.enSLEEPONEXIT = SlpExtDisable;//唤醒后不自动进入睡眠
Lpm_Config(&stcLpmCfg);
// change_clock();
// Gpio_InitIO(0,3,GpioDirOut);
// SCB->SCR |= 0x4; //sleepdeep
// __NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
// Lpm_GotoLpmMode();
#endif
while (1)
{
Wdt_Feed();
delay1ms(2000);
Usart1Tx(arr,5);
Usart0Tx(arr,5);
// if (0x01 == u32LptTestFlag)
// {
// u32LptTestFlag = 0;
// Lpm_GotoLpmMode();
// }
}
}
void bspUsart0_Init(void)
{
uint32_t timer=0;
uint32_t pclk=0;
stc_uart_config_t stcConfig;
stc_uart_irq_cb_t stcUartIrqCb;
stc_uart_multimode_t stcMulti;
stc_uart_baud_config_t stcBaud;
stc_bt_config_t stcBtConfig;
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcBtConfig);
Gpio_InitIOExt(1,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
//Gpio_InitIOExt(1,5,GpioDirIn,FALSE,TRUE,FALSE,FALSE);
Gpio_InitIOExt(1,4,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
//通道端口配置
Gpio_SetFunc_UART0TX_P14();
Gpio_SetFunc_UART0RX_P15();
//外设时钟使能
Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);//模式0/2可以不使能
Clk_SetPeripheralGate(ClkPeripheralUart0,TRUE);
stcUartIrqCb.pfnRxIrqCb = USART0_IRQHandler;
stcUartIrqCb.pfnTxIrqCb = NULL;
stcUartIrqCb.pfnRxErrIrqCb = NULL;//ErrIntCallback;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;
stcConfig.enRunMode = UartMode1;//UartMode3;//测试项,更改此处来转换4种模式测试
stcMulti.enMulti_mode = UartNormal;//测试项,更改此处来转换多主机模式,mode2/3才有多主机模式
stcConfig.pstcMultiMode = &stcMulti;
stcBaud.bDbaud = 1u;//双倍波特率功能
stcBaud.u32Baud = 2400;//9600u;//更新波特率位置2400 300
stcBaud.u8Mode = UartMode1;//UartMode3; //计算波特率需要模式参数
pclk = Clk_GetPClkFreq();//获得PCLK
timer=Uart_SetBaudRate(UARTCH0,pclk,&stcBaud);//计算波特率所需TIMER值
aaaaaabbbb=pclk;
aaaaaa=timer;
stcBtConfig.enMD = BtMode2;//自动重装载16位计数器/定时器
stcBtConfig.enCT = BtTimer;//定时模式
Bt_Init(TIM0, &stcBtConfig);//调用basetimer1设置函数产生波特率
Bt_ARRSet(TIM0,timer);//配置重载值
Bt_Cnt16Set(TIM0,timer);//配置计数值
Bt_Run(TIM0); //启动定时
EnableNvic(UART0_IRQn, 0, TRUE);
Uart_Init(UARTCH0, &stcConfig);//串口1初始化
Uart_EnableIrq(UARTCH0,UartRxIrq);//允许串口1接收中断
Uart_ClrStatus(UARTCH0,UartRxFull);//清串口1接收中断标志
Uart_EnableFunc(UARTCH0,UartRx); //串口1接收中断使能
}
uint8_t aaadrr[10];
uint8_t aalen=0;
void USART0_IRQHandler(void)
{
Uart_ClrStatus(UARTCH0,UartRxFull);
/* Read one byte from the receive data register */
aaadrr[aalen++]=Uart_ReceiveData(UARTCH0);
if(aalen>9)
{
aalen=0;
}
}
|
|