aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-03-02 16:31:55 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-03-02 16:31:55 +0100
commit92de1f03abff7b4f572144140730799ec635c461 (patch)
treeac09e87219d10c21a26703251fbdf505cf9a1b5b /src
parentd72ffd3a9ed108c1faf143894d609d1e26bc5084 (diff)
downloadglutte-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.c2
-rw-r--r--src/glutt-o-logique/main.c36
-rw-r--r--src/glutt-o-logique/pio.c205
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"
+