sggt/App/APP_WU/Src/timer.c

217 lines
4.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "timer.h"
int heart_1000ms_flag = 0;
int heart_1000ms_cnt = 0;
int battery_2000ms_flag = 0;
int battery_2000ms_cnt = 0;
int plot_ms_flag = 0;
int plot_ms_cnt = 0;
int twk_1000ms_flag = 0;
int twk_1000ms_cnt = 0;
int input_500ms_flag = 0;
int input_500ms_cnt = 0;
uint16_t sig2slave_current_tick = 0;
uint8_t progout_tick_flag = 0;
int progout_tick = 0;
void duty_tim3(void)
{
freq_signal.over_cnt++;
}
void duty_tim6(void)
{
//lv_tick_inc(1);
heart_1000ms_cnt++;
if( heart_1000ms_cnt >= 1000)
{
heart_1000ms_cnt = 0;
heart_1000ms_flag = 1;
}
battery_2000ms_cnt++;
if( battery_2000ms_cnt >= 2000)
{
battery_2000ms_cnt = 0;
battery_2000ms_flag = 1;
}
plot_ms_cnt++;
if( plot_ms_cnt >= tabdata.item1_page0_sample_interval)
{
plot_ms_cnt = 0;
plot_ms_flag = 1;
}
twk_1000ms_cnt++;
if( twk_1000ms_cnt >= 1000)
{
twk_1000ms_cnt = 0;
twk_1000ms_flag = 1;
}
input_500ms_cnt++;
if( input_500ms_cnt >= 500)
{
input_500ms_cnt = 0;
input_500ms_flag = 1;
}
if(progout_tick_flag == 1)
{
progout_tick++;
}
//发送完成 或者 已经接收到一部分数据之后开始计时
if( (sig2slave_step == 1)||(mod_master.tx_flag == TX_OK) )
{
sig2slave_current_tick++;
mod_master.rx_error_message = RX_ERROR_NONE;
if(sig2slave_current_tick > mod_master.timeout)
{
if(sig2slave_step == 0)
{
//进入此处说明发送成功后未收到任何数据
mod_master.rx_error_message = RX_ERROR_TIMEOUT;
mod_master.tx_flag = TX_NONE;
}
HAL_UART_DMAStop(&huart2);
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
sig2slave_current_tick = 0;
sig2slave_step = 2; //无论是哪个阶段出现超时均跳转至step2
scom2_rs485.rx_flag = TRUE;
sig_trans = TRANS_MODBUS_SIG_TO_SLAVE; //发送回调中会修改成none因此在这里重新赋值接收超时也属于接收的一种结果
}
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//记录发送完成的时间点
st_flag = TRANSPARENT_TRANSMIT_END;
tick_end = xTaskGetTickCountFromISR();
//计算延迟捕获失败时清零速度过快小于1ms
//trans_log_rx = tick_middle - tick_start;
//if(trans_log_rx > 1000) trans_log_rx = 0;
trans_log_tx = tick_end - tick_middle;
if(trans_log_tx > 1000) trans_log_tx = 0;
//发送完成后将相关数组清零
if(huart == &huart1)
{
//HART重新使能接收
HART_RTS(RTS_OFF);
memset(scom1_hart.tx_buff, 0, scom1_hart.tx_len);
scom1_hart.tx_len = 0;
//PC--->SIG--->HART重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
if(huart == &huart2)
{
memset(scom2_rs485.tx_buff, 0, scom2_rs485.tx_len);
scom2_rs485.tx_len = 0;
//开启对应的DMA
switch (sig_trans)
{
case TRANS_HART_TO_PC:
{
HAL_UART_Receive_DMA(&huart1, scom1_hart.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_BLE_TO_PC:
{
HAL_UART_Receive_DMA(&huart6, scom6_ble.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_PC_TO_SIG:
{
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_SIG_TO_SLAVE:
{
mod_master.tx_flag = TX_OK;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
sig2slave_current_tick = 0;
}
break;
default:
break;
}
}
if(huart == &huart6)
{
memset(scom6_ble.tx_buff, 0, scom6_ble.tx_len);
scom6_ble.tx_len = 0;
//PC--->SIG--->BLE重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
//通讯模式清空,等待下一次接收
sig_trans = TRANS_NONE;
//如果显示任务被挂起则在此处释放无DMA的情况
if(screen_suspend_flag)
{
xTaskResumeFromISR(task_lcdHandle);
xTaskResumeFromISR(task_menuHandle);
screen_suspend_flag = 0;
}
}
void delay_cnt(uint16_t cnt)
{
while(cnt > 0)
{
cnt--;
}
}
#define CPU_FREQUENCY_MHZ 165.888 // STM32时钟主频
void wu_delay_us(__IO uint32_t delay)
{
int last, curr, val;
int temp;
while (delay != 0)
{
temp = delay > 900 ? 900 : delay;
last = SysTick->VAL;
curr = last - CPU_FREQUENCY_MHZ * temp;
if (curr >= 0)
{
do
{
val = SysTick->VAL;
}
while ((val < last) && (val >= curr));
}
else
{
curr += CPU_FREQUENCY_MHZ * 1000;
do
{
val = SysTick->VAL;
}
while ((val <= last) || (val > curr));
}
delay -= temp;
}
}