嵌入式技术william hill官网
直播中

YYXIAO

8年用户 1144经验值
擅长:接口/总线/驱动
私信 关注
[问答]

单片机硬件定时器5ms会导致串口接收错乱吗

120mhz单片机

mpu6050的dmp很慢

主板得接收另一块板子发送的数据包(帧头+数据+帧尾)

主板需要定时读取dmp进行pid计算控制直立

硬件定时器5ms会导致串口接收错乱??

加长至1000ms左右数据才没问题

我有一个问题,systick中断优先级0x07

串口中断优先级0x00 为什么导致串口接收数据错误呢?

是因为系统时钟中断里关全局中断了吗

系统时钟0x07优先级

SysTick->LOAD = ticks - 1;

nvic_init(SysTick_IRQn, 7, ENABLE);

SysTick->VAL  = 0;

SysTick->CTRL = 0x07;

串口中断0x00优先级

void uart_rx_irq(UARTN_enum uartn, uint32 status)

{

if(status)

    uart_index[uartn]->IER |= UART_IER_RX;                                                    // 使能接收完成中断

else

    uart_index[uartn]->IER &= ~(UART_IER_RX);                                                // 关闭接收完成中断

nvic_init(uart_irq[uartn], 0x00, (FunctionalState)status);

}

5ms一次读取dmp角度

//------------------------角度环控制------------------------//

static void Pitch_Angle_Timer_CallBack(void *paramter)

{

mpu_dmp_get_data(&angle.DMP_pitch,&angle.DMP_roll,&angle.DMP_yaw);

angle.nowangle = static_angle + angle.DMP_pitch;

angle.tar_vel = Tar_PitchVel_Cal(angle.tar_angle,angle.nowangle*100);

}

串口接收中断接收数据包

void UART3_IRQHandler(void)

{

rt_interrupt_enter();

if(UART3->ISR & UART_ISR_TX_INTF)                                                // 串口发送缓冲空中断

{

    UART3->ICR |= UART_ICR_TXICLR;                                                // 清除中断标志位

}

if(UART3->ISR & UART_ISR_RX_INTF)                                                // 串口接收缓冲中断

{

    //static unsigned char _data = 0;

    //_data = (uart_index[UART_3])->RDR & 0x01FF;

    camera_uart_callback();

    //rt_mb_send(Cam_Mesage,_data);

    //add_mesage(&cam_mesage,_data);

    UART3->ICR |= UART_ICR_RXICLR;                                                // 清除中断标志位

}

rt_interrupt_leave();

}

回帖(2)

夏日余晖

2022-8-2 10:48:35
“系统时钟中断里关全局中断” 时间很短,看你的描述不像是定时器时间长短引起的串口数据错误。
更可能是其它地方的错误操作把串口数据搞坏了
举报

贾桂林

2022-8-2 10:48:48
最好不要在中断中做耗时较长的操作,可以打开软件定时器,在软件定时器中完成角度读取,也可以开个优先级较高的线程,每5ms读取角度。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分