diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-03-02 16:31:55 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-03-02 16:31:55 +0100 |
commit | 92de1f03abff7b4f572144140730799ec635c461 (patch) | |
tree | ac09e87219d10c21a26703251fbdf505cf9a1b5b /src | |
parent | d72ffd3a9ed108c1faf143894d609d1e26bc5084 (diff) | |
download | glutte-o-matic-92de1f03abff7b4f572144140730799ec635c461.tar.gz glutte-o-matic-92de1f03abff7b4f572144140730799ec635c461.tar.bz2 glutte-o-matic-92de1f03abff7b4f572144140730799ec635c461.zip |
Allocate SQ2, DET 1750 and NF, partly adapt code, schematics and layout
Diffstat (limited to 'src')
-rw-r--r-- | src/glutt-o-logique/analog_input.c | 2 | ||||
-rw-r--r-- | src/glutt-o-logique/main.c | 36 | ||||
-rw-r--r-- | src/glutt-o-logique/pio.c | 205 |
3 files changed, 149 insertions, 94 deletions
diff --git a/src/glutt-o-logique/analog_input.c b/src/glutt-o-logique/analog_input.c index 33bb662..5f0e700 100644 --- a/src/glutt-o-logique/analog_input.c +++ b/src/glutt-o-logique/analog_input.c @@ -37,6 +37,8 @@ // Measured on the board itself const float v_ref = 2.965f; +#warning "TODO: initialise ADC2 and use it for NF input" + void analog_init(void) { // Enable ADC and GPIOA clocks diff --git a/src/glutt-o-logique/main.c b/src/glutt-o-logique/main.c index 4341d54..5ff89bf 100644 --- a/src/glutt-o-logique/main.c +++ b/src/glutt-o-logique/main.c @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2016 Matthias P. Braendli, Maximilien Cuony + * Copyright (c) 2019 Matthias P. Braendli, Maximilien Cuony * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,6 @@ */ #include "stm32f4xx_conf.h" -#include "leds.h" // This is a set of guards to make sure the FPU compile configuration // is correct @@ -47,39 +46,8 @@ # error "SOFTFP" #endif -void init(void); - -void init() +void init(void) { - /* Initialise the onboard peripherals - * Four LEDs and one push-button - */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); - - // Configure PD12, PD13, PD14 and PD15 in output pushpull mode - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = - GPIOD_BOARD_LED_GREEN | - GPIOD_BOARD_LED_ORANGE | - GPIOD_BOARD_LED_RED | - GPIOD_BOARD_LED_BLUE; - - 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); - - /* Setup Watchdog * The IWDG runs at 32kHz. With a prescaler of 32 -> 1kHz. * Counting to 2000 / 1000 = 2 seconds diff --git a/src/glutt-o-logique/pio.c b/src/glutt-o-logique/pio.c index b7420dc..caf29bc 100644 --- a/src/glutt-o-logique/pio.c +++ b/src/glutt-o-logique/pio.c @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2016 Matthias P. Braendli + * Copyright (c) 2019 Matthias P. Braendli * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,43 +24,66 @@ #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" +#include "stm32f4xx_conf.h" /* See pio.txt for PIO allocation details */ -/* On GPIO C */ -#define GPIO_PIN_QRP_n GPIO_Pin_1 -#define GPIO_PIN_TX GPIO_Pin_2 -#define GPIO_PIN_1750_n GPIO_Pin_4 -#define GPIO_PIN_MOD_OFF GPIO_Pin_5 -#define GPIO_PIN_SQ_n GPIO_Pin_6 -#define GPIO_PIN_U GPIO_Pin_8 -#define GPIO_PIN_QRP_out GPIO_Pin_9 -#define GPIO_PIN_D GPIO_Pin_11 -#define GPIO_PIN_REPLIE GPIO_Pin_13 -#define GPIO_PIN_FAX GPIO_Pin_14 -#define GPIO_PIN_GPS_EPPS GPIO_Pin_15 +#define GPIOA_PIN_DET_1750 GPIO_Pin_8 +#define GPIOA_PIN_PUSHBTN GPIO_Pin_0 + +#define GPIOC_PIN_SQ2 GPIO_Pin_0 +#define GPIOC_PIN_QRP_n GPIO_Pin_1 +#define GPIOC_PIN_TX GPIO_Pin_2 +#define GPIOC_PIN_1750_n GPIO_Pin_4 +#define GPIOC_PIN_MOD_OFF GPIO_Pin_5 +#define GPIOC_PIN_SQ_n GPIO_Pin_6 +#define GPIOC_PIN_U GPIO_Pin_8 +#define GPIOC_PIN_QRP_out GPIO_Pin_9 +#define GPIOC_PIN_D GPIO_Pin_11 +#define GPIOC_PIN_REPLIE GPIO_Pin_13 +#define GPIOC_PIN_FAX GPIO_Pin_14 +#define GPIOC_PIN_GPS_EPPS GPIO_Pin_15 + + +#define GPIOA_INPUT_PINS ( \ + GPIOA_PIN_PUSHBTN | \ + 0) +#define GPIOA_OUTPUT_PINS ( \ + GPIOA_PIN_DET_1750 | \ + 0) #define GPIOC_OUTPUT_PINS ( \ - GPIO_PIN_TX | \ - GPIO_PIN_MOD_OFF | \ - GPIO_PIN_QRP_out | \ - GPIO_PIN_GPS_EPPS | \ + GPIOC_PIN_TX | \ + GPIOC_PIN_MOD_OFF | \ + GPIOC_PIN_QRP_out | \ + GPIOC_PIN_GPS_EPPS | \ + GPIOC_PIN_FAX | \ + GPIOC_PIN_SQ2 | \ 0) #undef GPIOC_OPENDRAIN_PINS #undef GPIOC_INPUT_PU_PINS #define GPIOC_INPUT_PINS ( \ - GPIO_PIN_QRP_n | \ - GPIO_PIN_1750_n | \ - GPIO_PIN_SQ_n | \ - GPIO_PIN_U | \ - GPIO_PIN_D | \ - GPIO_PIN_REPLIE | \ - GPIO_PIN_FAX | \ + GPIOC_PIN_QRP_n | \ + GPIOC_PIN_1750_n | \ + GPIOC_PIN_SQ_n | \ + GPIOC_PIN_U | \ + GPIOC_PIN_D | \ + GPIOC_PIN_REPLIE | \ + GPIOC_PIN_FAX | \ 0 ) +#define GPIOD_OUTPUT_PINS ( \ + GPIOD_BOARD_LED_GREEN | \ + GPIOD_BOARD_LED_ORANGE | \ + GPIOD_BOARD_LED_RED | \ + GPIOD_BOARD_LED_BLUE | \ + 0 ) + +#include "leds.h" + #include "GPIO/pio.h" #include "Core/common.h" #include "FreeRTOS.h" @@ -72,19 +95,49 @@ void read_fsm_input_task(void *pvParameters); struct fsm_input_signals_t pio_signals; +static inline int all_equal(const uint8_t* v, uint8_t len) +{ + if (len < 2) { + return 1; + } + + for (uint8_t i = 1; i < len; i++) { + if (v[i] != v[0]) + return 0; + } + return 1; +} + +static inline int any_true(const uint8_t* v, uint8_t len) +{ + if (len < 2) { + return 1; + } + + for (uint8_t i = 0; i < len; i++) { + if (v[i]) + return 1; + } + return 0; +} /* Some signals need additional debouncing or delays, the following * variables are shift registers. */ -static uint8_t debounce_sq[3] = {0}; +#define DEBOUNCE_LEN_SQ 3 +static uint8_t debounce_sq[DEBOUNCE_LEN_SQ] = {0}; /* D and U have to stay on longer than SQ, otherwise the * letter selection can fail, and transmit a K when it should * send a D or U */ -static uint8_t debounce_discrim_d[6] = {0}; -static uint8_t debounce_discrim_u[6] = {0}; +#define DEBOUNCE_LEN_D_U 6 +static uint8_t debounce_discrim_d[DEBOUNCE_LEN_D_U] = {0}; +static uint8_t debounce_discrim_u[DEBOUNCE_LEN_D_U] = {0}; +/* This comes from the front panel button */ +#define DEBOUNCE_LEN_1750 3 +static uint8_t debounce_1750[DEBOUNCE_LEN_1750] = {0}; void pio_init() { @@ -92,8 +145,27 @@ void pio_init() // Init pio RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); + // For the onboard peripherals, 4x LEDs, 1 push-button: + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + // GPIO A + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Pin = GPIOA_INPUT_PINS; + 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); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Pin = GPIOA_OUTPUT_PINS; + 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); + + // GPIOC + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = GPIOC_OUTPUT_PINS; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; @@ -118,14 +190,20 @@ void pio_init() GPIO_Init(GPIOC, &GPIO_InitStructure); #endif -#if defined(GPIOC_INPUT_PINS) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Pin = GPIOC_INPUT_PINS; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); -#endif + + // GPIO D + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Pin = GPIOD_OUTPUT_PINS; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_Init(GPIOD, &GPIO_InitStructure); xTaskCreate( read_fsm_input_task, @@ -145,50 +223,55 @@ void read_fsm_input_task(void __attribute__ ((unused))*pvParameters) { while (1) { pio_signals.qrp = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_QRP_n) ? 0 : 1; + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_QRP_n) ? 0 : 1; - pio_signals.tone_1750 = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_1750_n) ? 0 : 1; + for (int i = 0; i < DEBOUNCE_LEN_SQ-1; i++) { + debounce_sq[i] = debounce_sq[i+1]; + } - debounce_sq[0] = debounce_sq[1]; - debounce_sq[1] = debounce_sq[2]; - debounce_sq[2] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_SQ_n) ? 0 : 1; + debounce_sq[DEBOUNCE_LEN_SQ-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_SQ_n) ? 0 : 1; /* Only change the signal if its input has stabilised */ - if (debounce_sq[0] == debounce_sq[1] && - debounce_sq[1] == debounce_sq[2]) { + if (all_equal(debounce_sq, DEBOUNCE_LEN_SQ)) { pio_signals.sq = debounce_sq[0]; } /* The discrim U and D signals should be very sensitive: * if one toggles to 1, set to 1; reset to 0 only if all - * are at 0 + * are at 0. */ - for (int i = 0; i < 5; i++) { + for (int i = 0; i < DEBOUNCE_LEN_D_U-1; i++) { debounce_discrim_d[i] = debounce_discrim_d[i+1]; debounce_discrim_u[i] = debounce_discrim_u[i+1]; } - debounce_discrim_u[5] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_U) ? 1 : 0; + debounce_discrim_u[DEBOUNCE_LEN_D_U-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_U) ? 1 : 0; + pio_signals.discrim_u = any_true(debounce_discrim_u, DEBOUNCE_LEN_D_U); + + debounce_discrim_d[DEBOUNCE_LEN_D_U-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_D) ? 1 : 0; + pio_signals.discrim_d = any_true(debounce_discrim_d, DEBOUNCE_LEN_D_U); - pio_signals.discrim_u = - debounce_discrim_u[0] | debounce_discrim_u[1] | debounce_discrim_u[2] | - debounce_discrim_u[3] | debounce_discrim_u[4] | debounce_discrim_u[5]; - debounce_discrim_d[5] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_D) ? 1 : 0; + for (int i = 0; i < DEBOUNCE_LEN_1750-1; i++) { + debounce_1750[i] = debounce_1750[i+1]; + } + + debounce_1750[DEBOUNCE_LEN_1750-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_1750_n) ? 0 : 1; - pio_signals.discrim_d = - debounce_discrim_d[0] | debounce_discrim_d[1] | debounce_discrim_d[2] | - debounce_discrim_d[3] | debounce_discrim_d[4] | debounce_discrim_d[5]; + if (all_equal(debounce_1750, DEBOUNCE_LEN_1750)) { + pio_signals.tone_1750 = debounce_1750[0]; + } pio_signals.wind_generator_ok = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_REPLIE) ? 0 : 1; + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_REPLIE) ? 0 : 1; +#warning "TODO: remove sstv_mode" pio_signals.sstv_mode = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_FAX) ? 1 : 0; + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_FAX) ? 1 : 0; vTaskDelay(pdMS_TO_TICKS(100)); } @@ -197,30 +280,30 @@ void read_fsm_input_task(void __attribute__ ((unused))*pvParameters) void pio_set_tx(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_TX); + GPIO_SetBits(GPIOC, GPIOC_PIN_TX); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_TX); + GPIO_ResetBits(GPIOC, GPIOC_PIN_TX); } } void pio_set_qrp(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_QRP_out); + GPIO_SetBits(GPIOC, GPIOC_PIN_QRP_out); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_QRP_out); + GPIO_ResetBits(GPIOC, GPIOC_PIN_QRP_out); } } void pio_set_mod_off(int mod_off) { if (mod_off) { - GPIO_SetBits(GPIOC, GPIO_PIN_MOD_OFF); + GPIO_SetBits(GPIOC, GPIOC_PIN_MOD_OFF); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_MOD_OFF); + GPIO_ResetBits(GPIOC, GPIOC_PIN_MOD_OFF); } } @@ -231,10 +314,12 @@ int pio_read_button() { void pio_set_gps_epps(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_GPS_EPPS); + GPIO_SetBits(GPIOC, GPIOC_PIN_GPS_EPPS); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_GPS_EPPS); + GPIO_ResetBits(GPIOC, GPIOC_PIN_GPS_EPPS); } } +#warning "TODO: add output functions for SQ2, DET 1750 and FAX" + |