STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: STM32 новичку в ARM что к чему

Сообщение aam »

Здравствуйте! Скажите, есть ли какой-то "стандарт" разъема программирования SWD для STM32 на подобие AVRовского 6-пинового ISP или 10-пинового JTAG? На платах Дискавери под это дело вообще какая-то непонятная гребенка типа PLS с "лишними" сигналами. Как вообще принято оформлять эту часть схемы на STM? Ведь там еще есть бутлоадер на UART.
Immortal_Buka
Родился
Сообщения: 9
Зарегистрирован: Ср май 06, 2015 14:21:38

Re: STM32 новичку в ARM что к чему

Сообщение Immortal_Buka »

http://www2.keil.com/coresight/coresight-connectors/
а UART отдельным выводом
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 новичку в ARM что к чему

Сообщение Z_h_e »

МК STM32F103.
Оперативка c 0x20000000 размером 0x5000.

Объявляю массив uint32_t Mass[1024];. Нулевой элемент массива начинается с адреса 0x1ffff834, т.е. вне оперативки.

Размер стека определен в стартапе вот такой записью.

Код: Выделить всё

#define STACK_SIZE       0x00000100      /*!< The Stack size suggest using even number     */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
Изменяю значение на 0x00000300 (вроде как увеличил стек) и массив попадает в допустимую область памяти.

Поясните пожалуйста про такое определение стека, может это не размер, а смещение задается :dont_know: или еще чего ?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

Z_h_e писал(а):Объявляю массив
Где? Случайно не в функции? Тогда массив локальный и находится в стеке...
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 новичку в ARM что к чему

Сообщение Z_h_e »

Ага. Засунул в функцию main. Попробую сейчас глобально объявить.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 новичку в ARM что к чему

Сообщение Z_h_e »

Ну да. Попробовал объявить глобально и внутри функции как static. В обоих случаях стало нормально. Спасибо.

Я почему-то подумал, что объявление размера стека - это резервирование области памяти в которой может "бегать" указатель стека и в которой не будут размещаться переменные. Буду знать.

----------
Поэкспериментировал с объявлениями переменных локальных и глобальных. Размером стека. Указатель стека где-то в середине ОЗУ, казалось бы вроде как логичнее его в конец памяти засунуть.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

День добрый.
Пытаюсь разобраться с гироскопом L3GD20. Настроил SPI как во всех примерах, отправляю 0x0F в адрес 0x20, в DR появляется значение FFFF, а прочесть WHO I AM не выходит. Перепробовал кучу вариантов, выложу последний (самый топорный):
Спойлер

Код: Выделить всё


 while(!(SPI1->SR & SPI_SR_TXE));   
 SPI1->DR = 0x20;
while((SPI1->SR & SPI_SR_BSY)); // я знаю, что здесь нужно работать с TXE, но пытаюсь завести хоть как-то
 SPI1->DR = 0x0F;
while((SPI1->SR & SPI_SR_BSY)); после этого в регистре DR в отладчике Keil4 появляется значение 0x0000FFFF
 SPI1->DR = 0x8F;
while((SPI1->SR & SPI_SR_BSY));
 SPI1->DR = 0x00; // это некий байт dummy. Я понятия не имею что с ним делать и как с ним работать
while((SPI1->SR & SPI_SR_BSY));
   
 while(!(SPI1->SR & SPI_SR_RXNE));
 temp = SPI1->DR; // значение temp становиться 0xFF

P.S. Со SPI работаю впервые, поэтому сильно не ругайте :) .
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Сколько раз говорить? Камень какой?????
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

Пардон. Забыл совсем :) . Все это на STM32F3Discovery пробуется (камешек там STM32F303VCT6).
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Тогда должно подойти от F0


Код: Выделить всё

#define SPI1_DR_8bit          (*(__IO uint8_t *)((uint32_t)&(SPI1->DR))) 

Инит SPI

Код: Выделить всё

                     
      SPI1->CR1 |=
                   SPI_CR1_BR_0 |     
                   SPI_CR1_BR_1 |
                   SPI_CR1_MSTR |
                   SPI_CR1_SSI    |            
                   SPI_CR1_SSM
                   ;   
   SPI1->CR2  = 0x700;   //  8 bit
   SPI1->CR2 |= SPI_CR2_FRXTH;
   SPI1->CR1 |= SPI_CR1_SPE;   

Одиночная транзакция

Код: Выделить всё

   uint8_t Spi_send (uint8_t data)
      {
       
        SPI1_DR_8bit = data;                       
        while (!(SPI1->SR & SPI_SR_RXNE));     
       
        return (SPI1_DR_8bit );               
      }



Пример

Код: Выделить всё


   CS_On;   
   Spi_send(0x29|0x80);   //Шлем команду
   temp=Spi_send(0x00);     // Считываем данные
   CS_Off;   
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

dosikus писал(а): Spi_send(0x29|0x80);   //Шлем команду

А тут что происходит? И почему именно такие значения?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Это пример , пример работы с датчиком F4 discovery. У твоего датчика свои команды.
Здесь важно ,что работа с 8 битными транзакциям . Что и делаем в ините. Ты же работаешь с 16 битными, это раз а два -тестить в дебагере регистры SPI нельзя.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

dosikus писал(а):Тогда должно подойти от F0

dosikus писал(а):пример работы с датчиком F4 discovery

?
dosikus писал(а):Spi_send(0x29|0x80);

Тоесть у Вас, чтоб запустить датчик нужно прописать значение 0x80 в адрес 0x29?
Мне не понятно что делает ИЛИ в вызове функции. Что будет при этом происходить? (хотя, это скорее вопрос по СИ) :dont_know:

Позже...

Ничего не понимаю. Пригляделся еще раз в Ваш пример и понял, что 0x29|0x80 похоже на запрос установку адреса и ожидание принятия данных. Откинул отправку байт для включения датчика (во всех статьях пишут, что сначала нужно отправить 0x0F по адресу 0x20, чтоб включить датчик) и получил ответ 0xD4 от датчика при чтении адреса WHO I AM (тот ответ, который и должен быть).
Какого собакена он работает с выключенным датчиком и не работает с включенным?

Еще позже...

Разобрался. Просто после каждого приема или передачи данных необходимо дергать ногу CS, а я ее прижимал к земле и так оставлял. Вот рабочий (но не совершенный) код, считывающий данные с оси X:

Спойлер

Код: Выделить всё

 GPIOE->ODR &= ~GPIO_ODR_3;  
    spi_exchange(0x20);   //Шлем команду
    spi_exchange(0x0F);   //Шлем команду
    GPIOE->ODR |= GPIO_ODR_3;
   
    GPIOE->ODR &= ~GPIO_ODR_3;
    spi_exchange(0x8F);   //Шлем команду
   temp=spi_exchange(0x00);     // Считываем данные
    GPIOE->ODR |= GPIO_ODR_3;   

   GPIOE->ODR &= ~GPIO_ODR_3;
   spi_exchange(0xE8);
   DataFromAxel[0] = spi_exchange(0x00);
    DataFromAxel[1] = spi_exchange(0x00);
    GPIOE->ODR |= GPIO_ODR_3;
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

Есть проблема с гироскопом L3GD20. Даже когда он лежит неподвижно, датчик выдает значения ускорения (что-то возле 0x0F). От этого, при преобразовании угловой скорости в текущий угол наклона, контроллер думает, что датчик медленно вращается.
Как правильно с этим бороться?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Код: Выделить всё

   GPIOE->ODR &= ~GPIO_ODR_3; 

    GPIOE->ODR |= GPIO_ODR_3;




Код: Выделить всё

  #define CS_ENABLE GPIOE->BSRR = GPIO_BSRR_BR_3
    #define CS_DISABLE GPIOE->BSRR = GPIO_BSRR_BS_3
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

isx писал(а):Даже когда он лежит неподвижно, датчик выдает значения ускорения
Земля вращается вокруг своей оси и вокруг солнца. Галактика тоже вращается и перемещается в пространстве, т. е. датчик не неподвижен...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

Мурик писал(а):Земля вращается вокруг своей оси и вокруг солнца. Галактика тоже вращается и перемещается в пространстве, т. е. датчик не неподвижен...

Физику почитай, состояние покоя неотличимо от равномерного прямолинейного движения.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 новичку в ARM что к чему

Сообщение Z_h_e »

isx писал(а):Есть проблема с гироскопом L3GD20. Даже когда он лежит неподвижно, датчик выдает значения ускорения...
Бегло глянул ДШ, он вроде не умеет ускорение измерять.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

dosikus писал(а): #define CS_ENABLE GPIOE->BSRR = GPIO_BSRR_BR_3
    #define CS_DISABLE GPIOE->BSRR = GPIO_BSRR_BS_3

Это да. Только вот у меня почему-то проблемы с использованием BSRR - не всегда срабатывает. На днях начну разбор. Дефайны использую редко, почему-то мне так удобнее :dont_know:
Z_h_e писал(а):Бегло глянул ДШ, он вроде не умеет ускорение измерять.

Пардон, угловую скорость (правда в "попугаях").
Бегал по ДШ, искал аппаратную компенсацию ухода от нуля - ничего не нашел. Похоже придется программно компенсировать. :dont_know:
У меня не слабые шумы на датчике выходят (+- 5 единиц). При такой работе он даже за час лёжа накопит такую ошибку, что будет думать что его повернули на 90 градусов. А ведь гироскопы используют в гироскутерах. Как они тогда не выкидывают ездока после нескольких минут езды? Там стоят более качественные датчики или же алгоритм фильтрования позволяет настолько устранить влияние шумов?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: STM32 новичку в ARM что к чему

Сообщение Z_h_e »

В этой статье автор просто игнорирует малые значения.
...Есть еще один небольшой момент. При считывании данных из регистров гироскопа обнаружилась следующая вещь. Значение угловой скорости колеблется относительно нуля, даже если плата не двигается с места. То есть вместо значения скорости, равного нулю, мы будем получать хаотично меняющиеся значения (0х02, 0х05….). В результате будет накапливаться ошибка определения местоположения платы. Для того, чтобы это убрать давайте в случае, если значение переменной xResult меньше величины 0x0A, будем обнулять эту переменную...
В ДШ поди есть описание о погрешности и нестабильности чипа?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

Вернуться в «ARM»