历史上的今天
今天是:2025年07月27日(星期日)
2019年07月27日 | STM32F030 485通讯遇到的问题
2019-07-27 来源:eefocus
在做项目的时候要求用485进行主机与从机进行通讯,在485发送和接收的时候要对驱动器进行控制,在刚开始调发送和接收的时候总是失败,原因有一下几个
使能驱动器后立刻发送数据,导致第一个数据有时候错误。
串口中断后马上控制驱动器为发送模式,然后发送数据,导致出错,有时直接卡死。
3.在发送指令后马上接收有时候串口溢出标志位会置位,原因不明,通过在错误中断清除标志位来处理。
4.在进入错误中断后读取串口的ISR寄存器后要延时一段时间才能清除标志位,不然无法清除。
5.STM32F0为M0的内核,中断分组和M3,M4的不同,只有抢占,怎么区分优先级现在还不明。
在错误中断中清除标志位的方法
/**
* Description:串口错误回调函数
* Parameter :USARTX_Handler 串口句柄
* Return :None
* Others :串口接收出错进入此函数
* :
*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *USARTX_Handler)
{
uint8_t c;
c = USARTX_Handler->Instance->ISR;
for(int i;i<10000;i++);//读取SR寄存器后要延时一段时间,否则无法进入下面的判断
//printf("GG");
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_PE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//PE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_PE);//清标志
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_FE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//FE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_FE);
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_NE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//NE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_NE);
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_ORE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->CR1);//ORE清标志,第二步读CR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_ORE);
__HAL_UART_CLEAR_OREFLAG(USARTX_Handler);
if(USARTX_Handler->Instance == USART1)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART1_RxBuffer,1);
}
else if(USARTX_Handler->Instance == USART3)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART3_RxBuffer,1);
}
else if(USARTX_Handler->Instance == USART5)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART5_RxBuffer,1);
}
}
}
史海拾趣
|
想在应用程序里检测鼠标的插拔情况,当鼠标插上时,显示鼠标光标,当鼠标拔掉时,隐藏鼠标光标,请问这个要怎么做啊!有没有USB设备插拔的消息或事件之类的啊?… 查看全部问答> |
|
程序好像没有运行这一部分(红色显示) 下面是我的程序: #include #include #include sfr AUXR = 0x8e; #define X_ADDR XBYTE[0x0000] #define Y_ADDR XBYTE[0x0100] #define CMD XBYTE[0x0200] #define DAT XBYTE[0x0300] unsigne ...… 查看全部问答> |
|
请问下VICVectAddr0 = (int)IRQ_Handler;是什么意思 Vectors LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr DCD 0xB8A06F58 LDR PC, LDR PC, FIQ_Addr ResetAddr DCD Reset UndefinedAdd ...… 查看全部问答> |




