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

STM32 для чайника


ART_ME

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

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

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

В процедуре чтения я делаю

RFID_NSS = 0;
SPI2->CR1 |= SPI_CR1_SPE;

По завершению делаю обратный процесс.

Кстати, еще одна полезность в 103-м и аналогичных, имеющих бит-бандинг. На одном из сайтов (к сожалению не помню каком) обнаружил удобные дефайны для работы с портами.

Вписываете это где вам удобно:

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

// PA0..PA15, PB0..PB15, PC13..PC15, PD0..PD1 (STM32C8xx)
// Bit banding
// Input
#define PORTA ((uint32_t *)((0x42000000  + ((0x40010800 + 0x08)-0x40000000)*32)))
#define PORTB ((uint32_t *)((0x42000000  + ((0x40010C00 + 0x08)-0x40000000)*32)))
#define PORTC ((uint32_t *)((0x42000000  + ((0x40011000 + 0x08)-0x40000000)*32)))
#define PORTD ((uint32_t *)((0x42000000  + ((0x40011400 + 0x08)-0x40000000)*32)))
// Output
#define LATA ((uint32_t *)((0x42000000  + ((0x40010800 + 0x0C)-0x40000000)*32)))
#define LATB ((uint32_t *)((0x42000000  + ((0x40010C00 + 0x0C)-0x40000000)*32)))
#define LATC ((uint32_t *)((0x42000000  + ((0x40011000 + 0x0C)-0x40000000)*32)))
#define LATD ((uint32_t *)((0x42000000  + ((0x40011400 + 0x0C)-0x40000000)*32)))

 

Теперь если есть, например светодиод на PC13, то пишете #define LED LATC[13], после чего работаете со светодиодом по имени:

LED = 1;
LED = 0;
LED = ~LED;

Если порт работает на вход, например кнопка на РА1, то назначаете #define BUTTON1 PORTA[1], после чего обращаетесь с кнопкой напрямую по имени.

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

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

У меня проблема случилась, почему -то после заливки кода I2C по регистрам, у меня теперь плата с процом видется как низкоскоростное устройство 

Вот такой скриншот, и шить могу только через ЮАРТ1 через ЮСБ-ТТЛ преобразователь, было у кого - то такое? А через ЮСБ - ТТЛ не удобно шиться, каждый раз перемычка и RESET/

Screenshot_7.jpg.c20fdd3f4f398e8b0db4ece5d5ce3d84.jpg

Zhuk72 f а есть кусочек кода с ДМА, чтобы хоть глянуть как оно работает?

 

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

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

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

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

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

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

Вы там в процессе опытов РА13 и РА14 не зацепили каким-то образом?

И почему не из среды программируете, а отдельной программой?

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

void spi2dma_init(void)
{
// SPI2_MISO - DMA_CH4
// SPI2_MOSI - DMA_CH5
  RCC->AHBENR |= RCC_AHBENR_DMA1EN;
/*1. Set the peripheral register address in the DMA_CPARx register. The data will be
moved from/ to this address to/ from the memory after the peripheral event.*/
  DMA1_Channel4->CPAR = (unsigned long)&SPI2->DR;
  DMA1_Channel5->CPAR = (unsigned long)&SPI2->DR;
/*2. Set the memory address in the DMA_CMARx register. The data will be written to or
read from this memory after the peripheral event.*/
  DMA1_Channel4->CMAR = (unsigned long)&rfid_in[0];
  DMA1_Channel5->CMAR = (unsigned long)&rfid_out[0];
/*3. Configure the total number of data to be transferred in the DMA_CNDTRx register.
After each peripheral event, this value will be decremented.*/
  DMA1_Channel4->CNDTR = 64;
  DMA1_Channel5->CNDTR = 64;
/*4. Configure the channel priority using the PL[1:0] bits in the DMA_CCRx register.*/
  DMA1_Channel4->CCR = DMA_CCR4_PL_0;
  DMA1_Channel5->CCR = DMA_CCR5_PL_0;
/*5. Configure data transfer direction, circular mode, peripheral & memory incremented
mode, peripheral & memory data size, and interrupt after half and/or full transfer in the
DMA_CCRx register.*/
  DMA1_Channel4->CCR |= (DMA_CCR4_MINC | DMA_CCR4_TCIE);                // Per->Mem
  DMA1_Channel5->CCR |= (DMA_CCR5_MINC | DMA_CCR5_DIR | DMA_CCR5_TCIE); // Mem->Per
/*6. Activate the channel by setting the ENABLE bit in the DMA_CCRx register.*/
  DMA1_Channel4->CCR |= DMA_CCR4_EN;
  DMA1_Channel5->CCR |= DMA_CCR5_EN;
  SPI2->CR2 |= (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN);
  NVIC_EnableIRQ(DMA1_Channel4_IRQn);
  NVIC_EnableIRQ(DMA1_Channel5_IRQn);
}

void DMA1_IRQHandler(void)
{
  if(DMA1->ISR & DMA_ISR_TCIF4)         // Receive completed.
  {
    DMA1->IFCR &= ~DMA_IFCR_CTCIF4;    // Completion flag clear.
    // Процедура по завершению приема
  }
    else if (DMA1->ISR & DMA_ISR_TCIF5) // Transmit completed.
    {
      DMA1->IFCR &= ~DMA_IFCR_CTCIF5;   // Completion flag clear.
      // Процедура по завершению передачи
    }
}

 

Но в деле я это пока не проверял ))

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

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

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

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

А из среды постоянно с самого начала ошибку выдает, могу только отладку оттуда загружать

Не знаю как но задел, этим кодом ноги отладчика 

/ текущее значение частоты PCLK1 (может быть от 2 до 32, включительно)
//I2C2->CR2 &= ~I2C_CR2_FREQ;
//I2C2->CR2 |= 2;


//2,097 МГц / 100 кГц = 10;

//I2C2->CCR &= ~I2C_CCR_CCR;
I2C2->CCR |= 10;
//I2C2->TRISE = 3;

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

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

Регулярные каналы ADC1 (0 - 3), ДМА.

 

F103_ADC_Test_DMA.zip

Да, много всего непонятного, куча режимов и т.д.

@Электронщик Какой у вас отладчик?

в принципе, расчетное время преобразования совпадает с реальным и равен 84 мкс - 4 канала.

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

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

@Электронщик попробуйте в STM32 ST-LINK Utility стереть чип, а потом подключить через отладчик.

точно ноги SWD портите, в кубе вы выбирали отладку?

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

Я за I2C спрашиваю, не хотите поиграться? А то что-то я один не могу его добить. Посмотрю потом, как вы настроили номера пинов на номера регулярных каналов

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

так я и пишу что некуда подключить, о если айду в дипе вроде память была, у меня есть софтовый я его на RTC опробовал работает нормально, правда в блок режиме.

 

ну у меня совсем 1 резистор подстроечный, может и у меня не все гладко, я не знаю)

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

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

Еще вопрос я так понимаю для осциллографа лучше использовать инжекторные каналы, а не регулярные с ДМА, так как получим большую скорость, так как проц занят АЦП, а не ДМА, который 50% проца использует? Просто набросал себе осцилограф, и думаю как лучше? И еще тоже такой вопрос, в осциллографе смещение входа АЦП делаю половиной напряжения питания, а вот есть такая фишка на АЦП как смещение АЦП, я так понимаю мне его можно использовать для этих целей, а провод с половины питания проца можно убрать? И есть ли функция смещения АЦП в HAL? 

Кстати вычитал, что смещение АЦП предусмотрено только для инжекторных каналов.

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

MasterElectric когда будет время с I2С аппаратным повозиться, ты скажи, а то я сам победить его не могу я тебе и свой набросок могу в личку скинуть, правда он не работает, но что-то близко, а ты как будет время напиши.

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

нашел 24c32a atmel, но на AVR я так и не смог написать библиотеку под него, что-то он замысловатый. Тут нужно теорию вначале почитать, может пример где найду.  

@Электронщик Ну начал, буду мучать 24с64, думаю что поборю 9 регистров всего)

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

 Просто, я кстати RTC DS1307 на АВР по регистрам запустил, а тут через HAL memory write memory read не работает, так же как и память.

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

I2C то ли сложный, то ли глючный. Изучаю http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries-expansions/stsw-stm32020.html На CMSIS примеров почти нет, а те что есть не на 100% стабильно работают судя по всему.

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

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

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

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

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

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

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

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

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

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

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

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