diff options
Diffstat (limited to 'src/temperature/main.c')
-rw-r--r-- | src/temperature/main.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/temperature/main.c b/src/temperature/main.c new file mode 100644 index 0000000..9864dab --- /dev/null +++ b/src/temperature/main.c @@ -0,0 +1,208 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <math.h> +#include "stm32f4xx_conf.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "semphr.h" + +#include "temperature.h" + +#include "debug.h" + + +ADC_InitTypeDef ADC_InitStruct; + +ADC_CommonInitTypeDef ADC_CommonInitStruct; + + +// Private variables +volatile uint32_t time_var1, time_var2; + +// Private function prototypes +void init(); + +// Tasks +static void detect_button_press(void *pvParameters); +static void update_temperature(void *pvParameters); + + +void vApplicationStackOverflowHook( TaskHandle_t xTask, + signed char *pcTaskName ) +{ + while (1) {}; +} +extern void initialise_monitor_handles(void); + +int main(void) { + init(); + + xTaskCreate( + detect_button_press, + "TaskButton", + 4*configMINIMAL_STACK_SIZE, + (void*) NULL, + tskIDLE_PRIORITY + 2UL, + NULL); + + xTaskCreate( + update_temperature, + "TaskAudio", + configMINIMAL_STACK_SIZE, + (void*) NULL, + tskIDLE_PRIORITY + 2UL, + NULL); + + /* Start the RTOS Scheduler */ + vTaskStartScheduler(); + + /* HALT */ + while(1); +} + + +static void detect_button_press(void *pvParameters) +{ + GPIO_SetBits(GPIOD, GPIO_Pin_12); + + while (1) { + if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)>0) { + + while (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) > 0) { + vTaskDelay(100 / portTICK_RATE_MS); /* Button Debounce Delay */ + } + + GPIO_ResetBits(GPIOD, GPIO_Pin_12); + GPIO_SetBits(GPIOD, GPIO_Pin_15); + debug_print("Le jeu. Temp is: "); + + char t[32]; + // For debugging purposes only. snprinf has issues with %f + snprintf(t, 32, "%d.%02d", (int)temperature_get(), (int)(temperature_get() * 100.0 - (int)(temperature_get()) * 100.0)); + debug_print(t); + debug_print("\n"); + + GPIO_ResetBits(GPIOD, GPIO_Pin_15); + GPIO_SetBits(GPIOD, GPIO_Pin_12); + + while (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) { + vTaskDelay(100 / portTICK_RATE_MS); /* Button Debounce Delay */ + } + } + taskYIELD(); + } +} + +static void update_temperature(void *pvParameters) +{ + + while (1) { + + vTaskDelay(1000 / portTICK_RATE_MS); + + GPIO_SetBits(GPIOD, GPIO_Pin_13); + temperature_update(); + GPIO_ResetBits(GPIOD, GPIO_Pin_13); + taskYIELD(); + } +} + + +void init() { + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + // ---------- SysTick timer -------- // + if (SysTick_Config(SystemCoreClock / 1000)) { + // Capture error + while (1){}; + } + + // Enable full access to FPU (Should be done automatically in system_stm32f4xx.c): + //SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); // set CP10 and CP11 Full Access + + // GPIOD Periph clock enable + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + // Configure PD12, PD13, PD14 and PD15 in output pushpull mode + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + // Init PushButton + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + + // ------ UART ------ // + + // Clock + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + + // IO + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART1); + GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART1); + + // Conf + USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + USART_Init(USART2, &USART_InitStructure); + + // Enable + USART_Cmd(USART2, ENABLE); + + + // Temperature using ADC + + // Enable ADC clock + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); + + // Init ADC + ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; + ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div8; + ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; + ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; + ADC_CommonInit(&ADC_CommonInitStruct); + + ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; + ADC_InitStruct.ADC_ScanConvMode = DISABLE; + ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; + ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; + ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStruct.ADC_NbrOfConversion = 1; + ADC_Init(ADC1, &ADC_InitStruct); + + // Configure ADC1 to use temperture sensor + ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles); + + // Enable temperature sensor + ADC_TempSensorVrefintCmd(ENABLE); + + // Enable ADC + ADC_Cmd(ADC1, ENABLE); + +} + |