реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32CubeMX не генерирует инициализацию GPIO?, STM32CubeF4 v.1.5.0
TolikG
сообщение Mar 30 2015, 10:12
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает?
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 30 2015, 11:29
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(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
Go to the top of the page
 
+Quote Post
TolikG
сообщение Mar 30 2015, 11:34
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



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


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

Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).
Вопрос снят
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 30 2015, 11:45
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



А кто знает, что означает GPIO_MODE_EVT_RISING?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Mar 30 2015, 12:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Может, что-то типа генерации прерывания по нарастающему фронту сигнала?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 30 2015, 13:02
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(hd44780 @ Mar 30 2015, 15:42) *
Может, что-то типа генерации прерывания по нарастающему фронту сигнала?

EXTI - так там это называется для старта АЦП, например... Но, как знать..
Go to the top of the page
 
+Quote Post
topkin
сообщение Mar 30 2015, 13:46
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



Цитата(Tanya @ Mar 30 2015, 14:45) *
А кто знает, что означает GPIO_MODE_EVT_RISING?


Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении.
EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 30 2015, 14:14
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(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.
Go to the top of the page
 
+Quote Post
TolikG
сообщение Mar 31 2015, 05:23
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Цитата(TolikG @ Mar 30 2015, 14:34) *
Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).
Вопрос снят

Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной
/* USER CODE BEGIN 3 */
....
/* USER CODE END 3 */
убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"
smile3046.gif
Go to the top of the page
 
+Quote Post
topkin
сообщение Mar 31 2015, 11:46
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



Цитата(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"
Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 31 2015, 11:53
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Оптимизирует? :-)
А может - баги починяет? biggrin.gif
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 31 2015, 12:02
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(topkin @ Mar 31 2015, 14:46) *
Ничего тогда не понимаю из вашей программы.

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


Если галка не стоит - все затирается.
Go to the top of the page
 
+Quote Post
TolikG
сообщение Apr 1 2015, 05:28
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Цитата(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 */


Сообщение отредактировал IgorKossak - Apr 1 2015, 09:24
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 04:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016