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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Не мрак, а прозрачное и прямолинейное поведение, исходя из которого программист сам решает что и как ему дальше делать, не надеясь на то, что за него подумал кто-то другой.
Реклама
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

menzoda писал(а):Не мрак, а прозрачное и прямолинейное поведение, исходя из которого программист сам решает что и как ему дальше делать, не надеясь на то, что за него подумал кто-то другой.
+100500. Привыкание к "облегчателям" потом (при переходе на иные платформы) приносит проблемы.
С уважением,
Виктор.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Леонид Иванович писал(а):Мрак. В AVR и то атомарность доступа к двухбайтным регистрам была обеспечена аппаратно.
В STM32 тоже.
Более того STM32 атомарно доступно чтение из четырехбайтовых регистров. :)
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

coredumped писал(а):Можете нарваться на ошибку, тк операция не атомарная.
Пока остановился на таком варианте

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

uint32_t RTC_GetCounter(void)
{
  uint32_t counter;
  uint16_t tmp;

  do
  {
    tmp = RTC->CNTH;
    counter = (((uint32_t)tmp << 16 ) | RTC->CNTL);
  } while(tmp != RTC->CNTH);
  
  return counter;
}
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

никто не знает про виртуальный хаб для stm32f4 ?
т.е. чтобы в компьютере определялось 2 виртуальных компорта .
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

amv2000
А нельзя прочитать одновременно младшее и старшее полуслово счетчика, или к этим регистрам доступ только по отдельности? Если нельзя, то я бы лучше перед чтением просто остановил таймер, а после запустил. Это займет всего несколько тактов и время не должно сильно убежать, если конечно этот счетчик не читается много раз в секунду.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

menzoda писал(а):amv2000
А нельзя прочитать одновременно младшее и старшее полуслово счетчика
у часов 100-й серии есть 32-битный счетный регистр CNT. Но на адресное пространство он отображается как 2 32-битных регистра
у которых используется по 16 младших разрядов. Получается чтобы прочитать время нужно считать сначала один, а потом другой адрес
и путем логических операций получить действительное значение этого регистра.
Родился
Сообщения: 2
Зарегистрирован: Пт янв 24, 2014 01:30:10

Сообщение semakatts »

Подскажите какую stm32 discovery взять для начала изучения?
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

balmer писал(а):В STM32 тоже. Более того STM32 атомарно доступно чтение из четырехбайтовых регистров. :)
А почему тогда coredumped говорит про неатомарность чтения?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Леонид Иванович писал(а):А почему тогда coredumped говорит про неатомарность чтения?
Потому, что идет чтение из 2-х 16-битных регистров, не являющихся частями одного 32-битного. Напомню - речь идет о чтении счетчика RTC.
semakatts писал(а):Подскажите какую stm32 discovery взять для начала изучения?
Любую, какая понравится. Можете заранее прикинуть на каком камне будете делать свой первый проект, с тактим камнем и берите.
Все будет только лучше, в крайнем случае - хуже.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

amv2000 У F0 RTC лучше организован . :)))
coredumped писал(а): Любую, какая понравится.
Дык да . Все равно лучше забыть нажитое на пЫк и AVR. Так как придется заново , как надо, а не как хочется, изучать. :)))
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

dosikus писал(а): У F0 RTC лучше организован .
Пока что имеем, с тем и балуемся.
P.S. Еще сегодня пришла HY-Mini STM32V
Вложения
плата.jpg
(229.75 КБ) 628 скачиваний
RTC.jpg
(227.06 КБ) 615 скачиваний
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Всем привет!
Камень STM32F100C4T6B
Как правильно прочитать канал 17 АЦП на котором весит опорное VrefInt?
Изображение

Читаю его, а там нуль :(
вот функция настройки ацп
Бит TSVREFE установил.

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

void ADC_config (void)
{
  RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;   //подаем тактирование АЦП 
  RCC->CFGR    &= ~RCC_CFGR_ADCPRE;      //входной делитель
  ADC1->CR1     =  0;                    //
  ADC1->SQR1    =  0;                    // 
  ADC1->CR2    |=  ADC_CR2_CAL;          //запуск калибровки 
  while (!(ADC1->CR2 & ADC_CR2_CAL)){};  //ждем окончания калибровки
  ADC1->CR2     =  ADC_CR2_EXTSEL;       //выбрать источником запуска разряд  SWSTART
  ADC1->CR2    |=  ADC_CR2_EXTTRIG;      //разр. внешний запуск регулярного канала
  ADC1->CR2    |=  ADC_CR2_TSVREFE;
  ADC1->CR2    |=  ADC_CR2_ADON;         //включить АЦП
  ADC1->CR1     |= ADC_CR1_EOCIE;        // Разрешить прерывание по окончанию преобразования*/  
}
Вот как читаю

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

int ReadADC(char numb)
{ 
  ADC1->CR2    |=  ADC_CR2_CAL;          //запуск калибровки 
  while (!(ADC1->CR2 & ADC_CR2_CAL)){};  //ждем окончания калибровки
  ADC1->SQR3 = numb;                //загрузить номер канала
  ADC1->CR2 |= ADC_CR2_SWSTART;     //запустить преобразование в регулярном канале   
  while(!(ADC1->SR & ADC_SR_EOC)){};//дождаться окончания  преобразования
  return ADC1->DR;                  //прочитать результат измерения
}

ReadADC(17)/4095;  //Читаем канал 17
Еще не понятно вот что. Я прочитав канал 17 получу какие-то данные в регистре. Затем мне надо вычислить напругу по формуле, где есть Vref. Если я пытаюсь прочесть Vref, то что мне в место него в формулу подставлять?
Вообще у меня напруга измеренная грешит. Вот решил проверить, а реально ли на Vref 3.3 , ведь там внутренний референс. Снаружи выводов нет и отдельно не подать напругу на вход АЦП, что бы вычислить референс.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

VREF+ can be internally connected to VDDA and VREF- can be internally connected to VSSA, depending on the package.

У малоногих STM (<100) VREF- соединен с VSSA, VREF+ c VDDA - отсюда и "пляшите". Те Vref у Вас будет равен напряжению на пине VDDA.
Vrefint - внутренняя опора с напряжением, по даташиту = 1.2V. В расчетах Вам нужно использовать напряжение VREF, которое в нашем случае = VDDA.
Все будет только лучше, в крайнем случае - хуже.
Родился
Сообщения: 2
Зарегистрирован: Пт янв 24, 2014 01:30:10

Сообщение semakatts »

Не подскажите какой нибудь учебник где расписано все от и до по stm32, или сайт-самоучитель типа proavr.narod.ru но посвященный stm32
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

semakatts писал(а):Не подскажите какой нибудь учебник где расписано все от и до по stm32, или сайт-самоучитель
Учебников не встречал, а вот два адекватных сайта
http://easystm32.ru/
http://easyelectronics.ru/category/arm-uchebnyj-kurs
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Иван Сусанин - первый полупроводник :solder:
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Задам свой хитрый вопрос тут. Смотрите, в стартап-файлах для АРМ должна быть определена фукнция __user_initial_stackheap или ее новая версия __user_setup_stackheap. Если ее не определить, то компилятор использует реализацию по умолчанию. Эти функции служат для того, чтобы передать указатели на стек и кучу библиотеке времени исполнения.

С указателем на кучу все понятно: чтобы использовать функции выделения памяти (malloc/calloc) нужно знать где эта куча находится, но зачем нужен указатель на стек? В Cortex-M он изначально находится в таблице векторов прерываний на первом месте, а в ARM7 он задается в обработчике прерывания Reset. Однако, в обоих случаях стандартный стартап-файл содержит реализацию __user_initial_stackheap в которой в том числе возвращается указатель на стек.

Так что еще раз: зачем библиотеки времени исполнения указатель на стек, если он и так уже правильно инициализирован и всем известен? Может я что-то не понимаю?
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Назначение функций __user_initial_stackheap() или __user_setup_stackheap() - определить области стека и кучи. В стандартной реализации функции считается, что стек еще до вызова функции определен правильно, и она его не меняет. Но можно написать свою реализацию функции, которая будет возвращать другое значение области стека, и он будет переопределен. Новая версия функции __user_setup_stackheap() принимает и возвращает указатель стека прямо в sp, т.е она его сразу и переопределяет.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Назначение этих функций я знаю, главный вопрос - зачем библиотеке времени исполнения нужен указатель на стек?
Ответить

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