qq_42340689 2022-03-05 19:36
浏览 23
已结题

stm32串口1和定时器4工作,出现问题

stm32串口1和定时器4工作,串口接收数据并处理,定时器判断数据接收状态,一直无法进入中断,无法处理数据
uint8_t aRxBuffer[32]; //接收中断缓冲

uint8_t DW_Rx_Buffer[BUFFERSIZE];
uint8_t systime[6];
#define DW_TIMEEROUT (2)
uint8_t dw_timerout = 0;
uint8_t aRxBuffer_pos = 0;
uint8_t dw_frame_receive_state = 0;
//在main函数中需要首先调用开始接收
//开启接收中断,否则无法中断接收
uint8_t uart1_rx_data;
void uart1_isr_rx_enable()
{
HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_rx_data, 1);
}
//发送函数
void DW_Send(UART_HandleTypeDef *huart, uint8_t *arr, uint8_t len)
{
//启动发送
HAL_UART_Transmit_IT(huart, arr, len);
}

void dw_regwrite(uint8_t addr, uint8_t *ptr, uint8_t len)
{
assert_param(5+len < TXBUFFERSIZE);
dw_txbuf[2] = len + 3;
dw_txbuf[3] = 0x80;
dw_txbuf[4] = addr;
dw_txbuf[5] = 0x5a; //地址
memcpy(&dw_txbuf[6], ptr, len);
HAL_UART_Transmit_IT(&huart1, dw_txbuf, 6+len);
}

//寄存器读取
void dw_regread(uint8_t addr, uint8_t len)//0x20 7
{
dw_txbuf[2] = 0x03;
dw_txbuf[3] = 0x81;
dw_txbuf[4] = addr; //地址 5a a5 03 81 20 07
dw_txbuf[5] = len;

HAL_UART_Transmit_IT(&huart1, dw_txbuf, 6);

void dw_init(void)
{
uart1_isr_rx_enable(); // HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_rx_data, 1);
timer_start(&htim4);
}
void dw_poll(void)
{
uint8_t *ptr;
uint8_t recv[32];//={0x00,0x01};
if(dw_frame_receive_state == 2) //接收已经完成
{
ptr = &aRxBuffer[0];
switch(ptr[4]*0x100+ptr[5])
{
case 0x00A1://接收到按钮的命令 //00a1
if(ptr[7]*0x100+ptr[8]==0x0001)
{
recv[0]=0x00;
recv[1]=0x01;
}
else if(ptr[7]*0x100+ptr[8]==0x0002)
{
recv[0]=0x00;
recv[1]=0x00;
}
dw_regwrite(0x03,recv,2);
break;
case 0x2007://RTC,这里并没有判断是81指令还是83指令,0x20为地址,0x07为数据长度
systime[0] = BCD2DEC8(ptr[6])+100;
systime[1] = BCD2DEC8(ptr[7]);
systime[2] = BCD2DEC8(ptr[8]);
systime[3] = BCD2DEC8(ptr[10]);
systime[4] = BCD2DEC8(ptr[11]);
systime[5] = BCD2DEC8(ptr[12]);
dw_set((uint8_t *)&systime[0]);
break;
default:
break;
}
dw_frame_receive_state = 0; //空闲
aRxBuffer_pos = 0; //接收缓存
}
}
void timer4_isr_callback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4)
{
dw_timerout += 1; //每进入一次,加1
if(dw_timerout >= DW_TIMEEROUT)
{
timer_stop(&htim4);
dw_timerout = 0;
UART_DISABLE_RE(huart1); //关闭串口接收

    if(aRxBuffer_pos == (aRxBuffer[2]+3) &&
            aRxBuffer[0] == 0x5A &&
            aRxBuffer[1] == 0xA5)
    {
        dw_frame_receive_state =2;
    }
    else
    {
        dw_frame_receive_state =1;
        aRxBuffer_pos = 0;
    }
    
    UART_ENABLE_RE(huart1);  //开启接收
}

}
}

//串口接收中断回调
void uart1_isr_rx_callback(UART_HandleTypeDef *huart)
{ if(huart->Instance == USART1)
{
uart1_isr_rx_enable();
//还没有处理上一包数据,退出
if(dw_frame_receive_state == 2)
{
return;
}
//判断是否有足够空间
if(aRxBuffer_pos < sizeof(aRxBuffer))
{
aRxBuffer[aRxBuffer_pos++] = uart1_rx_data;//huart2->pRxBuffPtr;//
dw_timerout = 0; //计数值归零
timer_start(&htim4); //启动定时器
}
else
{
aRxBuffer_pos = 0;
}

dw_frame_receive_state = 1;
uart1_isr_rx_enable();

}
}

    ptr = &aRxBuffer[0];
    switch(ptr[4]*0x100+ptr[5])
    {
    case 0x00A1://接收到按钮的命令 //00a1
        if(ptr[7]*0x100+ptr[8]==0x0001)
        {
            recv[0]=0x00;
            recv[1]=0x01;
        }
        else if(ptr[7]*0x100+ptr[8]==0x0002)
        {
            recv[0]=0x00;
            recv[1]=0x00;
        }
        dw_regwrite(0x03,recv,2);
        break;

// case 0x0090://接收到文本输入框的命令
// if(ptr[7]=='3' && ptr[8]=='4')
// {
// recv[0]='5';
// recv[1]='6';
// }
// else
// {
// recv[0]=' ';
// recv[1]=' ';
// }
// dw_varwrite(0x1200,recv,2);
// break;
case 0x2007://RTC,这里并没有判断是81指令还是83指令,0x20为地址,0x07为数据长度
systime[0] = BCD2DEC8(ptr[6])+100;
systime[1] = BCD2DEC8(ptr[7]);
systime[2] = BCD2DEC8(ptr[8]);
systime[3] = BCD2DEC8(ptr[10]);
systime[4] = BCD2DEC8(ptr[11]);
systime[5] = BCD2DEC8(ptr[12]);
dw_set((uint8_t *)&systime[0]);
break;
default:
break;
}

    dw_frame_receive_state = 0; //空闲
    aRxBuffer_pos = 0; //接收缓存
}

}

void timer4_isr_callback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4)
{
dw_timerout += 1; //每进入一次,加1
if(dw_timerout >= DW_TIMEEROUT)
{
timer_stop(&htim4);
dw_timerout = 0;
UART_DISABLE_RE(huart1); //关闭串口接收

    if(aRxBuffer_pos == (aRxBuffer[2]+3) &&
            aRxBuffer[0] == 0x5A &&
            aRxBuffer[1] == 0xA5)
    {
        dw_frame_receive_state =2;
    }
    else
    {
        dw_frame_receive_state =1;
        aRxBuffer_pos = 0;
    }
    
    UART_ENABLE_RE(huart1);  //开启接收
}

}
}

//串口接收中断回调
void uart1_isr_rx_callback(UART_HandleTypeDef *huart)
{ if(huart->Instance == USART1)
{
uart1_isr_rx_enable();
//还没有处理上一包数据,退出
if(dw_frame_receive_state == 2)
{
return;
}

//判断是否有足够空间
if(aRxBuffer_pos < sizeof(aRxBuffer))
{
    aRxBuffer[aRxBuffer_pos++] = uart1_rx_data;//huart2->pRxBuffPtr;//
    dw_timerout = 0;   //计数值归零
    timer_start(&htim4); //启动定时器              
}
else
{
    aRxBuffer_pos = 0;
}  
dw_frame_receive_state = 1;
uart1_isr_rx_enable();

}
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月13日
    • 创建了问题 3月5日

    悬赏问题

    • ¥15 设计一个温度闭环控制系统
    • ¥100 关于加载卡的问题有能知道这个要怎么处理吗?
    • ¥100 rtmpose姿态评估
    • ¥15 java 通过反射找路径下的类,打包后就找不到
    • ¥15 通联支付网上收银统一下单接口
    • ¥15 angular有偿编写,
    • ¥15 centos7系统下abinit安装时make出错
    • ¥15 hbuildex运行微信小程序报错
    • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
    • ¥15 wpf datagrid如何实现多层表头