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

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Конфигурация сделана в кубе, и он сам уже ноги для I2C переводит в альтернативную функцию, при инициализации I2C в кубе.

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

чудеса прям какие то. И дефайн не пашет и шина ни в какую.

Не помню чтобы у меня были какие то проблемы с i2c на сотке. Код точно такой же весь. Проблема где-то в другом месте

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ну не знаю, может у меня IAR более новый). А кто - нибудь цеплял 1602 по I2C через переходник на PCF8574AT без библиотек, код инициализации у кого какой? Хотя я уже разный пробовал, даже с библиотечной ардуины брал код инициализации дисплея, меня вот волнует больше то что пишут в нете что  в HAL нужно адрес сдвинуть, но я находил чисто побитовый сдвиг у некоторых в коде, а в других местах читал что нужно учесть сдвиг адреса, так как там семибитная адресация, а восьмой бит задает режим чтение - запись, ну вот у меня сканер на ардуино показал адрес 0x3F, я его и вбиваю, может нужно его меньше задать, хотя ну 0x3F всего 6 бит.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Делаю все тоже самое на I2C тоже самое, ничего не работает, что за приколы, к ардуино дисплей цепляю, и пачки импульсов на шинах есть и все нормально.

Может проблема в том что IAR ломаный?

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Сколько читаю у всех проблемы с I2C на STM32, возможно он вообще не работает, придется наверно по SPI 1602 включать через сдвиговый регистр, так как по 4 или 8 битному режиму не хотелось бы чтобы пины зря не тратить. Кто как подключает 1602 к STM32?

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

за адрес возможно верно говорят. Я помню с адресами этими был какой то заплет. Но одна пачка как минимум должна вылетать, хотя заметить ее не просто. Если адрес не тот, то проц после адреса повиснет на ожидании ACK и закончит процедуру по таймауту. Попробуй посмотреть - вылетает первый пакет или нет, если ослик конечно позволяет. Я по I2C много чего подключал и все работало. В том числе и дисплей 1602. Правда он без переходника был, а просто SOC с нативным I2C

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Ну сейчас пересобрал в кубе, оставил только I2C и смотрю осциллом на линии данных стоит лог. 1 потом  раз и провал, и так раз в 4 секунды, я прописал в main выводить два слова каждое слово по 2 секунды, но дисплей не инициализируется, может не так инициализацию делаю, да и не понятно вроде теперь i2c работает но провла с лог. 1 в ноль просиходит очень медленно. на ардуино когда все работает там изначально пачки импульсов что на шине тактирования что на линии данных осциллом видно, а тут на линии тактирования ничего не видно, только на линии данных этот провал виде и то раз в 4 секунды. Ну его в баню, с этим I2c никогда он мне не нравился, и я всегда пользовался библиотеками для него. Тут нужен и отладчик, и логический анализатор, и не понятно с инициализацией, придется либо кидать по 4-х битной шине 1602 либо по SPI.

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Нашел вот ссылку по адресации в HAL, указано что при передачи младший бит адреса должен быть 0, следовательно у меня адрес сканером в ардуино показывает 0x3F, значить адрес у меня в режиме передачи данных должен быть такой 1111110 или 0x7E, но какой не пробую I2C не работает, при этом использую переходник сейчас просто для включения - выключения определенных выводов переходника, переходник на PCF8574AT, задаю всю шину PCF8574 в 0, а на выходе ничего не меняется часть выходов переходника в лог.1 часть в лог. 0, так что или I2C не работает, или адресую не правильно.

 

Вот еще:

Адрес микросхемы формируется из состояния выводов A0, А1, А2. Для микросхемы PCF8574 адрес будет: 0100A0A1A2. (Например у нас A0, А1, А2 имеют высокий уровень, соответственно адрес нашей микросхемы будет 0b0100111 = 0x27). Для PCF8574A — 0111A0A1A2, что с нашей схемой подключения даст адрес 0b0111111 = 0x3F. Если, допустим A2 соединить с землей, то адрес для PCF8574A будет 0x3B. Итого на одну шину i2c можно одновременно повесить 16 микросхем, по 8 PCF8574A и PCF8574.

Вот код

Скрытый текст


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
   uint8_t com;
 //com=0x00;
 HAL_I2C_Master_Transmit(&hi2c1,0x7E,0x00,1,100);
 HAL_Delay(20000);
  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* I2C1 init function */
static void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);

  /*Configure GPIO pins : PB3 PB4 */
  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Очень странная ситуация. Кроме неправильных настроек ничего толком быть не может (ну разве что камень битый). Или выводы перепутаны (вместо дефолтных на альтернативные).

Неплохо бы было глянуть что в SR регистрах I2C после передачи за флаги. Может они что прояснят. 

Вообще, вряд ли тут в адресе дело, раз шина вообще молчит.

Небольшое добавление по коду. 

А контроллер вообще стартует-то? Судя по настройкам на него внешний тактовый сигнал должен поступать, с кварцем работать не будет.

 

Изменено пользователем Вуйко
Ссылка на комментарий
Поделиться на другие сайты

Вуйко спасибо, не заметил на счет тактирования, просто два дня подряд потратил на это дело, и уже голова не варила последний раз когда в кубе сконфигурировал, дисплей заработал, проблема была в адресации, действительно нужен сдвиг адреса, в этом вся проблема, ох и HAL и STM.

mail_robot спасибо за помощь.

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

Вопрос такой, у меня такая платка https://arduino-ua.com/prod1328-plata-razrabotchika-stm32f103c8t6-arm-stm32-minimalnaya-konfigyraciya и для отладчика контакты не выедены, отладчик если ST-Link возьму такой   https://arduino-ua.com/prod920-programmator-st-link-v2-stlink-mini, смогу ли я его подключить к этой плате, меня интересует на данном 48 ногом исполнении этого проца есть пины куда можно подпаять контакты отладчика? И вообще как работать с отладчиком в IAR, там я находил вроде есть в настройках симуляция и можно выбрать ST-Link, там настроить и потом включить в IARtogle breakpoint и пойдет отладка? 

И еще вопросик, кто какими цветными дисплеями пользуется с STM32? Именно интересует недорогие хорошие дисплеи, думаю такой взять https://arduino-ua.com/prod1539-2-4-tft-lcd-spi-displei

Раньше в ардуино работал с дисплеями 3,95  дюйма на ili9488(16бит), ili9327(8бит), но это библиотеки там были, на прямую не знаю как с ними общаться да и проц нужен с количеством ног побольше, думаю лучший вариант для STM брать дисплеи SPI, так как с нокией 3310 дисплеем я уже работал, и там отличия будут небольшие, для другого дисплея.

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

набор плата + отладчик работать будут. Контакты под отладчик там прям с торца выведены (торчат лежа). Это кстати самый стандартный минимальный набор

Отладчик иаром сам подхватится, главное дрова поставить не криво и свежие.

Дисплей тоже норм. Пользовался таким, никаких сложностей

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

 

5 часов назад, mail_robot сказал:

набор плата + отладчик работать будут. Контакты под отладчик там прям с торца выведены (торчат лежа). Это кстати самый стандартный минимальный набор

Отладчик иаром сам подхватится, главное дрова поставить не криво и свежие.

Дисплей тоже норм. Пользовался таким, никаких сложностей

А дисплей на этом ili9341 вы использовали с шиной на 8 или 16 бит, а управление по SPI, просто в этой статье такой https://hubstub.ru/display/125-inicializaciya-tft-displeya-na-primere-ili9341-dlya-avr.html

Или Вы использовали дисплей на ili9341 где дынные и управление  передаются по SPI, как на этом дисплее https://arduino-ua.com/prod1539-2-4-tft-lcd-spi-displei

И еще вопрос я так понимаю дисплеи которые идут с отдельной шиной данных и управлением по SPI немного тяжелее в управлении чем чисто дисплей по SPI, но те которые с шиной данных и чем больше шина тем быстрее отображение инфы идет на дисплей, и они будут быстрее чем чисто дисплей управляемый и передающий данные по SPI?

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

возможно будут быстрее. Это я не пробовал. У меня был просто SPI дисплей. Скорость была порядка 14 кадров в секунду на максимуме с использованием ДМА. В реальной жизни вполне хватает 10 кадров с большим запасом, так как для кино этот дисплей не используется. А при использовании его в качестве приборного отрисовываются только кусочки (фрэймбуферы или поля) куда меньшего размера чем кадр, поэтому на глаз вообще все шустро и плавно. Так что ИМХО - параллельная шина ни к чему, если под рукой STM + код написан не рукожопом и имеет как минимум механизмы оптимизации под растровый дисплей

О частоте кадров. Это чисто тестовый показатель, который измерялся мной для проверки максимально возможной скорости работы связки контроллер + дисплей. При этом скорость самой шины ушла далеко за паспортные 3,5 мегагерца и запросто достигла 12 МГц. Но шлейф был "расческа" (данные перемежались с нулями, типа экранировки). Смотрел как скорость, так и кто из двоих в итоге станет бутылочным горлом. Дисплей оказался тормознутее контроллера. За 12-ю мегагерцами уже начинались глюки и артефакты. Но это по передаче данных. При формировании данных система примерно выравнивается, так как требуется некоторое время на подготовку данных. Но при использовании кольцевого чар-буфера в принципе поток практически 100% времени может быть непрерывным, потому как проц с небольшим запасом укладывается в цикл ДМА

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Ну у меня дисплей от nokia5510 работает на 9МГц. Правда я прописал функцию осциллографа как функцию записи массива размером 504, а потом вывожу это на дисплей, и сделал задержку частоты развертки, но при 16кГц, дисплей уже рисует синусоиду, разрывными пикселями, наверно я не правильно вывожу это все.

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

ну искусство программирования в общем то и заключается в том, чтобы найти остроумное и экономное к ресурсам решение, выполняющее требуемую задачу. Написать программу может практически каждый. Написать элегантно - единицы. Нужно просто много опята и база знаний прикладной математики, комбинаторики и фундаментальных алгоритмов. Ну и знание железа конечно же. Все это приходит не сразу и не вдруг. Это достаточно тяжелый труд каждодневного дисциплинированного самообразования

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Вопрос от чайника. Имеется STM32F0XXX и TFT дисплей с контроллером IL9341 SPI. CUBE + KEIL 

Чтобы работать с этим дисплеем нужно с 0 создавать все функции или есть какие-нибудь библиотеки?

Чутьё подсказывает, что должно быть, но поиск хороших результатов не дал.. :( 

Нашел только скомпонованные проекты на STM32F4, STM32F1.. 

Пока научился только мигать подсветкой.. :)

 

Изменено пользователем Alex Falcon
Ссылка на комментарий
Поделиться на другие сайты

у меня есть, но я кажется уже давал ее в составе проекта на свою нагрузку

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

для HAL разве есть разница? Код с сотки на ноль и обратно портируется без изменений. Исключения составляют только блоки RTC, I2C и DMA. Но там тоже настолько все мелко. У F0 там просто больше опций в концигурации блоков, так как они современнее и более развиты местами. Вообще думаю что F0 это очень кастрированный спецом нишевый продукт. Который как бы может, но не должен. И вообще они мне нравятся. Из всей линейки STM считаю их самыми удачными

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Ура! У меня получилось заливать экран разными цветами через DMA. 

Теперь шрифты - при попытке напечатать хоть один символ вылетыют ошибки компиляции типа: "No space in execution regions with .ANY selector..."

Как я понял - недостаточно памяти.. :(  Или я чего-то упустил, как думаете?

Изменено пользователем Alex Falcon
Ссылка на комментарий
Поделиться на другие сайты

видимо да. У меня там выделен конский символьный буфер, который поддерживает очень большие символы. Мне был нужен и проц позволял (STM32F103VCT6). Вам надо просто размер буфера подрезать в соответствии со своим ОЗУ

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Скорректировал процедуру вывода символа, в DMA отправляется теперь построчно, соответсвенно буфера сократились до 140 (вроде правильно посчитал?) байт и вывод пошел обоими шрифтами! :) 

Правда чуть-чуть помедленнее, но не критично. УРА!

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

ну там можно подпилить функцию отправки символа так, чтобы памяти меньше расходовать. Можно буфер разбить на 3-4 части. Его смысл в том, чтобы отправка была максимально быстрой. Пока DMA отправляет один буфер, во втором готовится битовая картинка очередного символа. Так обеспечивается непрерывность передачи и максимальная скорость использования канала данных. В принципе и на одном буфере работало нормально, это я уже запижонил и сделал два буфера. Ресурсы позволяли. Переделай на один и ничего страшного не будет

Размер буфера считается просто - берем самый крупный символ (обычно процент), умножаем его размер в битах на два, прибавляем пустые пиксели с краю (сколько то умножить на высоту) тоже по два байта на пиксель. И все. Выходит размер. Считается по два байта на каждый пиксель

Шрифты кстати я сам делал из стандартных с корректировкой руками. Он не моноширинный и поэтому буковки выходят красивые. Но пришлось поизголяться над расчетом адаптивных пробелов и добавлением пустых пикселей к узким символам, чтобы при обновлении символьные строки не скакали вдоль экрана. Процедура знакогенератора получилась алес капут. Неделю шлифовал

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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