Перейти к содержанию
    

STM32CubeMX не генерирует инициализацию GPIO?

Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает?

Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main?

Добавка.

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

 

Но пока не смотрела.

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

А таймера в HAL_TIM_Base_MspInit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main?

Добавка.

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

 

 

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

А таймера в HAL_TIM_Base_MspInit

Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).

Вопрос снят

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

EXTI - так там это называется для старта АЦП, например... Но, как знать..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто знает, что означает GPIO_MODE_EVT_RISING?

 

Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении.

EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы где это макроопределение взяли? Такое ощущение что пропущен 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd).

Вопрос снят

Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной

/* USER CODE BEGIN 3 */

....

/* USER CODE END 3 */

убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"

:smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/*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 - режим на вход или выход

 

Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной

/* USER CODE BEGIN 3 */

....

/* USER CODE END 3 */

убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"

:smile3046:

 

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

Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной

убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{"

:smile3046:

Оптимизирует? :-)

А может - баги починяет? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего тогда не понимаю из вашей программы.

Я этим не пользуюсь... Что там он пишет...

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

Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка

 

Если галка не стоит - все затирается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего тогда не понимаю из вашей программы. Получается у вас на всех этих ножках висят прерывания/события? По хорошему акселерометр вешается на 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"

Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка

Галка стоит!

Так выглядит код до ре-генерации:

  /* 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 */

А так после ре-генерации:

  /* 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
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...