STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Здравствуйте! Скажите, есть ли какой-то "стандарт" разъема программирования SWD для STM32 на подобие AVRовского 6-пинового ISP или 10-пинового JTAG? На платах Дискавери под это дело вообще какая-то непонятная гребенка типа PLS с "лишними" сигналами. Как вообще принято оформлять эту часть схемы на STM? Ведь там еще есть бутлоадер на UART.
-
Immortal_Buka
- Родился
- Сообщения: 9
- Зарегистрирован: Ср май 06, 2015 14:21:38
Re: STM32 новичку в ARM что к чему
http://www2.keil.com/coresight/coresight-connectors/
а UART отдельным выводом
а UART отдельным выводом
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: STM32 новичку в ARM что к чему
МК STM32F103.
Оперативка c 0x20000000 размером 0x5000.
Объявляю массив uint32_t Mass[1024];. Нулевой элемент массива начинается с адреса 0x1ffff834, т.е. вне оперативки.
Размер стека определен в стартапе вот такой записью. Изменяю значение на 0x00000300 (вроде как увеличил стек) и массив попадает в допустимую область памяти.
Поясните пожалуйста про такое определение стека, может это не размер, а смещение задается
или еще чего ?
Оперативка 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]; Поясните пожалуйста про такое определение стека, может это не размер, а смещение задается
или еще чего ?Re: STM32 новичку в ARM что к чему
Где? Случайно не в функции? Тогда массив локальный и находится в стеке...Z_h_e писал(а):Объявляю массив
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: STM32 новичку в ARM что к чему
Ага. Засунул в функцию main. Попробую сейчас глобально объявить.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: STM32 новичку в ARM что к чему
Ну да. Попробовал объявить глобально и внутри функции как static. В обоих случаях стало нормально. Спасибо.
Я почему-то подумал, что объявление размера стека - это резервирование области памяти в которой может "бегать" указатель стека и в которой не будут размещаться переменные. Буду знать.
----------
Поэкспериментировал с объявлениями переменных локальных и глобальных. Размером стека. Указатель стека где-то в середине ОЗУ, казалось бы вроде как логичнее его в конец памяти засунуть.
Я почему-то подумал, что объявление размера стека - это резервирование области памяти в которой может "бегать" указатель стека и в которой не будут размещаться переменные. Буду знать.
----------
Поэкспериментировал с объявлениями переменных локальных и глобальных. Размером стека. Указатель стека где-то в середине ОЗУ, казалось бы вроде как логичнее его в конец памяти засунуть.
Re: STM32 новичку в ARM что к чему
День добрый.
Пытаюсь разобраться с гироскопом L3GD20. Настроил SPI как во всех примерах, отправляю 0x0F в адрес 0x20, в DR появляется значение FFFF, а прочесть WHO I AM не выходит. Перепробовал кучу вариантов, выложу последний (самый топорный):
P.S. Со SPI работаю впервые, поэтому сильно не ругайте
.
Пытаюсь разобраться с гироскопом 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 работаю впервые, поэтому сильно не ругайте
Re: STM32 новичку в ARM что к чему
Сколько раз говорить? Камень какой?????
Re: STM32 новичку в ARM что к чему
Пардон. Забыл совсем
. Все это на STM32F3Discovery пробуется (камешек там STM32F303VCT6).
Re: STM32 новичку в ARM что к чему
Тогда должно подойти от F0
Инит SPI
Одиночная транзакция
Пример
Код: Выделить всё
#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; Re: STM32 новичку в ARM что к чему
dosikus писал(а): Spi_send(0x29|0x80); //Шлем команду
А тут что происходит? И почему именно такие значения?
Re: STM32 новичку в ARM что к чему
Это пример , пример работы с датчиком F4 discovery. У твоего датчика свои команды.
Здесь важно ,что работа с 8 битными транзакциям . Что и делаем в ините. Ты же работаешь с 16 битными, это раз а два -тестить в дебагере регистры SPI нельзя.
Здесь важно ,что работа с 8 битными транзакциям . Что и делаем в ините. Ты же работаешь с 16 битными, это раз а два -тестить в дебагере регистры SPI нельзя.
Re: STM32 новичку в ARM что к чему
dosikus писал(а):Тогда должно подойти от F0
dosikus писал(а):пример работы с датчиком F4 discovery
?
dosikus писал(а):Spi_send(0x29|0x80);
Тоесть у Вас, чтоб запустить датчик нужно прописать значение 0x80 в адрес 0x29?
Мне не понятно что делает ИЛИ в вызове функции. Что будет при этом происходить? (хотя, это скорее вопрос по СИ)

Позже...
Ничего не понимаю. Пригляделся еще раз в Ваш пример и понял, что 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;
Re: STM32 новичку в ARM что к чему
Есть проблема с гироскопом L3GD20. Даже когда он лежит неподвижно, датчик выдает значения ускорения (что-то возле 0x0F). От этого, при преобразовании угловой скорости в текущий угол наклона, контроллер думает, что датчик медленно вращается.
Как правильно с этим бороться?
Как правильно с этим бороться?
Re: STM32 новичку в ARM что к чему
Код: Выделить всё
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_3Re: STM32 новичку в ARM что к чему
Земля вращается вокруг своей оси и вокруг солнца. Галактика тоже вращается и перемещается в пространстве, т. е. датчик не неподвижен...isx писал(а):Даже когда он лежит неподвижно, датчик выдает значения ускорения
Re: STM32 новичку в ARM что к чему
Мурик писал(а):Земля вращается вокруг своей оси и вокруг солнца. Галактика тоже вращается и перемещается в пространстве, т. е. датчик не неподвижен...
Физику почитай, состояние покоя неотличимо от равномерного прямолинейного движения.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: STM32 новичку в ARM что к чему
Бегло глянул ДШ, он вроде не умеет ускорение измерять.isx писал(а):Есть проблема с гироскопом L3GD20. Даже когда он лежит неподвижно, датчик выдает значения ускорения...
Re: STM32 новичку в ARM что к чему
dosikus писал(а): #define CS_ENABLE GPIOE->BSRR = GPIO_BSRR_BR_3
#define CS_DISABLE GPIOE->BSRR = GPIO_BSRR_BS_3
Это да. Только вот у меня почему-то проблемы с использованием BSRR - не всегда срабатывает. На днях начну разбор. Дефайны использую редко, почему-то мне так удобнее
Z_h_e писал(а):Бегло глянул ДШ, он вроде не умеет ускорение измерять.
Пардон, угловую скорость (правда в "попугаях").
Бегал по ДШ, искал аппаратную компенсацию ухода от нуля - ничего не нашел. Похоже придется программно компенсировать.
У меня не слабые шумы на датчике выходят (+- 5 единиц). При такой работе он даже за час лёжа накопит такую ошибку, что будет думать что его повернули на 90 градусов. А ведь гироскопы используют в гироскутерах. Как они тогда не выкидывают ездока после нескольких минут езды? Там стоят более качественные датчики или же алгоритм фильтрования позволяет настолько устранить влияние шумов?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: STM32 новичку в ARM что к чему
В этой статье автор просто игнорирует малые значения.
В ДШ поди есть описание о погрешности и нестабильности чипа?...Есть еще один небольшой момент. При считывании данных из регистров гироскопа обнаружилась следующая вещь. Значение угловой скорости колеблется относительно нуля, даже если плата не двигается с места. То есть вместо значения скорости, равного нулю, мы будем получать хаотично меняющиеся значения (0х02, 0х05….). В результате будет накапливаться ошибка определения местоположения платы. Для того, чтобы это убрать давайте в случае, если значение переменной xResult меньше величины 0x0A, будем обнулять эту переменную...
