TolikG 0 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Пытаюсь освоить CubeMX, до этого использовал MicroXplorer для конфигурации GPIO. Делаю все как написано в UM1718. Простейший пример с миганием светодиодом выполнил успешно. Второй пример FATFS+SD не получается - не генерируется код инициализации ножек подключенных к SDIO. Если не включать периферию SDIO, а просто назначить соответствующим ногам альтернативную функцию SDIO - код генерируется. Версия CubeMX4.7.0. Оно вообще работает? Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main? Добавка. Вот в main не прописаны ножки с выходом от таймера (ШИМ) и от ЦАП. Но все работает. Подозреваю, что если ножка не альтернативная, то она инициализируется в драйвере таймера и ЦАПа. Но пока не смотрела. Но пока не смотрела. Вот посмотрела - ножка ЦАП инициализируется в HAL_DAC_MspInit. А таймера в HAL_TIM_Base_MspInit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TolikG 0 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Тоже недавно заметили (после обновления), но пока не копали. Еще зависит от процессора. Даже из одного семейства. Может засовывает не в main? Добавка. Вот в main не прописаны ножки с выходом от таймера (ШИМ) и от ЦАП. Но все работает. Подозреваю, что если ножка не альтернативная, то она инициализируется в драйвере таймера и ЦАПа. Но пока не смотрела. Вот посмотрела - ножка ЦАП инициализируется в HAL_DAC_MspInit. А таймера в HAL_TIM_Base_MspInit Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd). Вопрос снят Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба А кто знает, что означает GPIO_MODE_EVT_RISING? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Может, что-то типа генерации прерывания по нарастающему фронту сигнала? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Может, что-то типа генерации прерывания по нарастающему фронту сигнала? EXTI - так там это называется для старта АЦП, например... Но, как знать.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topkin 0 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба А кто знает, что означает GPIO_MODE_EVT_RISING? Вы где это макроопределение взяли? Такое ощущение что пропущен EXTI в этом определении. EVT - событие, т.е. выставляется некий флаг при наступлении события без вызова обработчика прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 30 марта, 2015 Опубликовано 30 марта, 2015 · Жалоба Вы где это макроопределение взяли? Такое ощущение что пропущен 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 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Да действительно инициализируется в HAL_SD_MspInit(SD_HandleTypeDef* hsd). Вопрос снят Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной /* USER CODE BEGIN 3 */ .... /* USER CODE END 3 */ убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{" :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topkin 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба /*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" Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Заметил неприятную штуку - генератор кода портит написанный мною текст в секции, обозначенной убирает фигурные скобки в конструкциях "if(...){" и строчки "}else{" :smile3046: Оптимизирует? :-) А может - баги починяет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Ничего тогда не понимаю из вашей программы. Я этим не пользуюсь... Что там он пишет... Как раз в данных полях куб не должен портить код из функции main. Проверьте в свойствах проекта - Project - Project Settings - Code Generator - "Keep User Code when re-generting" Если она стоит, то Куб не будет портить код в комментариях, как вы привели. У вас скорее всего не стоит галка Если галка не стоит - все затирается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TolikG 0 1 апреля, 2015 Опубликовано 1 апреля, 2015 (изменено) · Жалоба Ничего тогда не понимаю из вашей программы. Получается у вас на всех этих ножках висят прерывания/события? По хорошему акселерометр вешается на 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 */ Изменено 1 апреля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться