/* * 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; } }