STM32F427芯片,针对UART7开启串口接收缓存区非空中断RXNE和串口传输完成中断TC. 1.单测试收发都没有任何问题。 2.将串口与PC机连接,PC端通过串口助手发送数据给测试板(STM32F427),测试板将收到的数据回传给PC,测试发现串口数据接收中断的次数小于PC端发送数据的个数,且发送中断可完全将接收到的数据发送出来。已排除程序其他影响中断进入的问题。 3.针对2的情况测试发现,怀疑串口中断服务函数中先判断接收TXNE中断标志,若有则读DR数据,接下来判断TC中断标志,而后进行手动清除SR寄存器中的TC标志,或进行写入DR数据操作来清楚中断标志。测试怀疑清TC标志过程中把TXNE中断标志也误清除,或影响了TXNE中断的进行。烦请各位专家帮忙指导一下是否存在这种情况,指导一下问题排查方法。 |
定时器正交编码器功能
easylogger打印失败
为什么ETH配置中没有Advanced Parameters?
为什么生成代码时一直卡在generating user source code 救救孩子吧。
与HAL_ADC_Start_DMA相关的一个十分怪异的问题
由stm32cubemx按照配置重新生成工程,bsp_SysTick.c一直没有呢
ptp PPS输出
STM32F407ZGT6芯片被锁
咨询STM32F407的两个USB口能否分别实现读卡器和读U盘的功能以及硬件IIC读写AT24C02
询问STM32F407寄存器库文件
中断中处理的内容多不多,正常收发是不会发生类似的问题。如果还是不能达到效果,换成DMA试试。
中断处理函数内容不多,就是收数据和发送数据。
中断服务函数如下
void UART7_IRQHandler(void)
{u8 SR_ flag = 0;
u8 temp_DR = 0;
temp_SR = UART7->SR;
Int_cnt++;
if((temp_SR&(1<<6)))//检测到传输完成中断
{
if(Uart7BufIndex.writeSBufindex!=Uart7BufIndex.readSBufindex)
Uart7BufIndex.sendflag =0;//正在发送数据
UART7->DR = Uart7BufIndex.SendBuf[Uart7BufIndex.readSBufindex];
Uart7BufIndex.readSBufindex=(Uart7BufIndex.readSBufindex+1) %UARTBUFLENGTH;
}
else
{
UART7->SR &= ~(1<<6);//清除发送完成种段
Uart7BufIndex.sendflag=1;//发送完成标志置1
}
if(temp_sR&(1<<5))//接收到数据
{
Uart7BufIndex.RecvBuf[Uart7BufIndex.writeRBufindex]=UART7->DR;
Uart7BufIndex.writeRBufindex =(Uart7BufIndex.writeRBufindex
SUARTBUFLENGTH;
}
//监测到其他异常错误-
if((temp_SR&OxF)!=0)
{
temp DR= UART7->DR;
}
不开启DMA相关中断,仅使用UART的空闲中断。
每收到一串数据后,在空闲中断回调函数里调用发送函数,将刚才收到的数据发回给PC.
这样的话,流程比较简洁,CPU压力也小。
MX_GPIO_Init();
MX_DMA_Init();
MX_USART3_UART_Init();
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ( uint8_t *)uartRXbuffer, UARTSIZE);
while (1)
{
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
DataCNT = Size;
uartRXbuffer[DataCNT]='\r';
uartRXbuffer[DataCNT+1]='\n';
HAL_UART_Transmit_IT(&huart3, ( uint8_t *)uartRXbuffer, DataCNT+2);
}
因为我现在的应用环境,串口数量较多,Dma已经全部占用了,所以这一路串口就只能用中断收发,这种中断收发从芯片本身来说会有问题吗?现在就想判定一下是否接收中断被异常清楚未正常进呢?
HI,
1、芯片本身这个地方肯定没问题。我推荐你使用DMA进行接收,原因相信你清楚了。
2、即使中断收发也不该有问题,只是这里面的状态啊、标志啊结合具体应用处理好就行。
那您看您有中断收发的例程可以发给我参考一下吗?
其实 各个STM32系列里都有例程,多数是基于HAL库的。
如果需要基于LL库的,我这边可以给你提供个。私信里留下邮箱即可。
您好,我现在初始化uart5只开启接收缓存区不为空中断,中断优先级为最高。使能uart3的串口dma发送。两个串口波特率均为230400。硬件中将uart3和uart5发收互联,进行uart3发送,uart5接收测试。
主函数中uart3每5ms发送50个字节,uart5中断服务函数中判断到rxne标志或者ore标志则接收计数加1,但ore标志一直未判断到过。这样进行发测试,测试结果发现uart3发送2百万个字节左右,uart5接收会丢1,2个字节,请问这个接收丢数是什么原因呢?