#include "st_sys.h" #include "hw_io_pin.h" typedef struct { GPIO_TypeDef *gpio; unsigned short pin; unsigned char level; unsigned char pupd; } io_pin_t; static io_pin_t io_input_map[IO_PIN_INPUT_NUMBER] = { { GPIOF, 1, 0, GPIO_PUPD_PU},//0 { GPIOF, 0, 0, GPIO_PUPD_PU},//1 { GPIOG, 2, 0, GPIO_PUPD_PU},//2 { GPIOG, 3, 0, GPIO_PUPD_PU},//3 { GPIOG, 4, 0, GPIO_PUPD_PU},//4 { GPIOE, 5, 0, GPIO_PUPD_PU},//5 { GPIOE, 4, 0, GPIO_PUPD_PU},//6 { GPIOE, 3, 0, GPIO_PUPD_PU},//7 { GPIOE, 2, 0, GPIO_PUPD_PU},//10 { GPIOE, 1, 0, GPIO_PUPD_PU},//11 { GPIOE, 0, 0, GPIO_PUPD_PU},//12 { GPIOB, 9, 0, GPIO_PUPD_PU},//13 { GPIOB, 8, 0, GPIO_PUPD_PU},//14 { GPIOB, 7, 0, GPIO_PUPD_PU},//15 { GPIOB, 6, 0, GPIO_PUPD_PU},//16 { GPIOG, 13, 0, GPIO_PUPD_PU},//17 { GPIOA, 15, 0, GPIO_PUPD_PU},//20 { GPIOB, 3, 0, GPIO_PUPD_PU},//21 { GPIOC, 6, 0, GPIO_PUPD_PU},//22 { GPIOC, 7, 0, GPIO_PUPD_PU}//23 }; static io_pin_t io_output_map[IO_PIN_OUTPUT_NUMBER] = { { GPIOF, 4, 0, GPIO_PUPD_PU},//0 { GPIOF, 5, 0, GPIO_PUPD_PU},//1 { GPIOF, 10, 0, GPIO_PUPD_PU},//2 { GPIOA, 4, 0, GPIO_PUPD_PU},//3 { GPIOA, 5, 0, GPIO_PUPD_PU},//4 { GPIOA, 6, 0, GPIO_PUPD_PU},//5 { GPIOB, 0, 0, GPIO_PUPD_PU},//6 { GPIOB, 1, 0, GPIO_PUPD_PU},//7 { GPIOF, 11, 0, GPIO_PUPD_PU},//10 { GPIOB, 15, 0, GPIO_PUPD_PU},//11 { GPIOD, 11, 0, GPIO_PUPD_PU},//12 { GPIOF, 12, 0, GPIO_PUPD_PU},//13 { GPIOF, 13, 0, GPIO_PUPD_PU},//14 { GPIOF, 14, 0, GPIO_PUPD_PU},//15 { GPIOF, 15, 0, GPIO_PUPD_PU},//16 { GPIOG, 0, 0, GPIO_PUPD_PU},//17 { GPIOG, 1, 0, GPIO_PUPD_PU},//20 { GPIOE, 7, 0, GPIO_PUPD_PU},//21 { GPIOE, 8, 0, GPIO_PUPD_PU}//22 }; #define OUTPUT_ENABLE_PORT GPIOG #define OUTPUT_ENABLE_PIN 6 #define INPUT_KEY_PORT GPIOC #define INPUT_KEY_PIN 0 #define OUTPUT_ENABLE() OUTPUT_ENABLE_PORT->BSRR = 1 << OUTPUT_ENABLE_PIN #define OUTPUT_DISABLE() OUTPUT_ENABLE_PORT->BRR = 1 << OUTPUT_ENABLE_PIN void hw_io_pin_init(void) { int in_size = sizeof(io_input_map) / sizeof(io_pin_t); int out_size = sizeof(io_output_map) / sizeof(io_pin_t); if (IO_PIN_INPUT_NUMBER != in_size || IO_PIN_OUTPUT_NUMBER != out_size) { while (1) {} } int i = 0; for (i = 0; i < in_size; i++) { RCC->APB2ENR |= 0x04 << (((uint32_t)(io_input_map[i].gpio) - GPIOA_BASE) / 0x400); GPIO_Set(io_input_map[i].gpio, 1 << io_input_map[i].pin, GPIO_MODE_IPU, GPIO_SPEED_50M, io_input_map[i].pupd); } for (i = 0; i < out_size; i++) { RCC->APB2ENR |= 0x04 << (((uint32_t)(io_output_map[i].gpio) - GPIOA_BASE) / 0x400); io_output_map[i].pin = 1 << io_output_map[i].pin; GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin, GPIO_MODE_OUT_PP, GPIO_SPEED_50M, io_output_map[i].pupd); if (io_output_map[i].level) { io_output_map[i].gpio->BRR = io_output_map[i].pin; } else { io_output_map[i].gpio->BSRR = io_output_map[i].pin; } } { RCC->APB2ENR |= 0x04 << (((uint32_t)(OUTPUT_ENABLE_PORT)-GPIOA_BASE) / 0x400); GPIO_Set(OUTPUT_ENABLE_PORT, 1 << OUTPUT_ENABLE_PIN, GPIO_MODE_OUT_PP, GPIO_SPEED_50M, GPIO_PUPD_NONE); OUTPUT_ENABLE(); } /* { RCC->APB2ENR |= 0x04 << (((uint32_t)(INPUT_KEY_PORT)-GPIOA_BASE) / 0x400); GPIO_Set(INPUT_KEY_PORT, 1 << INPUT_KEY_PIN, GPIO_MODE_IN_FLOATING, GPIO_SPEED_50M, GPIO_PUPD_NONE); }*/ //关闭JTGA调试口 GPIO_Remap_Set(GPIO_Remap_SWJ_JTAGDisable, 1); } /** * 输入电平 * * @author lxz * * @param index * @param sta */ void hw_io_pin_output(unsigned short index, int sta) { if (index < IO_PIN_OUTPUT_NUMBER) { if (sta) { if (io_output_map[index].level) { io_output_map[index].gpio->BSRR = io_output_map[index].pin; } else { io_output_map[index].gpio->BRR = io_output_map[index].pin; } } else { if (io_output_map[index].level) { io_output_map[index].gpio->BRR = io_output_map[index].pin; } else { io_output_map[index].gpio->BSRR = io_output_map[index].pin; } } } } /** * 输出电平 * * @author lxz * * @param index * * @return int */ int hw_io_pin_input(unsigned short index) { if (index < IO_PIN_INPUT_NUMBER) { return ((io_input_map[index].gpio->IDR >> io_input_map[index].pin) & 0x01) == (io_input_map[index].level); } return 0; } /** * 输出使能 * * @author lxz (2019/5/29/周三) */ void hw_io_output_enable(void) { OUTPUT_ENABLE(); } /** * 输出禁止 * * @author lxz (2019/5/29/周三) */ void hw_io_output_disable(void) { OUTPUT_DISABLE(); } /** * 关闭所有的IO输出 * * @author lxz (2019/5/30/周四) * * @param void */ void hw_io_close_all(void) { int in_size = sizeof(io_input_map) / sizeof(io_pin_t); int out_size = sizeof(io_output_map) / sizeof(io_pin_t); if (IO_PIN_INPUT_NUMBER != in_size || IO_PIN_OUTPUT_NUMBER != out_size) { while (1) {} } //ֹ OUTPUT_DISABLE(); int i = 0; // for (i = 0; i < in_size; i++) { GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin, GPIO_MODE_IPD, GPIO_SPEED_50M, GPIO_PUPD_NONE); RCC->APB2ENR &= ~(0x04 << (((uint32_t)(io_input_map[i].gpio) - GPIOA_BASE) / 0x400)); } //л for (i = 0; i < out_size; i++) { GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin, GPIO_MODE_IPD, GPIO_SPEED_50M, GPIO_PUPD_NONE); RCC->APB2ENR &= ~(0x04 << (((uint32_t)(io_output_map[i].gpio) - GPIOA_BASE) / 0x400)); } }