Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32CubeMX не генерирует инициализацию GPIO?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
TolikG
Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает?
Tanya
Цитата(TolikG @ Mar 30 2015, 13:12) *
Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает?

Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main?
Добавка.
Вот в main не прописаны ножки с выходом от таймера (ШИМ) и от ЦАП. Но все работает. Подозреваю, что если ножка не альтернативная, то она инициализируется в драйвере таймера и ЦАПа. Но пока не смотрела.

Цитата(Tanya @ Mar 30 2015, 13:32) *
Но пока не смотрела.

Вот посмотрела - ножка ЦАП инициализируется в HAL_DAC_MspInit.
А таймера в HAL_TIM_Base_MspInit
TolikG
Цитата(Tanya @ Mar 30 2015, 14:29) *
Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main?
Добавка.
Вот в main не прописаны ножки с выходом от таймера (ШИМ) и от ЦАП. Но все работает. Подозреваю, что если ножка не альтернативная, то она инициализируется в драйвере таймера и ЦАПа. Но пока не смотрела.


Вот посмотрела - ножка ЦАП инициализируется в HAL_DAC_MspInit.
А таймера в HAL_TIM_Base_MspInit

Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).
Вопрос снят
Tanya
А кто знает, что означает GPIO_MODE_EVT_RISING?
hd44780
Может, что-то типа генерации прерывания по нарастающему фронту сигнала?
Tanya
Цитата(hd44780 @ Mar 30 2015, 15:42) *
Может, что-то типа генерации прерывания по нарастающему фронту сигнала?

EXTI - так там это называется для старта АЦП, например... Но, как знать..
topkin
Цитата(Tanya @ Mar 30 2015, 14:45) *
А кто знает, что означает GPIO_MODE_EVT_RISING?


Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении.
EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания.
Tanya
Цитата(topkin @ Mar 30 2015, 16:46) *
Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении.
EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания.

/*Configure GPIO pins : PE2 PE4 PE5 PE0
PE1 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_0
|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
К этим ножкам акселерометр приделан (stm32F3 Discovery)
Вы, наверное, правы - в КУБЕ они высвечиваются как EXTI.
TolikG
Цитата(TolikG @ Mar 30 2015, 14:34) *
Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).
Вопрос снят

Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной
/* USER CODE BEGIN 3 */
....
/* USER CODE END 3 */
убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"
smile3046.gif
topkin
Цитата(Tanya @ Mar 30 2015, 17:14) *
/*Configure GPIO pins : PE2 PE4 PE5 PE0
PE1 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_0
|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
К этим ножкам акселерометр приделан (stm32F3 Discovery)
Вы, наверное, правы - в КУБЕ они высвечиваются как EXTI.


Ничего тогда не понимаю из вашей программы. Получается у вас на всех этих ножках висят прерывания/события? По хорошему акселерометр вешается на SPI/I2C интерфейс, в данном случае конфигурироваться ножки должны как альтернативные функции. Может тут программно реализовано?
Смотрите, если в поле структуры:
GPIO_InitStruct.Mode = GPIO_MODE_EVT_xx/GPIO_MODE_IT_xxx - скорее всего настраивается внешнее прерывание или событие
GPIO_InitStruct.Mode = GPIO_MODE_AF - аналоговый режим работы порта
GPIO_InitStruct.Mode = GPIO_MODE_INPUT/GPIO_MODE_OUTPUT - режим на вход или выход

Цитата(TolikG @ Mar 31 2015, 08:23) *
Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной
/* USER CODE BEGIN 3 */
....
/* USER CODE END 3 */
убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"
smile3046.gif


Как раз в данных полях куб не должен портить код из функции main. Проверьте в свойствах проекта - Project - Project Settings - Code Generator - "Keep User Code when re-generting"
Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка
jcxz
Цитата(TolikG @ Mar 31 2015, 11:23) *
Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной
убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"
smile3046.gif

Оптимизирует? :-)
А может - баги починяет? biggrin.gif
Tanya
Цитата(topkin @ Mar 31 2015, 14:46) *
Ничего тогда не понимаю из вашей программы.

Я этим не пользуюсь... Что там он пишет...
Цитата(topkin @ Mar 31 2015, 14:46) *
Как раз в данных полях куб не должен портить код из функции main. Проверьте в свойствах проекта - Project - Project Settings - Code Generator - "Keep User Code when re-generting"
Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка


Если галка не стоит - все затирается.
TolikG
Цитата(topkin @ Mar 31 2015, 14:46) *
Ничего тогда не понимаю из вашей программы. Получается у вас на всех этих ножках висят прерывания/события? По хорошему акселерометр вешается на SPI/I2C интерфейс, в данном случае конфигурироваться ножки должны как альтернативные функции. Может тут программно реализовано?
Смотрите, если в поле структуры:
GPIO_InitStruct.Mode = GPIO_MODE_EVT_xx/GPIO_MODE_IT_xxx - скорее всего настраивается внешнее прерывание или событие
GPIO_InitStruct.Mode = GPIO_MODE_AF - аналоговый режим работы порта
GPIO_InitStruct.Mode = GPIO_MODE_INPUT/GPIO_MODE_OUTPUT - режим на вход или выход



Как раз в данных полях куб не должен портить код из функции main. Проверьте в свойствах проекта - Project - Project Settings - Code Generator - "Keep User Code when re-generting"
Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка

Галка стоит!
Так выглядит код до ре-генерации:
CODE
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOG, (GPIO_PIN_10 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_12), GPIO_PIN_SET);
if(retSD == 0)
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, GPIO_PIN_RESET);
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
if(f_mkfs((TCHAR const*)SD_Path, 0, 0) != FR_OK)
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
if(f_open(&MyFile, "Hello.txt", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);
if((byteswritten == 0) || (res != FR_OK))
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
f_close(&MyFile);
if(f_open(&MyFile, "Hello.txt", FA_READ) != FR_OK)
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
res = f_read(&MyFile, rtext, sizeof(wtext), &bytesread);
if((strcmp(rtext, wtext) !=0) || (res != FR_OK))
{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
}else{
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET);
f_close(&MyFile);
}
}
}
}
}
}
}
FATFS_UnLinkDriver(SD_Path);
while(1);
}
/* USER CODE END 3 */

А так после ре-генерации:
CODE
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOG, (GPIO_PIN_10 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_12), GPIO_PIN_SET);
if(retSD == 0)
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, GPIO_PIN_RESET);
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
if(f_mkfs((TCHAR const*)SD_Path, 0, 0) != FR_OK)
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
if(f_open(&MyFile, "Hello.txt", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);
if((byteswritten == 0) || (res != FR_OK))
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
f_close(&MyFile);
if(f_open(&MyFile, "Hello.txt", FA_READ) != FR_OK)
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
res = f_read(&MyFile, rtext, sizeof(wtext), &bytesread);
if((strcmp(rtext, wtext) !=0) || (res != FR_OK))
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
while(1);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET);
f_close(&MyFile);
}
}
}
}
}
}
}
FATFS_UnLinkDriver(SD_Path);
while(1);
}
/* USER CODE END 3 */
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.