华大串口调试问题
各位帮忙我看看是哪里配置出问题了,一直没法输出,主函数调用void USART1_Sendchar(u8 Data)
{
while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
Uart_SendData(UARTCH1,Data);
}
串口1配置如下
/***************************************************************************
* 函 数 名: usart_init
* 功能说明: 串口初始化函数
* 形 参:
* 返 回 值:
* 说 明:
***************************************************************************/
void usart_init( u32 buad)
{
stc_uart_config_tstcCfg;
stc_uart_baud_t stcBaud;
stc_uart_multimode_t stcMulti;
stc_gpio_config_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
//外设时钟配置
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);//GPIO时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//UART1外设模块时钟使能
//IO配置
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortD,GpioPin0,&stcGpioCfg);//配置PD0 为UART1 TX
Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3); //配置PD0 复用功能
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortD,GpioPin1,&stcGpioCfg);//配置PD1 为UART1 RX
Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3); //配置PD1 复用功能
//usart1配置
stcMulti.enMulti_mode = UartNormal;//正常工作模式
Uart_SetMultiMode(UARTCH1,&stcMulti);//多主机单独配置
stcCfg.enRunMode = UartMode3; //模式3
stcCfg.enStopBit = Uart1bit; //1位停止位
stcCfg.bTouchNvic =TRUE; //使能中断
Uart_SetMMDOrCk(UARTCH1,UartEven); //偶校验
Uart_Init(UARTCH1, &stcCfg); //串口初始化
Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频,模式1/3选择16分频
//波特率配置
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.u32Baud=buad;
stcBaud.enRunMode=UartMode3;
Uart_CalScnt(UARTCH1,&stcBaud);
//串口中断使能
Uart_ClrStatus(UARTCH1,UartRC); ///<清接收请求
Uart_ClrStatus(UARTCH1,UartTC); ///<清发送请求
Uart_EnableIrq(UARTCH1,UartRxIrq); ///<使能串口接收中断
//Uart_EnableIrq(M0P_UART0,UartTxIrq); ///<使能串口接收中断
EnableNvic(UART1_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
/************************************************
函数:Uart1_IRQHandler
功能:
输出参数:
输入参数:
************************************************/
//UART1中断函数
void Uart1_IRQHandler(void)
{
if(Uart_GetStatus(UARTCH1, UartRC)) //UART1数据接收
{
Uart_ClrStatus(UARTCH1, UartRC); //清中断状态位
Uart_ReceiveData(UARTCH1); //接收数据字节
}
if(Uart_GetStatus(UARTCH1, UartTC)) //UART1数据发送
{
Uart_ClrStatus(UARTCH1, UartTC); //清中断状态位
}
} 有人指导一下吗,华大第一次用 void USART1_Sendchar(u8 Data)
{
while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
Uart_SendData(UARTCH1,Data);
}
这个函数好像有问题,TC应该是发完之后置1,所以这个while应该是一直卡住了。
我记得查询发送有例子的,发送前查询TXE,发送后查询TC是否置起,然后,再清除TC
另外中断里面TC清除的语句要删掉。 Tobbie 发表于 2020-7-23 12:07
有人指导一下吗,华大第一次用
跟STM32几乎一样 martinhu 发表于 2020-7-23 20:01
void USART1_Sendchar(u8 Data)
{
while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完 ...
谢谢回复,TC发完之后置1,然后跳出while,这个是没问题的 yueguang3048 发表于 2020-7-24 09:45
跟STM32几乎一样
根据手册上的配置,也参考了网上例子,调试助手那里就是没有任何接收数据
华大例程烧录后,串口也没反应
void Uart_PortInit(void)
{
stc_gpio_config_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortD,GpioPin0,&stcGpioCfg);
Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3);//TX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortD,GpioPin1,&stcGpioCfg);
Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3);//RX
}
int32_t main(void)
{
uint16_t u16Scnt = 0;
stc_uart_config_tstcConfig;
stc_uart_irq_cb_t stcUartIrqCb;
stc_uart_multimode_t stcMulti;
stc_uart_baud_t stcBaud;
en_uart_mmdorck_t enTb8;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//模块时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);
Uart_PortInit();//端口初始化
stcUartIrqCb.pfnRxIrqCb = RxIntCallback;//中断服务函数指定
stcUartIrqCb.pfnTxIrqCb = TxIntCallback;
stcUartIrqCb.pfnRxFEIrqCb = ErrIntCallback;
stcUartIrqCb.pfnPEIrqCb = PErrIntCallBack;
stcUartIrqCb.pfnCtsIrqCb= CtsIntCallBack;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;
if(TRUE == stcConfig.bTouchNvic)
{
EnableNvic(UART1_IRQn,IrqLevel3,TRUE);
}
stcConfig.enRunMode = UartMode3;//模式3
stcConfig.enStopBit = Uart1bit;
stcMulti.enMulti_mode = UartNormal;//正常工作模式
Uart_SetMultiMode(UARTCH1,&stcMulti);//多主机单独配置
Uart_Init(UARTCH1, &stcConfig);//端口初始化
Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.enRunMode = UartMode3;
stcBaud.u32Baud = 9600;
u16Scnt = Uart_CalScnt(UARTCH1,&stcBaud);//波特率计算值
Uart_SetBaud(UARTCH1,u16Scnt);//波特率设置
Uart_ClrIsr(UARTCH1);//清所有请求
Uart_EnableIrq(UARTCH1,UartTxIrq);
Uart_EnableFunc(UARTCH1,UartRx);
enTb8 = UartDataOrAddr;//Bit8由软件读写决定
Uart_SetMMDOrCk(UARTCH1,enTb8);
Uart_ClrStatus(UARTCH1,UartTC);
M0P_UART1->SBUF = (1<<8)|SLAVEADDR;//发送地址后,触发中断,后续发送数据
while(1)
{
Uart_SendData(UARTCH1,'a');
}
} Tobbie 发表于 2020-7-25 16:39
根据手册上的配置,也参考了网上例子,调试助手那里就是没有任何接收数据 ...
问题是你的自己写的函数里面,发送之前就要去TC置1,不然就一直卡死在while等待里面了吧?
void USART1_Sendchar(u8 Data)
{
while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
Uart_SendData(UARTCH1,Data);
}
你看你的函数,发送之前就等着TC置1?? martinhu 发表于 2020-7-27 09:00
问题是你的自己写的函数里面,发送之前就要去TC置1,不然就一直卡死在while等待里面了吧?
void USART1_S ...
这个函数我试过,ST上面是没问题的,另外你说的方法我也试过了,串口助手没有反应
Tobbie 发表于 2020-7-27 23:13
这个函数我试过,ST上面是没问题的,另外你说的方法我也试过了,串口助手没有反应
库函数里面本身就有查询发送的例子,不明白你为什么非要按照自己的理解写一个
本帖最后由 walton1226 于 2020-7-28 13:56 编辑
我查看了hc32l110的手册。
Uarttxe 发送缓冲为空中断标志,上电复位值为0,硬件置位,硬件清零,(楼主软件清此位,错误)
只有写完数据寄存器后才置位,以此是先写数据,再查询此位。
UartTC 发送完成中断标志,上电复位值为0,硬件置位,软件清零。
只有写完数据寄存器并完成发送才置位,以此是先写数据,再查询此位(需要软件清0)。
对于发送数据函数,查询Uarttxe即可,只要Uarttxe为1即可以往里面写数据,不用等UartTC置位。
USART_SendData(USART1, dat);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); stm32的TXE,TC上电复位都为1,因此可以先查询此位再写数据。 不是有官方的例程吗?跟着官方的例程走就很OK了。 martinhu 发表于 2020-7-28 11:04
库函数里面本身就有查询发送的例子,不明白你为什么非要按照自己的理解写一个
...
已解决,谢谢 walton1226 发表于 2020-7-28 13:42
我查看了hc32l110的手册。
Uarttxe 发送缓冲为空中断标志,上电复位值为0,硬件置位,硬件清零,(楼主软 ...
解释很清晰,谢谢
在论坛上上下载了例程,改好IO调试结果,接收数据有误,硬件会干扰到串口接收吗
官方有现成的库,为什么要自己写呢?还是对寄存器或者芯片理解不对导致的。 附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多,LCD什么的都调好了,不想重新选型啊{:cry:}
Tobbie 发表于 2020-7-31 13:43
附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多 ...
各位帮忙指导下是什么问题 本帖最后由 martinhu 于 2020-7-31 23:17 编辑
Tobbie 发表于 2020-7-31 13:43
附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多 ...
这个代码有问啊,你又是使能了发送中断,又是在主循环里面查询发送?
楼主是不是很少调试串口啊?两个混起来用?
看看这个例程,中断接收,用宏定义选择中断发送和查询发送两种方式。
上位机发送6个字节,MCU回复6个相同字节给上位机。
页:
[1]
2