123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #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] = {
- { GPIOC, 13, 1, GPIO_PUPD_PU},//0
- { GPIOE, 3, 1, GPIO_PUPD_PU},
- { GPIOE, 2, 1, GPIO_PUPD_PU},
- { GPIOE, 1, 1, GPIO_PUPD_PU},
- { GPIOE, 0, 1, GPIO_PUPD_PU},
- { GPIOB, 7, 1, GPIO_PUPD_PU},
- { GPIOB, 6, 1, GPIO_PUPD_PU},
- { GPIOB, 5, 1, GPIO_PUPD_PU},//7
- { GPIOB, 4, 1, GPIO_PUPD_PU},//10
- { GPIOD, 7, 1, GPIO_PUPD_PU},
- { GPIOD, 4, 1, GPIO_PUPD_PU},
- { GPIOD, 3, 1, GPIO_PUPD_PU},
- { GPIOD, 2, 1, GPIO_PUPD_PU},
- { GPIOD, 1, 1, GPIO_PUPD_PU},//15
- { GPIOD, 13, 1, GPIO_PUPD_PU},//16
- { GPIOD, 12, 1, GPIO_PUPD_PU},//17
- { GPIOD, 0, 1, GPIO_PUPD_PU},//20
- };
- static io_pin_t io_output_map[IO_PIN_OUTPUT_NUMBER] = {
- { GPIOC, 2, 0, GPIO_PUPD_PU},//00
- { GPIOC, 3, 0, GPIO_PUPD_PU},
- { GPIOA, 0, 0, GPIO_PUPD_PU},
- { GPIOA, 2, 0, GPIO_PUPD_PU},
- { GPIOA, 4, 0, GPIO_PUPD_PU},
- { GPIOA, 5, 0, GPIO_PUPD_PU},
- { GPIOA, 6, 0, GPIO_PUPD_PU},
- { GPIOA, 7, 0, GPIO_PUPD_PU},//07
- { GPIOC, 4, 0, GPIO_PUPD_PU},//10
- { GPIOC, 5, 0, GPIO_PUPD_PU},//11
- { GPIOB, 0, 0, GPIO_PUPD_PU},//12
- { GPIOB, 1, 0, GPIO_PUPD_PU},//13
- { GPIOC, 11, 0, GPIO_PUPD_PU},//14
- { GPIOC, 10, 0, GPIO_PUPD_PU},//15
- // { GPIOC, 9, 0, GPIO_PUPD_PU},//31
- // { GPIOA, 8, 0, GPIO_PUPD_PU},//33
- };
- #define OUTPUT_ENABLE_PORT GPIOE
- #define OUTPUT_ENABLE_PIN 5
- #define INPUT_KEY_PORT GPIOD
- #define INPUT_KEY_PIN 8
- #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));
- }
- }
|