/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "pish_stm32f411_sfr.h" #include "pish_gpio_drv.h" #include "pish_rcc_drv.h" #include "pish_uart_drv.h" #include "arm_irq.h" #include #include "pish_types.h" #include "soft_timer.h" #include "pish_counter.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ enum { STATE_SLOW, STATE_MES, STATE_FAST, STATE_RESTART, //... STATES_TOTAL } state; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ volatile uint8_t buttonPressed = 0; void processSlowState(event_t event); void processMesState(event_t event); void processFastState(event_t event); void processRestartState(event_t event); void processUnknownState(event_t event); void (*processSingleState)(event_t) = processSlowState; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ void delay (int ms); void rx_callback(uint8_t data); uint16_t getValue(); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void rx_callback(uint8_t data) { if ('1' == data) { PISH_GPIO_Write(GPIOA, 5, 1); } else if ('0' == data) { PISH_GPIO_Write(GPIOA, 5, 0); } } event_t getEvent() { if (buttonPressed){ buttonPressed = 0; return EVENT_BUTTON; } if (EVENT_NOTHING != STIMER_getEvent()){ return EVENT_TIMER; } if (EVENT_NOTHING != COUNTER_getEvent()) { return EVENT_COUNTER; } return EVENT_NOTHING; } void processSlowState(event_t event){ switch (event) { case EVENT_BUTTON: STIMER_arm(500); COUNTER_arm(3); state = STATE_MES; processSingleState = processMesState; break; case EVENT_TIMER: uint16_t val = 0; val = getValue(); printValue(val); STIMER_arm(1000); break; default: break; } } void processMesState(event_t event){ switch (event) { case EVENT_COUNTER: STIMER_arm(100); COUNTER_arm(100); state = STATE_FAST; processSingleState = processFastState; break; case EVENT_TIMER: message(COUNTER_getValue()); STIMER_arm(500); break; default: break; } } void processFastState(event_t event){ switch (event) { case EVENT_COUNTER: state = STATE_RESTART; processSingleState = processRestartState; break; case EVENT_TIMER: uint16_t val = 0; val = getValue(); char buf[4] = {0,}; sprintf (buf,"%d ",COUNTER_getValue()); PISH_UART_WriteStr(USART2, buf); printValue(val); STIMER_arm(100); break; default: break; } } void processRestartState(event_t event){ PISH_UART_WriteStr(USART2, "Restart \n\r"); state = STATE_SLOW; processSingleState = processSlowState; } void processUnknownState(event_t event){ PISH_UART_WriteStr(USART2, "UNKNOWN STATE \n\r"); state = STATE_SLOW; } void (*processState[STATES_TOTAL])(event_t) = { processSlowState, processMesState, processFastState, processRestartState }; /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ PISH_Init(); /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* USER CODE BEGIN Init */ PISH_RCC_Init(PISH_CLOCK_SRC_PLL); PISH_UART_Init(USART2, 0); PISH_UART_SetCallback(rx_callback); PISH_GPIO_Init(); uint32_t machine_ticks = getTicks(); state = STATE_SLOW; uint8_t counter = 1; STIMER_arm(1000); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { event_t event = getEvent(); //processSingleState(event); processState[state](event); // switch (state) // { // case STATE_SLOW: // processSlowState(event); // break; // case STATE_MES: // processMesState(event); // break; // case STATE_FAST: // processFastState(event); // break; // case STATE_RESTART: // processRestartState(event); // break; // default: // processUnknownState(event); // break; // } // switch (state) // { // case STATE_SLOW: // if(ticks - machine_ticks > 1000) // { // uint16_t val = 0; // val = getValue(); // printValue(val); // machine_ticks = ticks; // } // // if(buttonPressed) // { // state = STATE_MES; // buttonPressed = 0; // machine_ticks = ticks; // } // // break; // case STATE_MES: // if(ticks - machine_ticks > 500) // { // message(counter++); // machine_ticks = ticks; // } // if (counter > 3) // { // counter = 0; // machine_ticks = ticks; // state = STATE_FAST; // } // break; // case STATE_FAST: // if(ticks - machine_ticks > 100) // { // uint16_t val = 0; // val = getValue(); // printValue(val); // machine_ticks = ticks; // counter++; // } // if (counter > 50) // { // counter = 0; // machine_ticks = ticks; // state = STATE_RESTART; // } // break; // case STATE_RESTART: // PISH_UART_WriteStr(USART2, "Restart \n\r"); // state = STATE_SLOW; // break; // default: // PISH_UART_WriteStr(USART2, "UNKNOWN STATE \n\r"); // state = STATE_SLOW; // break; // } // while (!buttonPressed) // { // uint16_t val = 0; // val = getValue(); // printValue(val); // delay(1000); // } // buttonPressed = 0; // // message(1); // printValue(getValue()); // delay(500); // message(2); // printValue(getValue()); // delay(500); // message(3); // printValue(getValue()); // delay(500); // // for (int counter = 0; counter <100; counter++) // { // uint16_t val = 0; // val = getValue(); // printValue(val); // delay(100); // } // PISH_UART_WriteStr(USART2, "Restart \n\r"); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /* USER CODE BEGIN 4 */ void delay (int ms) { uint32_t currTicks = getTicks(); while(getTicks() - currTicks < ms) { } } uint16_t getValue() { return 123; } void message(uint8_t val) { char buf[30]; uint16_t len = sprintf(buf, "Button pressed: %d\n\r", val); //PISH_UART_WriteStr(USART2, ); PISH_UART_WriteStr(USART2, buf); } void printValue(uint16_t val) { char buf[20]; uint16_t len = sprintf(buf, "Value: %d\n\r", val); //PISH_UART_WriteStr(USART2, ); PISH_UART_WriteStr(USART2, buf); } void EXTI15_10_IRQHandler() { if(EXTI->PR.B.PR13) { EXTI->PR.B.PR13 = 1; buttonPressed = 1; } } /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */