|
|
  |
STM32CubeMX не генерирует инициализацию GPIO?, STM32CubeF4 v.1.5.0 |
|
|
|
Mar 30 2015, 11:29
|
Гуру
     
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Mar 30 2015, 11:34
|
Частый гость
 
Группа: Свой
Сообщений: 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). Вопрос снят
|
|
|
|
|
Mar 30 2015, 13:46
|
Частый гость
 
Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476

|
Цитата(Tanya @ Mar 30 2015, 14:45)  А кто знает, что означает GPIO_MODE_EVT_RISING? Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении. EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания.
|
|
|
|
|
Mar 30 2015, 14:14
|
Гуру
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Mar 31 2015, 05:23
|
Частый гость
 
Группа: Свой
Сообщений: 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{"
|
|
|
|
|
Mar 31 2015, 11:46
|
Частый гость
 
Группа: Свой
Сообщений: 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{"  Как раз в данных полях куб не должен портить код из функции main. Проверьте в свойствах проекта - Project - Project Settings - Code Generator - "Keep User Code when re-generting" Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка
|
|
|
|
|
Mar 31 2015, 12:02
|
Гуру
     
Группа: Модераторы
Сообщений: 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" Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка Если галка не стоит - все затирается.
|
|
|
|
|
Apr 1 2015, 05:28
|
Частый гость
 
Группа: Свой
Сообщений: 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] - для короткого
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|