summaryrefslogtreecommitdiff
path: root/app/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/main.c')
-rw-r--r--app/main.c288
1 files changed, 288 insertions, 0 deletions
diff --git a/app/main.c b/app/main.c
new file mode 100644
index 0000000..b71d027
--- /dev/null
+++ b/app/main.c
@@ -0,0 +1,288 @@
+/**
+ ******************************************************************************
+ * @file STM32L152_Ex01_3TKeys_EVAL\src\main.c
+ * @author MCD Application Team
+ * @version V1.1.0
+ * @date 24-February-2014
+ * @brief Basic example of how to use the STMTouch Driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+/*
+ Здесь необходимо создать большой комментарий о характеристиках железа МК. Или
+же лучше создать отдельный файл и сделать на него ссылку. Кстати, такой файл
+создает программа STM32CubeMX.
+
+И вообще, нужно создать глобальную папку проекта, где будет лежать все по
+полочкам ( схема, программа, текстовые файлы, документация и тд )
+*/
+
+// Это программа для версии NixieClock_v2, которая является модифицированной версией предыдущей
+// NixieLUT
+
+/* Includes ------------------------------------------------------------------*/
+#include "time.h"
+
+// FreeRTOS includes
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "semphr.h"
+
+#include "ltimers.h"
+#include "head_task.h"
+#include "button_task.h"
+#include "button_handler.h"
+#include "nixie_driver_task.h"
+#include "light_sensor_task.h"
+
+#ifdef LED_DRIVER
+#include "led_driver_task.h"
+#endif
+
+#include "indicate_modes_task.h"
+#include "tsl_user.h"
+#include "time.h"
+#include "stm32f0xx_usart.h"
+
+
+/* Private typedefs ----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+
+// Задаем размеры кучи для каждой задачи отдельно
+// - как правильно определить необходимый минимум для кучи задачи?
+
+#define STACK_SIZE_HEAD ((unsigned short) 230)
+#define STACK_SIZE_NIXIE_DRIVER ((unsigned short) 80)
+#define STACK_SIZE_BUTTON ((unsigned short) 200)
+#define STACK_SIZE_LIGHT_SENSOR ((unsigned short) 70)
+#ifdef LED_DRIVER
+#define STACK_SIZE_LED_DRIVER ((unsigned short) 70)
+#endif
+#define STACK_SIZE_INDICATE_MODES ((unsigned short) 250)
+
+/* Private functions prototype ---------------------------------------------- */
+
+static void USART1Init(void)
+{
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+ USART_InitTypeDef usart_init = {0};
+ usart_init.USART_BaudRate = 115200;
+ usart_init.USART_WordLength = USART_WordLength_8b;
+ usart_init.USART_StopBits = USART_StopBits_1;
+ usart_init.USART_Parity = USART_Parity_No;
+ usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+ usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_Init(USART1, &usart_init);
+ USART_Cmd(USART1, ENABLE);
+}
+
+static void USART4Init(void)
+{
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4);
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4);
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+ USART_InitTypeDef usart_init = {0};
+ usart_init.USART_BaudRate = 9600;
+ usart_init.USART_WordLength = USART_WordLength_8b;
+ usart_init.USART_StopBits = USART_StopBits_1;
+ usart_init.USART_Parity = USART_Parity_No;
+ usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+ usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_Init(USART4, &usart_init);
+ USART_Cmd(USART4, ENABLE);
+}
+
+static void WIFI_IO_GPIOInit(void)
+{
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ GPIO_SetBits(GPIOB, GPIO_Pin_0); // WIFI_EN
+ GPIO_ResetBits(GPIOA, GPIO_Pin_15); // WIFI_IO0
+}
+
+static void USART3Init(void)
+{
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_4);
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_4);
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_4);
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_4);
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ USART_InitTypeDef usart_init = {0};
+ usart_init.USART_BaudRate = 115200;
+ usart_init.USART_WordLength = USART_WordLength_8b;
+ usart_init.USART_StopBits = USART_StopBits_1;
+ usart_init.USART_Parity = USART_Parity_No;
+ usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+ usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
+ USART_Init(USART3, &usart_init);
+ USART_Cmd(USART3, ENABLE);
+}
+
+// ----------------------------------------------------------------------------
+// Инициализация до создания задач
+// ----------------------------------------------------------------------------
+void InitAll ( void )
+{
+ SystemInit();
+ WIFI_IO_GPIOInit();
+ USART1Init();
+ USART3Init();
+ USART4Init();
+ InitLTimers();
+ LightSensorInit();
+#if 0
+ NixieDriverInit();
+ HeadTaskInit();
+ IndicateModesInit();
+#endif
+#ifdef LED_DRIVER
+ LED_DriverInit();
+#endif
+ TSL_user_Init();
+ TimeInit();
+ ButtonInit();
+}
+
+static void TestUart(void *arg)
+{
+ (void) arg;
+ while (1) {
+ if (USART3->ISR & USART_ISR_RXNE) {
+ const uint16_t data = USART_ReceiveData(USART3);
+ USART_SendData(USART1, data);
+ }
+ if (USART1->ISR & USART_ISR_RXNE) {
+ const uint16_t data = USART_ReceiveData(USART1);
+ USART_SendData(USART3, data);
+ }
+ }
+}
+
+BaseType_t TaskSuccess;
+
+// Главный цикл ------------------------------------------------------------- //
+int main ()
+{
+ InitAll ();
+ // Создаем задачи FreeRTOS ----------------------------------------------- //
+
+ // ВНИМАНИЕ !!!
+ // Необходимо проверять кучу при создании задачи! ( и очереди )
+
+ // Если в программе используется подключаемая библиотека, которая использует
+ // ОСРВ, то задача должна там и создаватья. То есть это нужно оформить в
+ // в виде специальной функции
+ TaskSuccess = xTaskCreate(Button_Task, "Button_Task", STACK_SIZE_BUTTON, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+ TaskSuccess = xTaskCreate(LightSensor_Task, "LightSensor_Task", STACK_SIZE_LIGHT_SENSOR, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+#if 0
+ TaskSuccess = xTaskCreate(Head_Task, "Head_Task", STACK_SIZE_HEAD, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+ TaskSuccess = xTaskCreate(IndicateModes_Task, "IndicateModes_Task", STACK_SIZE_INDICATE_MODES, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+ TaskSuccess = xTaskCreate(NixieDriver_Task, "NixieDriver_Task", STACK_SIZE_NIXIE_DRIVER, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+#endif
+#ifdef LED_DRIVER
+ TaskSuccess = xTaskCreate(LED_Driver_Task, "LED_Driver_Task", STACK_SIZE_LED_DRIVER, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+#endif
+ TaskSuccess = xTaskCreate(TestUart, "TestUart", 200, NULL, tskIDLE_PRIORITY + 2, NULL);
+ configASSERT(TaskSuccess);
+ vTaskStartScheduler(); // И запускаем диспетчер задач ( он же планировщик )
+} // end of main
+
+
+
+#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 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) */
+
+ /* Infinite loop */
+ for (;;)
+ {
+ }
+}
+#endif
+
+
+// Специальные ф-ии FreeRTOS ------------------------------------------------ //
+void vApplicationMallocFailedHook ( void ) { for( ;; ); }
+void vApplicationStackOverflowHook ( TaskHandle_t pxTask, char *pcTaskName ) { for( ;; ); }
+void vApplicationIdleHook ( void ) { }
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/