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

STM32 для чайника


ART_ME

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

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

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

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

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

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

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

При настройке портов, которые используются НЕ как обычные цифровые, заглядывайте в мануал, где, начиная с раздела 9.1.11, описывают, как настраивать конкретный порт для работы в качестве периферийного вывода (усарт, спи, и2ц и пр.). Там кучка табличек на всю периферию.

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

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

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

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

Да думаю что эта плата, спасибо, брал самую дешевую стоит 78грн(160руб.), чисто для пробы так как думал что будет еще сложнее, но с HALom и с помощью форума, довольно быстро все начало работать, теперь не много регистров поковыряю, лишние не будут).

 

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

С горем пополам запустил один инжекторный канал, теперь не могу понять как задать 2 канала, и назначить их на определенные выводы, в нете нашел вот так вот но тут один канал назначен,ADC1->JSQR |= (1<<15); //Задаем номер канала (выбран ADC1, вход 1)  так работает, но это для одного канала, но включаю режим SCAN и прописываю вот так вот ADC1->JSQR |= (1<<15); ADC1->JSQR |= (1<<14);, тогда измерения по двум каналам не корректны, подаю 3,27В показывает 1,3В, при этом второй канал тоже повышает данные. И кстати странно, то что делитель частоты для АЦП не прописал, и работает).

 

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

Столкнулся с проблемой такой что не могу регистрами настроить SPI, к нему у меня подключен дисплей Nokia3310, при инициализации HALom все работает.

Вот инициализация HAL

/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

А вот так вот я прописываю

void SPIinit(){ 
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//включаем тактирование GPIO
    GPIOA->CRL |= (GPIO_CRL_CNF7_1 | GPIO_CRL_MODE7_1| GPIO_CRL_MODE7_0);// альтернативная функция
GPIOA->CRL &= ~GPIO_CRL_CNF7_0;// 7 пин MOSI

RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;  
SPI1->CR1 |= SPI_CR1_BIDIMODE;// однопроводной режим
  SPI1->CR1 |=  SPI_CR1_BIDIOE; //только передача данных

    SPI1->CR1 |=SPI_CR1_CPOL;//     
  SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;// включил, так как GPIOA4 использую как вывод и сам его выставляю в 1 или 0 при передаче данных
  SPI1->CR1 |=  SPI_CR1_BR_2;//делитель на 32, частота 72МГц=2,25МГц
   SPI1->CR1 &= ~SPI_CR1_BR_1|SPI_CR1_BR_0; 
   
  SPI2->CR1 &= ~SPI_CR1_LSBFIRST;         //MSB will be first, старший бит первый
   SPI1->CR1 |=  SPI_CR1_MSTR;//режим мастера
    SPI1->CR1 |=  SPI_CR1_SPE;//включаем модуль SPI
}

Вроде одно и тоже, может что не включил? Причем отладчиком посмотрел регистры, вроде все выставляется, не пойму что не так

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

Сейчас смотреть времени нет, отлучаюсь, а пока посмотрите мой вариант.

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

void spi1set(void)
{
// SPI1 setup  
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
// APB2 clock 12MHz, Fpclk/4 (BR0), Fpclk/8 (BR1)
  SPI1->CR1 = SPI_CR1_BR_0;                             
  SPI1->CR1 |= (SPI_CR1_SSM | SPI_CR1_SSI);             // Автоматическое управление выводом NSS.
  SPI1->CR2 |= SPI_CR2_SSOE;                            // Разрешение выхода NSS.
// Master mode, CPOL = 0, CPHA = 0.
  SPI1->CR1 |= SPI_CR1_MSTR;
// CPOL = 1, CPHA = 1.
//  SPI1->CR1 |= (SPI_CR1_CPOL | SPI_CR1_CPHA);
}

void lcd_port(void)
{
// SPI1 pins config
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Port clock on
  // PA2 - RST, PA3 - DC (push-pull, 10MHz).
  GPIOA->CRL &= ~(GPIO_CRL_CNF2 | GPIO_CRL_CNF3 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_1);
  GPIOA->CRL |= (GPIO_CRL_MODE2_0 | GPIO_CRL_MODE3_0);
  // PA4 - ENA (push-pull, 10MHz).
//  GPIOA->CRL &= ~(GPIO_CRL_CNF4 | GPIO_CRL_MODE4_1);
//  GPIOA->CRL |= GPIO_CRL_MODE4_0;
  // PA11 - LCD_PWR (push-pull, 10MHz).
  GPIOA->CRH &= ~(GPIO_CRH_CNF11 | GPIO_CRH_MODE11_1);
  GPIOA->CRH |= GPIO_CRH_MODE11_0;
  lcd_pwr = 0;
// SPI pins
  GPIOA->CRL &= ~(GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1);
  GPIOA->CRL |= (GPIO_CRL_CNF4_1 | GPIO_CRL_MODE4_0);  // SPI1_NSS - PA4, Alt.Fun. push-pull (CNF 10) 10 MHz (Mode 01)
  GPIOA->CRL &= ~(GPIO_CRL_CNF5_0 | GPIO_CRL_MODE5_1);
  GPIOA->CRL |= (GPIO_CRL_CNF5_1 | GPIO_CRL_MODE5_0);  // SPI1_SCK - PA5, Alt.Fun. push-pull (CNF 10) 10 MHz (Mode 01)
  GPIOA->CRL &= ~(GPIO_CRL_CNF7_0 | GPIO_CRL_MODE7_1);
  GPIOA->CRL |= (GPIO_CRL_CNF7_1 | GPIO_CRL_MODE7_0);  // SPI1_MOSI - PA7, Alt.Fun. push-pull (CNF 10) 10 MHz (Mode 01)
//  GPIOA->CRL &= ~(GPIO_CRL_CNF6_0 | GPIO_CRL_MODE6);
//  GPIOA->CRL |= GPIO_CRL_CNF6_1;                      // SPI1_MISO - PA6, Input pull-up
//  GPIOA->ODR |= GPIO_ODR_ODR6;                        // Pull-up
}

 

Вот только не помню как у меня там с управлением SS, недосуг вспоминать.

 

А где остальные пины? Почему их не настроили?

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

28 минут назад, Электронщик сказал:

Вот кстати новость

я уже пробовал эту новость. Пока не совсем ясно что ребята из STM имели в виду, но одно точно можно сказать - функции инитки обозначенные как LL здорово экономят память. Хотя ее и раньше хватало всегда...

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

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

Цитата

А где остальные пины? Почему их не настроили?

Они HALom настроены, я чтобы по быстрому, оставил все, только инициализацию SPI и передачу данных по SPI использую регистрами

Zhuk72 а где у вас включение SPI модуля находится?

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

И еще одно - при генерации LL инитки не создается HAL-дескриптор. А значит функции HAL к этому модулю уже не получится пришурупить. Только LL программирование

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

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

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

Я даже без понятия что и где этот LL как сгенерить его, и как работать, я так понял это что-то между HALom и регистрами по производительности и трудозатратам?

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

в настройках проекта можно выбрать тип генерируемого кода. Но мне пока не ясно как со всем этим "богатством" быть и где применять. Так как синтаксис отличен от привычного SPL

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

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

Получилось сделать один регулярный канал, с ручным пуском и прерыванием. Я так понимаю чтобы несколько каналов запустить нужно только через ДМА данные вытягивать т.к. прерывание только после преобразования всех каналов. Размер вышел 856 байт.

@Электронщик А у вас какой экран? у меня есть непонятно на каком контроллере шла с отладочной платкой на 103re.

2 часа назад, Электронщик сказал:

они нас услышали)

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

Цитата

 

Получилось сделать один регулярный канал, с ручным пуском и прерыванием. Я так понимаю чтобы несколько каналов запустить нужно только через ДМА данные вытягивать т.к. 

 

 

 

Потому что для регулярных каналов выделен 1 регистр данных, и нужно вовремя их сбрасывать через ДМА, иначе сотрутся, да и для считывания нескольких каналов нужно запустить режим сканирования, либо не знаю может можно и по другому. Поэтому я использовать пытаюсь инжекторные, там свои регистры данных для каждого канала, вот только таких каналов 4, но мне больше пока нигде не нужно было))).

Дисплей у меня Nokia5110 он же Nokia 3310, покупал отдельно, чем хорош тем что на нем можно обучиться работе с дисплеями SPI, а потом цветной тот же ILI9341прицепить, который mail_robot использует , там только команды инициализации по идее должны поменяться. Вот такой у меня http://arduino-diy.com/arduino-graficheskiy-LCD-displey-84x48-Nokia-5110 только голубой, пишут он лучше по качеству сборки

Я вообще если честно еще ДМА не использовал, и пока не представляю как с ним работать, вроде включить а потом в ДМА будут данные идти с любого интерфейса который я туда настрою, па потом их нужно как -то извлекать?

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

25 минут назад, Электронщик сказал:

Я вообще если честно еще ДМА не использовал, и пока не представляю как с ним работать, вроде включить а потом в ДМА будут данные идти с любого интерфейса который я туда настрою, па потом их нужно как -то извлекать?

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

Вообще в мануале весь процесс настройки расписан по пунктам.

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

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

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

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

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

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

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

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

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

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

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

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