STM32 новичку в ARM что к чему
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Не мрак, а прозрачное и прямолинейное поведение, исходя из которого программист сам решает что и как ему дальше делать, не надеясь на то, что за него подумал кто-то другой.
- Реклама
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
+100500. Привыкание к "облегчателям" потом (при переходе на иные платформы) приносит проблемы.menzoda писал(а):Не мрак, а прозрачное и прямолинейное поведение, исходя из которого программист сам решает что и как ему дальше делать, не надеясь на то, что за него подумал кто-то другой.
С уважением,
Виктор.
Виктор.
В STM32 тоже.Леонид Иванович писал(а):Мрак. В AVR и то атомарность доступа к двухбайтным регистрам была обеспечена аппаратно.
Более того STM32 атомарно доступно чтение из четырехбайтовых регистров.
Пока остановился на таком варианте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
- Откуда: Россия,Ставропольский край, ст.Бекешевская
никто не знает про виртуальный хаб для stm32f4 ?
т.е. чтобы в компьютере определялось 2 виртуальных компорта .
т.е. чтобы в компьютере определялось 2 виртуальных компорта .
- Реклама
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
amv2000
А нельзя прочитать одновременно младшее и старшее полуслово счетчика, или к этим регистрам доступ только по отдельности? Если нельзя, то я бы лучше перед чтением просто остановил таймер, а после запустил. Это займет всего несколько тактов и время не должно сильно убежать, если конечно этот счетчик не читается много раз в секунду.
А нельзя прочитать одновременно младшее и старшее полуслово счетчика, или к этим регистрам доступ только по отдельности? Если нельзя, то я бы лучше перед чтением просто остановил таймер, а после запустил. Это займет всего несколько тактов и время не должно сильно убежать, если конечно этот счетчик не читается много раз в секунду.
у часов 100-й серии есть 32-битный счетный регистр CNT. Но на адресное пространство он отображается как 2 32-битных регистраmenzoda писал(а):amv2000
А нельзя прочитать одновременно младшее и старшее полуслово счетчика
у которых используется по 16 младших разрядов. Получается чтобы прочитать время нужно считать сначала один, а потом другой адрес
и путем логических операций получить действительное значение этого регистра.
- Сообщения: 2
- Зарегистрирован: Пт янв 24, 2014 01:30:10
А почему тогда coredumped говорит про неатомарность чтения?balmer писал(а):В STM32 тоже. Более того STM32 атомарно доступно чтение из четырехбайтовых регистров.
Потому, что идет чтение из 2-х 16-битных регистров, не являющихся частями одного 32-битного. Напомню - речь идет о чтении счетчика RTC.Леонид Иванович писал(а):А почему тогда coredumped говорит про неатомарность чтения?
Любую, какая понравится. Можете заранее прикинуть на каком камне будете делать свой первый проект, с тактим камнем и берите.semakatts писал(а):Подскажите какую stm32 discovery взять для начала изучения?
Все будет только лучше, в крайнем случае - хуже.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
amv2000 У F0 RTC лучше организован . 

Дык да . Все равно лучше забыть нажитое на пЫк и AVR. Так как придется заново , как надо, а не как хочется, изучать.coredumped писал(а): Любую, какая понравится.
Пока что имеем, с тем и балуемся.dosikus писал(а): У F0 RTC лучше организован .
P.S. Еще сегодня пришла HY-Mini STM32V
Всем привет!
Камень STM32F100C4T6B
Как правильно прочитать канал 17 АЦП на котором весит опорное VrefInt?

Читаю его, а там нуль
вот функция настройки ацп
Бит TSVREFE установил.
Вот как читаю
Еще не понятно вот что. Я прочитав канал 17 получу какие-то данные в регистре. Затем мне надо вычислить напругу по формуле, где есть Vref. Если я пытаюсь прочесть Vref, то что мне в место него в формулу подставлять?
Вообще у меня напруга измеренная грешит. Вот решил проверить, а реально ли на Vref 3.3 , ведь там внутренний референс. Снаружи выводов нет и отдельно не подать напругу на вход АЦП, что бы вычислить референс.
Камень 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Вообще у меня напруга измеренная грешит. Вот решил проверить, а реально ли на Vref 3.3 , ведь там внутренний референс. Снаружи выводов нет и отдельно не подать напругу на вход АЦП, что бы вычислить референс.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
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
Не подскажите какой нибудь учебник где расписано все от и до по stm32, или сайт-самоучитель типа proavr.narod.ru но посвященный stm32
Учебников не встречал, а вот два адекватных сайтаsemakatts писал(а):Не подскажите какой нибудь учебник где расписано все от и до по stm32, или сайт-самоучитель
http://easystm32.ru/
http://easyelectronics.ru/category/arm-uchebnyj-kurs
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
Иван Сусанин - первый полупроводник 
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Задам свой хитрый вопрос тут. Смотрите, в стартап-файлах для АРМ должна быть определена фукнция __user_initial_stackheap или ее новая версия __user_setup_stackheap. Если ее не определить, то компилятор использует реализацию по умолчанию. Эти функции служат для того, чтобы передать указатели на стек и кучу библиотеке времени исполнения.
С указателем на кучу все понятно: чтобы использовать функции выделения памяти (malloc/calloc) нужно знать где эта куча находится, но зачем нужен указатель на стек? В Cortex-M он изначально находится в таблице векторов прерываний на первом месте, а в ARM7 он задается в обработчике прерывания Reset. Однако, в обоих случаях стандартный стартап-файл содержит реализацию __user_initial_stackheap в которой в том числе возвращается указатель на стек.
Так что еще раз: зачем библиотеки времени исполнения указатель на стек, если он и так уже правильно инициализирован и всем известен? Может я что-то не понимаю?
С указателем на кучу все понятно: чтобы использовать функции выделения памяти (malloc/calloc) нужно знать где эта куча находится, но зачем нужен указатель на стек? В Cortex-M он изначально находится в таблице векторов прерываний на первом месте, а в ARM7 он задается в обработчике прерывания Reset. Однако, в обоих случаях стандартный стартап-файл содержит реализацию __user_initial_stackheap в которой в том числе возвращается указатель на стек.
Так что еще раз: зачем библиотеки времени исполнения указатель на стек, если он и так уже правильно инициализирован и всем известен? Может я что-то не понимаю?
Назначение функций __user_initial_stackheap() или __user_setup_stackheap() - определить области стека и кучи. В стандартной реализации функции считается, что стек еще до вызова функции определен правильно, и она его не меняет. Но можно написать свою реализацию функции, которая будет возвращать другое значение области стека, и он будет переопределен. Новая версия функции __user_setup_stackheap() принимает и возвращает указатель стека прямо в sp, т.е она его сразу и переопределяет.
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Назначение этих функций я знаю, главный вопрос - зачем библиотеке времени исполнения нужен указатель на стек?



