summaryrefslogtreecommitdiff
path: root/src/short-test/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/short-test/src/main.c')
-rw-r--r--src/short-test/src/main.c270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/short-test/src/main.c b/src/short-test/src/main.c
new file mode 100644
index 0000000..6e944c9
--- /dev/null
+++ b/src/short-test/src/main.c
@@ -0,0 +1,270 @@
+/*
+ * Test code that just sends the letters 'a' to 'z' over and
+ * over again using USART2.
+ *
+ * Toggles the BLUE LED slowly and the RED LED for every
+ * character sent.
+ */
+#include "stm_init.h"
+
+void test_for_shorts(char port, GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins);
+void uart_send_binary(uint32_t num, uint8_t bits);
+
+//------------------------------------------------------------------------------
+// Defines
+//------------------------------------------------------------------------------
+#define GPIO_PORT_LEDS GPIOJ
+
+#define GPIO_PIN_LED_RED GPIO_PIN_1
+#define GPIO_PIN_LED_YELLOW GPIO_PIN_2
+#define GPIO_PIN_LED_GREEN GPIO_PIN_3
+#define GPIO_PIN_LED_BLUE GPIO_PIN_4
+
+#define DELAY() HAL_Delay(100)
+
+#define DEBUG_ADJACENT 0
+
+//------------------------------------------------------------------------------
+// Macros
+//------------------------------------------------------------------------------
+#define led_on(pin) HAL_GPIO_WritePin(GPIO_PORT_LEDS, pin, GPIO_PIN_SET)
+#define led_off(pin) HAL_GPIO_WritePin(GPIO_PORT_LEDS, pin, GPIO_PIN_RESET)
+#define led_toggle(pin) HAL_GPIO_TogglePin(GPIO_PORT_LEDS, pin)
+
+
+/* These are all the pins used by the FMC interface */
+#define GPIOB_PINS (GPIO_PIN_7)
+
+#define GPIOD_PINS (GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 \
+ |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 \
+ |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4 \
+ |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)
+
+#define GPIOE_PINS (GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7 \
+ |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 \
+ |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15)
+
+#define GPIOF_PINS (GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 \
+ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 \
+ |GPIO_PIN_14|GPIO_PIN_15)
+
+#define GPIOG_PINS (GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 \
+ |GPIO_PIN_4|GPIO_PIN_5)
+
+#define GPIOH_PINS (GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 \
+ |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15)
+
+#define GPIOI_PINS (GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1 \
+ |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7)
+
+int
+main()
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ stm_init();
+
+ // enable gpio clocks
+ __GPIOA_CLK_ENABLE();
+ __GPIOB_CLK_ENABLE();
+ __GPIOD_CLK_ENABLE();
+ __GPIOE_CLK_ENABLE();
+ __GPIOF_CLK_ENABLE();
+ __GPIOG_CLK_ENABLE();
+ __GPIOH_CLK_ENABLE();
+ __GPIOI_CLK_ENABLE();
+
+ configure_all_as_input(GPIOB, GPIOB_PINS);
+ configure_all_as_input(GPIOD, GPIOD_PINS);
+ configure_all_as_input(GPIOE, GPIOE_PINS);
+ configure_all_as_input(GPIOF, GPIOF_PINS);
+ configure_all_as_input(GPIOG, GPIOG_PINS);
+ configure_all_as_input(GPIOH, GPIOH_PINS);
+ configure_all_as_input(GPIOI, GPIOI_PINS);
+
+ /* Change one pin to output */
+ GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ while (1) {
+ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_RESET);
+ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
+ }
+
+ while (1) {
+ HAL_GPIO_TogglePin(LED_PORT, LED_GREEN);
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n\r\n\r\n\r\n\r\n", 10, 0x1);
+
+ test_for_shorts('B', GPIOB, GPIOB_PINS);
+ test_for_shorts('D', GPIOD, GPIOD_PINS);
+ test_for_shorts('E', GPIOE, GPIOE_PINS);
+ test_for_shorts('F', GPIOF, GPIOF_PINS);
+ test_for_shorts('G', GPIOG, GPIOG_PINS);
+ test_for_shorts('H', GPIOH, GPIOH_PINS);
+ test_for_shorts('I', GPIOI, GPIOI_PINS);
+
+ led_toggle(LED_BLUE);
+ HAL_Delay(2000);
+ }
+}
+
+void configure_all_as_input(GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins)
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Configure all pins as input. XXX do all pins (0xffff) instead of just GPIO_Test_Pins? */
+ GPIO_InitStruct.Pin = GPIO_Test_Pins;
+ //GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /* XXX does GPIO_PULLDOWN work with GPIO_MODE_INPUT? */
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+ GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
+ HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
+}
+
+uint8_t check_no_input(char port, GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins, char wrote_port, uint16_t wrote_value)
+{
+ uint16_t read;
+
+ /* Read all pins from port at once. XXX check all pins, not just GPIO_Test_Pins? */
+ read = (GPIOx->IDR & GPIO_Test_Pins);
+
+ if (DEBUG_ADJACENT && port == 'H' && wrote_port == 'I' && wrote_value < 4) {
+ HAL_UART_Transmit(&huart2, (uint8_t *) "DEBUG R GPIOH ", 14, 0x1);
+ uart_send_binary(GPIO_Test_Pins, 16);
+ HAL_UART_Transmit(&huart2, (uint8_t *) " -> ", 4, 0x1);
+ uart_send_binary(read, 16);
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n", 2, 0x1);
+ }
+
+ if (! read) {
+ /* No unexpected pins read as HIGH */
+ return 0;
+ }
+
+ led_on(LED_RED);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) "Wrote ", 6, 0x1);
+ uart_send_binary(wrote_value, 16);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) " to port GPIO", 13, 0x1);
+ HAL_UART_Transmit(&huart2, (uint8_t *) &wrote_port, 1, 0x1);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) ", read ", 7, 0x1);
+ uart_send_binary(read, 16);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) " from GPIO", 10, 0x1);
+ HAL_UART_Transmit(&huart2, (uint8_t *) &port, 1, 0x1);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n", 2, 0x1);
+
+ return 1;
+}
+
+void test_for_shorts(char port, GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins)
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+ uint16_t i, fail = 0, Test_Pin, read;
+
+ configure_all_as_input(GPIOB, GPIOB_PINS);
+ configure_all_as_input(GPIOD, GPIOD_PINS);
+ configure_all_as_input(GPIOE, GPIOE_PINS);
+ configure_all_as_input(GPIOF, GPIOF_PINS);
+ configure_all_as_input(GPIOG, GPIOG_PINS);
+ configure_all_as_input(GPIOH, GPIOH_PINS);
+ configure_all_as_input(GPIOI, GPIOI_PINS);
+
+ check_no_input('B', GPIOB, GPIOB_PINS, 'x', 0);
+ check_no_input('D', GPIOD, GPIOD_PINS, 'x', 0);
+ check_no_input('E', GPIOE, GPIOE_PINS, 'x', 0);
+ check_no_input('F', GPIOF, GPIOF_PINS, 'x', 0);
+ check_no_input('G', GPIOG, GPIOG_PINS, 'x', 0);
+ check_no_input('H', GPIOH, GPIOH_PINS, 'x', 0);
+ check_no_input('I', GPIOI, GPIOI_PINS, 'x', 0);
+
+ for (i = 0; i < 31; i++) {
+ Test_Pin = 1 << i;
+ if (! (GPIO_Test_Pins & Test_Pin)) continue;
+
+ configure_all_as_input(GPIOx, GPIO_Test_Pins);
+
+ /* Change one pin to output */
+ GPIO_InitStruct.Pin = Test_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+ GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
+ HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
+
+ HAL_GPIO_WritePin(GPIOx, Test_Pin, GPIO_PIN_SET);
+
+ /* Read all pins from port at once. XXX check all pins, not just GPIO_Test_Pins? */
+ read = GPIOx->IDR & GPIO_Test_Pins;
+
+ if (DEBUG_ADJACENT && port == 'I' && Test_Pin < 4) {
+ HAL_UART_Transmit(&huart2, (uint8_t *) "DEBUG W GPIOI ", 14, 0x1);
+ uart_send_binary(Test_Pin, 16);
+ HAL_UART_Transmit(&huart2, (uint8_t *) " -> ", 4, 0x1);
+ uart_send_binary(read, 16);
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n", 2, 0x1);
+ }
+
+ if (read == Test_Pin) {
+ /* No unexpected pins read as HIGH */
+ led_toggle(LED_GREEN);
+ } else {
+ led_on(LED_RED);
+ HAL_UART_Transmit(&huart2, (uint8_t *) "GPIO", 4, 0x1);
+ HAL_UART_Transmit(&huart2, (uint8_t *) &port, 1, 0x1);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) " exp ", 5, 0x1);
+ uart_send_binary(Test_Pin, 16);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) " got ", 5, 0x1);
+ uart_send_binary(read, 16);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) " diff ", 6, 0x1);
+ uart_send_binary(read ^ Test_Pin, 16);
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n", 2, 0x1);
+
+ fail++;
+ }
+
+ /* Check there is no input on any of the other GPIO ports (adjacent pins might live on different ports) */
+ if (port != 'B') fail += check_no_input('B', GPIOB, GPIOB_PINS, port, Test_Pin);
+ if (port != 'D') fail += check_no_input('D', GPIOD, GPIOD_PINS, port, Test_Pin);
+ if (port != 'E') fail += check_no_input('E', GPIOE, GPIOE_PINS, port, Test_Pin);
+ if (port != 'F') fail += check_no_input('F', GPIOF, GPIOF_PINS, port, Test_Pin);
+ if (port != 'G') fail += check_no_input('G', GPIOG, GPIOG_PINS, port, Test_Pin);
+ if (port != 'H') fail += check_no_input('H', GPIOH, GPIOH_PINS, port, Test_Pin);
+ if (port != 'I') fail += check_no_input('I', GPIOI, GPIOI_PINS, port, Test_Pin);
+
+ HAL_GPIO_WritePin(GPIOx, Test_Pin, GPIO_PIN_RESET);
+ }
+
+ if (fail) {
+ HAL_UART_Transmit(&huart2, (uint8_t *) "\r\n", 2, 0x1);
+ }
+}
+
+void uart_send_binary(uint32_t num, uint8_t bits) {
+ uint32_t i;
+ unsigned char ch;
+
+ bits--; /* bits 4 should give i = 1000, not 10000 */
+
+ i = 1 << bits;
+ while (i) {
+ ch = '0';
+ if (num & i) {
+ ch = '1';
+ }
+
+ HAL_UART_Transmit(&huart2, (uint8_t *) &ch, 1, 0x1);
+ i = i >> 1;
+ }
+}