139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						||
**************************************************************************
 | 
						||
* @file app_wrapper.c
 | 
						||
* @brief Код для из приложения МК для симуляции.
 | 
						||
**************************************************************************
 | 
						||
**************************************************************************/
 | 
						||
 | 
						||
#include "mcu_wrapper_conf.h"
 | 
						||
// Includes START
 | 
						||
#include "upp.h"
 | 
						||
#include "main.h"
 | 
						||
// Inlcudes END
 | 
						||
 | 
						||
// Dummy functions START
 | 
						||
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) {}
 | 
						||
void SystemClock_Config(void) {}
 | 
						||
void Error_Handler(void) {}
 | 
						||
// Dummy functions END
 | 
						||
 | 
						||
void app_init(void)
 | 
						||
{
 | 
						||
/* USER CODE BEGIN 1 */
 | 
						||
 | 
						||
    /* USER CODE END 1 */
 | 
						||
 | 
						||
    /* MCU Configuration--------------------------------------------------------*/
 | 
						||
 | 
						||
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 | 
						||
    HAL_Init();
 | 
						||
 | 
						||
    /* USER CODE BEGIN Init */
 | 
						||
 | 
						||
    /* USER CODE END Init */
 | 
						||
 | 
						||
    /* Configure the system clock */
 | 
						||
    SystemClock_Config();
 | 
						||
 | 
						||
    /* USER CODE BEGIN SysInit */
 | 
						||
 | 
						||
    /* USER CODE END SysInit */
 | 
						||
 | 
						||
    /* Initialize all configured peripherals */
 | 
						||
    MX_GPIO_Init();
 | 
						||
    MX_TIM2_Init();
 | 
						||
    /* USER CODE BEGIN 2 */
 | 
						||
    upp_init();
 | 
						||
 | 
						||
    /* USER CODE END 2 */
 | 
						||
 | 
						||
    /* Infinite loop */
 | 
						||
    /* USER CODE BEGIN WHILE */
 | 
						||
    //while (1)
 | 
						||
    //{
 | 
						||
    //    upp_main();
 | 
						||
    //    /* USER CODE END WHILE */
 | 
						||
 | 
						||
    //    /* USER CODE BEGIN 3 */
 | 
						||
    //}
 | 
						||
    /* USER CODE END 3 */
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void app_step(void)
 | 
						||
{
 | 
						||
    upp_main();
 | 
						||
}
 | 
						||
 | 
						||
void app_writeOutputBuffer(real_T* disc)
 | 
						||
{
 | 
						||
 | 
						||
    for (int i = 0; i < PORT_WIDTH; i++)
 | 
						||
    {
 | 
						||
        if (GPIOA->ODR & (1 << i))
 | 
						||
        {
 | 
						||
            disc[i] = 1;
 | 
						||
        }
 | 
						||
 | 
						||
        if (GPIOB->ODR & (1 << i))
 | 
						||
        {
 | 
						||
            disc[PORT_WIDTH + i] = 1;
 | 
						||
        }
 | 
						||
    }
 | 
						||
    disc[2 * PORT_WIDTH + 0] = phase_A.ctrl.angle.delay_us;
 | 
						||
    disc[2 * PORT_WIDTH + 1] = (uint16_t)((uint16_t)TIMER->CNT - phase_A.ctrl.angle.start_delay_tick);
 | 
						||
    disc[2 * PORT_WIDTH + 2] = phase_A.ctrl.angle.start_delay_tick;
 | 
						||
    disc[2 * PORT_WIDTH + 3] = TIMER->CNT;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void app_readInputs(real_T* in)
 | 
						||
{
 | 
						||
 | 
						||
#define detect_front(_in_numb_, _var_, _val_) {             \
 | 
						||
if ((in[_in_numb_] > 0.5) && (prev_in[_in_numb_] <= 0.5))   \
 | 
						||
{                                                           \
 | 
						||
    _var_ = _val_;                                          \
 | 
						||
} }
 | 
						||
 | 
						||
#define detect_rise(_in_numb_, _var_, _val_) {              \
 | 
						||
if ((in[_in_numb_] < 0.5) && (prev_in[_in_numb_] >= 0.5))   \
 | 
						||
{                                                           \
 | 
						||
    _var_ = _val_;                                          \
 | 
						||
} }
 | 
						||
 | 
						||
    static real_T prev_in[IN_PORT_WIDTH];
 | 
						||
 | 
						||
    detect_front(0, phase_A.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
    detect_rise(0, phase_A.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
 | 
						||
    detect_front(1, phase_B.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
    detect_rise(1, phase_B.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
 | 
						||
    detect_front(2, phase_C.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
    detect_rise(2, phase_C.zc_detector.f.EXTIZeroCrossDetected, 1);
 | 
						||
 | 
						||
    detect_front(3, Upp.GoSafe, 1);
 | 
						||
    detect_rise(3, Upp.GoSafe, 0);
 | 
						||
 | 
						||
    detect_front(4, Upp.Prepare, 1);
 | 
						||
    detect_rise(4, Upp.Prepare, 0);
 | 
						||
 | 
						||
    detect_front(5, Upp.ForceStop, 1);
 | 
						||
    detect_rise(5, Upp.ForceStop, 0);
 | 
						||
 | 
						||
    detect_front(6, Upp.ForceDisconnect, 1);
 | 
						||
    detect_rise(6, Upp.ForceDisconnect, 0);
 | 
						||
 | 
						||
 | 
						||
    Upp.sine_freq = in[7];
 | 
						||
    Upp.Duration = in[8];
 | 
						||
 | 
						||
 | 
						||
    for (int i = 0; i < IN_PORT_WIDTH; i++)
 | 
						||
    {
 | 
						||
        prev_in[i] = in[i];
 | 
						||
    }
 | 
						||
}
 |