И снова я... В общем такой вопрос: пишу либу под TM1638 и благодаря вашей помощи в целом все получилось. Почти всё. Остался вопрос с чтением состояния кнопок. Как это сделать знаю. Однако есть нюанс, а именно нужно переключать пин который отвечает за линию DIO то как вход с подтяжкой к плюсу, то как push-pull выход. И как это сделать тоже знаю. Проблема заключается в следующем, как мне передать сам GPIO в мою библиотеку? В данный момент функция инициализации выглядит так: void TM1638::TMInit(uint16_t CLK_PIN, uint16_t STB_PIN, uint16_t DIO_PIN); А нужно поправить её таким образом, что бы указывался еще и сам порт GPIO, по типу void TM1638::TMInit( ?GPIO? port, uint16_t CLK_PIN, uint16_t STB_PIN, uint16_t DIO_PIN); И помимо этого, внутри моей библиотеки нужна глобальная переменная с значением порта и что бы изнутри библиотеки я мог обратится к методам HAL что бы иметь возможность изменить назначение вход/выход нужного пина. Т.е по сути нужно как-то вызывать GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); Подскажите с реализацией...
Комментарии: 18
Anonim
Посмотри как устроена та же функция HAL_GPIO_TogglePin HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
Aleksandr
Вот да, нашел такую штуку, но получаю error: 'GPIO_TypeDef' has not been declared Окей, но в инклуде я добавил stm32f1xx_hal_gpio.h и в этом файле содержится typedef struct { uint32_t Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ uint32_t Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIO_mode_define */ uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. This parameter can be a value of @ref GPIO_pull_define */ uint32_t Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIO_speed_define */ } GPIO_InitTypeDef; Вот только почему эта структура не видится со стороны моей библиотеки я не понимаю. Вчера тоже уже так делал и никакого эфекта.
Anonim
инкуд где?
Aleksandr
в TM1683.cpp
Anonim
Попробуй: 1) "stm32f4xx_hal.h" 2) инклудить в TM1683.h
Aleksandr
И так я тоже уже пробовал. Получаю >30 ошибок
Anonim
тьфу extern "C" { "stm32f4xx_hal.h" }
Aleksandr
О, спасибо! А можно пояснение, с чем я столкнулся и почему эта строка исправляет проблему?
Anonim
С различием стандартов Си и Си плюс плюс Скорее всего extern "C" { #include "stm32f1xx_hal_gpio.h" } тоже нормально заработает
Aleksandr
Да, я так и написал. Теперь возникла такая ерунда: error: cannot convert 'GPIO_TypeDef' to 'GPIO_TypeDef*' for argument '1' to 'void HAL_GPIO_Init(GPIO_TypeDef*, GPIO_InitTypeDef*)' HAL_GPIO_Init(TM_PORT, &GPIO_InitStruct); Без амперсанда выдает такую ошибку. Вписываю амперасанд и проект собирается, но не работает.
Kaktys
как определил TM_PORT ?
Aleksandr
GPIO_TypeDef TM_PORT;
Kaktys
ну так само собой - оно хочет GPIO_TypeDef*, потому и надо HAL_GPIO_Init(&TM_PORT, &GPIO_InitStruct); А в сам TM_PORT что то прописал, инициализировал ?
Aleksandr
инициализирую переменную в функции TMInit. TM_PORT = *GPIOx;
Kaktys
ты код кусочками даешь
Aleksandr
void TM1638::TMInit(GPIO_TypeDef *GPIOx, uint16_t CLK_PIN, uint16_t STB_PIN, uint16_t DIO_PIN){ STB = STB_PIN; CLK = CLK_PIN; DIO = DIO_PIN; TM_PORT = *GPIOx; GPIO_InitTypeDef GPIO_InitStruct; /*Configure GPIO pins : TM_DIO_Pin TM_CLK_Pin TM_STB_Pin */ HAL_GPIO_WritePin(&TM_PORT, DIO|CLK|STB, GPIO_PIN_RESET); GPIO_InitStruct.Pin = DIO |CLK|STB; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(TM_PORT, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, STB, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, CLK, GPIO_PIN_SET); sendCommand(0x40); sendCommand(0x80 | (1 ? 8 : 0) | 7); HAL_GPIO_WritePin(GPIOB, STB, GPIO_PIN_RESET); send(0xC0); for (int i = 0; i < 16; i++) send(0x00); HAL_GPIO_WritePin(GPIOB, STB, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, STB, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, CLK, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, CLK, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, STB, GPIO_PIN_SET); }
Kaktys
выведи в дебаг что у теюя внутри TM_PORT получается
Aleksandr
Если я правильно всё понял, то самого адреса GPIO нет Всё, разобрался. Объявил не правильно. Надо было GPIO_TypeDef *TM_PORT; а я написал GPIO_TypeDef TM_PORT; И адрес самого GPIO передавался. Теперь появился адрес и всё заработало. Спасибо за нааводку =)