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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="hosturik",url="/forum/viewtopic.php?p=3570153#p3570153"]Чем больше разница между текущим и новым (меньшим значениям) тем больше вероятность глюка.
Например было 20 000, стало 18 000 глюк будет очень редко, было 20 000, стало 3000, глюк будет почти наверняка.[/uquote]
Так правильно, если изменять ARR в произвольное время, то в первом случае глюк будет наблюдаться только когда счетчик больше 18K, т.е. с вероятностью 1/10. А во-втором случае все практически наоборот...
Но таймер у меня 16 битный без делителя, на 48 МГц работает, частоту только с помощью регистра сравнения меняю, поэтому доситывать до переполнения будет быстро.
Здесь что то другое.
Скорее не другое, а что-то еще :) Но решение уже озвучивали, включение CR1_ARPE должно помочь.

Кстати, что за мк? 48 MHz как бы намекают на F0, а там TIM2 32-х битный.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Что-то не срастается моя идея ADC->DMA->UART. Судя по отладчику данные бегают, а вот прерывания не обрабатываться. Может кто подскажет что не так?
Спойлер

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

#include "stm32f0xx.h"

uint16_t buff[100];


void DMA1_Channel1_IRQHandler(void){
	//empty	
}

void DMA1_Channel2_3_IRQHandler(void){
	//empty
}

void gpio_ini(){
	RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
	GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER0 | GPIO_MODER_MODER1;
	GPIOB->OTYPER &= ~GPIO_OTYPER_OT_6;
	GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6_0;
	GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
	GPIOB->AFR[0] &= ~GPIO_AFRL_AFRL6;	
}

void usart_ini(){
	RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
	USART1->BRR = SystemCoreClock/256000;
	USART1->CR3 = USART_CR3_DMAT;
	USART1->CR1 |= USART_CR1_TE; 
	USART1->CR1 |= USART_CR1_TCIE;
	USART1->CR1 |= USART_CR1_UE;
}

void adc_ini(){
	RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
	ADC1->CHSELR |= ADC_CHSELR_CHSEL8 | ADC_CHSELR_CHSEL9;	
	ADC1->SMPR  |= ADC_SMPR_SMP_2 | ADC_SMPR_SMP_0; 			
	ADC1->CFGR2 |= ADC_CFGR2_CKMODE_1;	
	ADC1->CFGR1 &= ~ADC_CFGR1_SCANDIR;	
	ADC1->CFGR1 |= ADC_CFGR1_CONT;
	ADC1->CFGR1 &= ~ADC_CFGR1_RES_Msk;
	ADC1->CFGR1 |= ADC_CFGR1_DMACFG;
	ADC1->CFGR1 |= ADC_CFGR1_DMAEN;
	
	ADC1->CR |= ADC_CR_ADCAL;
		while(ADC1->CR & ADC_CR_ADCAL){
	}
	
	ADC1->CR |= ADC_CR_ADEN;
}

void dma_ini(){
	RCC->AHBENR |= RCC_AHBENR_DMAEN;
	
// DMA1 ADC->DMA init
	DMA1_Channel1->CPAR |= (uint32_t)&ADC1->DR;
	DMA1_Channel1->CMAR |= (uint32_t)&buff[0];
	DMA1_Channel1->CNDTR |= 100;
	DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk;
	DMA1_Channel1->CCR &= ~DMA_CCR_DIR;	
	DMA1_Channel1->CCR &= ~DMA_CCR_PL_Msk;
	DMA1_Channel1->CCR |= DMA_CCR_MSIZE_0;
	DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0;
	DMA1_Channel1->CCR |= DMA_CCR_MINC;
	DMA1_Channel1->CCR |= DMA_CCR_CIRC;
	DMA1_Channel1->CCR |= DMA_CCR_HTIE;
	DMA1_Channel1->CCR |= DMA_CCR_TCIE;
	DMA1_Channel1->CCR |= DMA_CCR_EN;
	NVIC_EnableIRQ(DMA1_Channel1_IRQn);
	NVIC_SetPriority(DMA1_Channel1_IRQn,2);

// DMA2 DMA->UART init
	DMA1_Channel2->CPAR |= (uint32_t)&USART1->TDR;
	DMA1_Channel2->CMAR |= (uint32_t)&buff[0];
	DMA1_Channel2->CNDTR |= 100;
	DMA1_Channel2->CCR &= ~DMA_CCR_MEM2MEM_Msk;
	DMA1_Channel2->CCR |= DMA_CCR_DIR;
	DMA1_Channel2->CCR &= ~DMA_CCR_PL_0;
	DMA1_Channel2->CCR &= ~DMA_CCR_MSIZE_Msk;
	DMA1_Channel2->CCR &= ~DMA_CCR_PSIZE_Msk;
	DMA1_Channel2->CCR |= DMA_CCR_MINC;
	DMA1_Channel2->CCR |= DMA_CCR_CIRC;
	DMA1_Channel2->CCR |= DMA_CCR_HTIE;
	DMA1_Channel2->CCR |= DMA_CCR_TCIE;
	DMA1_Channel2->CCR |= DMA_CCR_EN;
	NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
	NVIC_SetPriority(DMA1_Channel2_3_IRQn,1);	
}

int main(){
	void __enable_irq(void);
	NVIC->ISER[0] = 0x03<<7;
	
	dma_ini();
	gpio_ini();
	adc_ini();
	usart_ini();
	

	ADC1->CR |= ADC_CR_ADSTART;
	while(1){
		//empty
	}
	return 0;
}

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

Сообщение dosikus »

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

DMA1_Channel1->CPAR |= (uint32_t)&ADC1->DR;
   DMA1_Channel1->CMAR |= (uint32_t)&buff[0];
   DMA1_Channel1->CNDTR |= 100;
Обычные ляпы?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Да ему "так наглядней" :)
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3574334#p3574334"]Да ему "так наглядней"[/uquote]
Не угадали, Владислав.
dosikus писал(а):Обычные ляпы?
Хуже, невнимательность.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="pavell",url="/forum/viewtopic.php?p=3574389#p3574389"]Не угадали, Владислав.[/uquote]Да тут и гадать не надо.
У того кто вот так &buff[0] берёт адрес массива и особенно автора вот этого

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

   DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk;
   DMA1_Channel1->CCR &= ~DMA_CCR_DIR;   
   DMA1_Channel1->CCR &= ~DMA_CCR_PL_Msk;
   DMA1_Channel1->CCR |= DMA_CCR_MSIZE_0;
   DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0;
   DMA1_Channel1->CCR |= DMA_CCR_MINC;
   DMA1_Channel1->CCR |= DMA_CCR_CIRC;
   DMA1_Channel1->CCR |= DMA_CCR_HTIE;
   DMA1_Channel1->CCR |= DMA_CCR_TCIE;
   DMA1_Channel1->CCR |= DMA_CCR_EN;
большие проблемы. :(
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

А можете расписать в чем там проблемы, просто не все сразу понимают, почему так нельзя маски делать?
Станислав
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3574827#p3574827"]Да тут и гадать не надо.
У того кто вот так &buff[0] берёт адрес массива и особенно автора вот этого[/uquote]
А в чем собственно проблема? Адрес первого элемента массива это и есть указатель/ссылка на массив.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3574827#p3574827"]... и особенно автора вот этого

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

   DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk;
   DMA1_Channel1->CCR &= ~DMA_CCR_DIR;   
   DMA1_Channel1->CCR &= ~DMA_CCR_PL_Msk;
[/uquote]

Владислав, вы топиком не ошиблись? Позволю себе напомнить его название - "STM32 новичку в ARM что к чему" по этому, как новичку мне позволительно так писать. Но если внутренний перфекцонист не дает вам сдержаться, а не заходить в тему вы тоже не можете, обещаю, что впредь я буду писать только так:

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

   DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk |
                         ~DMA_CCR_DIR |   
                         ~DMA_CCR_PL_Msk;
Надеюсь к стилю претензий нет?
Последний раз редактировалось pavell Чт фев 21, 2019 08:29:38, всего редактировалось 2 раза.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

По моему, все пишут так... :

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


DMA1_Channel1->CCR &= ~(DMA_CCR_MEM2MEM_Msk | DMA_CCR_DIR |  DMA_CCR_PL_Msk);
Станислав
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3574853#p3574853"]По моему, все пишут так... :

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


DMA1_Channel1->CCR &= ~(DMA_CCR_MEM2MEM_Msk | DMA_CCR_DIR |  DMA_CCR_PL_Msk);
[/uquote]
Я еще учусь )

PS стоит результат компиляции сравнить этих двух выражений
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Господа, вы можете писать КАК ХОТИТЕ, только не говорите мне, что я ошибаюсь в своих оценках!

Добавлено after 18 minutes 11 seconds:
[uquote="pavell",url="/forum/viewtopic.php?p=3574854#p3574854"]PS стоит результат компиляции сравнить этих двух выражений[/uquote]А давай сравним

Вариант

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

   DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk;
   DMA1_Channel1->CCR &= ~DMA_CCR_DIR;   
   DMA1_Channel1->CCR &= ~DMA_CCR_PL_Msk;
   DMA1_Channel1->CCR |= DMA_CCR_MSIZE_0;
   DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0;
   DMA1_Channel1->CCR |= DMA_CCR_MINC;
   DMA1_Channel1->CCR |= DMA_CCR_CIRC;
   DMA1_Channel1->CCR |= DMA_CCR_HTIE;
   DMA1_Channel1->CCR |= DMA_CCR_TCIE;
   DMA1_Channel1->CCR |= DMA_CCR_EN;
Спойлер

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

//   93    DMA1_Channel1->CCR &= ~DMA_CCR_MEM2MEM_Msk;
        LDR      R0,??DataTable1_10  ;; 0x40020008
        LDR      R2,[R0, #+0]
        LDR      R3,??DataTable1_11  ;; 0xffffbfff
        ANDS     R3,R3,R2
        STR      R3,[R0, #+0]
//   94    DMA1_Channel1->CCR &= ~DMA_CCR_DIR;   
        LDR      R2,[R0, #+0]
        MOVS     R3,#+16
        BICS     R2,R2,R3
        STR      R2,[R0, #+0]
//   95    DMA1_Channel1->CCR &= ~DMA_CCR_PL_Msk;
        LDR      R2,[R0, #+0]
        LDR      R3,??DataTable1_12  ;; 0xffffcfff
        ANDS     R3,R3,R2
        STR      R3,[R0, #+0]
//   96    DMA1_Channel1->CCR |= DMA_CCR_MSIZE_0;
        LDR      R2,[R0, #+0]
        LSRS     R3,R0,#+20
        ORRS     R3,R3,R2
        STR      R3,[R0, #+0]
//   97    DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0;
        LDR      R2,[R0, #+0]
        LSRS     R3,R0,#+22
        ORRS     R3,R3,R2
        STR      R3,[R0, #+0]
//   98    DMA1_Channel1->CCR |= DMA_CCR_MINC;
        LDR      R2,[R0, #+0]
        ORRS     R1,R1,R2
        STR      R1,[R0, #+0]
//   99    DMA1_Channel1->CCR |= DMA_CCR_CIRC;
        LDR      R1,[R0, #+0]
        MOVS     R2,#+32
        ORRS     R2,R2,R1
        STR      R2,[R0, #+0]
//  100    DMA1_Channel1->CCR |= DMA_CCR_HTIE;
        LDR      R1,[R0, #+0]
        MOVS     R2,#+4
        ORRS     R2,R2,R1
        STR      R2,[R0, #+0]
//  101    DMA1_Channel1->CCR |= DMA_CCR_TCIE;
        LDR      R1,[R0, #+0]
        MOVS     R2,#+2
        ORRS     R2,R2,R1
        STR      R2,[R0, #+0]
//  102    DMA1_Channel1->CCR |= DMA_CCR_EN;
        LDR      R1,[R0, #+0]
        MOVS     R2,#+1
        ORRS     R2,R2,R1
        STR      R2,[R0, #+0]
Вариант

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

   DMA1_Channel1->CCR = DMA_CCR_MSIZE_0
                      | DMA_CCR_PSIZE_0
                      | DMA_CCR_MINC
                      | DMA_CCR_CIRC
                      | DMA_CCR_HTIE
                      | DMA_CCR_TCIE
                      | DMA_CCR_EN;
Спойлер

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

//  105    DMA1_Channel1->CCR = DMA_CCR_MSIZE_0
//  106                       | DMA_CCR_PSIZE_0
//  107                       | DMA_CCR_MINC
//  108                       | DMA_CCR_CIRC
//  109                       | DMA_CCR_HTIE
//  110                       | DMA_CCR_TCIE
//  111                       | DMA_CCR_EN;
        LDR      R0,??DataTable1_10  ;; 0x5a7
        LDR      R1,??DataTable1_11  ;; 0x40020008
        STR      R0,[R1, #+0]
Доходчиво?
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

VladislavS писал(а):Господа, вы можете писать КАК ХОТИТЕ, только не говорите мне, что я ошибаюсь в своих оценках!
А мы ничего не говорим. Ну, я ничего не говорю. :) Просто интересно, чтобы сразу было понятно, как лучше делать.
В данном случае да, ассемблер все разложил по полочкам. :))) Разница просто грандиозная.
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="pavell",url="/forum/viewtopic.php?p=3574849#p3574849"]А в чем собственно проблема? Адрес первого элемента массива это и есть указатель/ссылка на массив.[/uquote]Разберись уже что-ли: адрес, указатель или ссылка. :(
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):ассемблер все разложил по полочкам. Разница просто грандиозная
да только не понятно, грандиозность эта влияет на что-то или нет. в STM32 памяти просто грандиозное количество, настройка периферии делается, как правило, 1 раз за "сессию запитывания девайса"... и что даст выигрыш 5-6 слов памяти, если код для понимания новичку стал хуже? имхо, при обучении на первом месте должно быть понимание написанного кода, а не его оптимальность.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Я же сразу написал "ему так наглядней", а они давай спорить. Ну наглядней - флаг в руки, барабан на шею!

[uquote="ARV",url="/forum/viewtopic.php?p=3574874#p3574874"]и что даст выигрыш 5-6 слов памяти, если код для понимания новичку стал хуже?[/uquote]Спойлер открывал? 40 ассемблерных команд против 3?
Последний раз редактировалось VladislavS Чт фев 21, 2019 09:08:58, всего редактировалось 1 раз.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

ARV писал(а):грандиозность эта влияет на что-то или нет. в STM32 памяти просто грандиозное количество, настройка периферии делается, как правило, 1 раз за
Я думал об этом. И тем более по скорости начальная инициализация тоже особо ни на что не влияет. Но все равно, лучше привыкать к правильному сразу. ))) :)
Станислав
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):40 ассемблерных команд против 3?
0,49% против 0,037% от имеющейся памяти (для примера взял 32К) несущественны, имхо, в обоих случаях. а если новичок запутается в составном операторе, он потратит больше процентов своих нервных клеток, что важнее, имхо.
СКАЗОЧНИК писал(а):Но все равно, лучше привыкать к правильному сразу.
похвальное желание. но штангисты начинают всегда с малого веса, хотя стремятся к рекордам.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1456
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3574877#p3574877"]Но все равно, лучше привыкать к правильному сразу. ))) :)[/uquote]
Только правильное у каждого своё. А жизнь коротка.)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Всё гораздо проще. Когда пишешь на С/С++ какое-то выражение, то нужно понимать что оно делает и во что выливается в конечном счёте для микроконтроллера. Если этого понимания нет, то и появляются всякого рода "ни на что не влияет", "так понятнее" и т.д. А для этого понимания учиться надо, а не привыкать. Написал код, загляни в листинг, подумай...

[uquote="ARV",url="/forum/viewtopic.php?p=3574883#p3574883"]0,49% против 0,037% от имеющейся памяти (для примера взял 32К) несущественны, имхо, в обоих случаях.[/uquote]То есть, всего двести таких "удобных" обращений к регистрам и память тю-тю...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Когда пишешь на С/С++ какое-то выражение, то нужно понимать что оно делает и во что выливается в конечном счёте для микроконтроллера.
на определенном этапе опыта или в определенных условиях - да, это необходимо. особенно надо знать/понимать побочные эффекты, если они есть.
на этапе обучения - не думаю.
тем более что разные версии компиляторов, тем более для разных платформ, особенно с разными режимами оптимизации дают настолько разный результат... что делает почти бесполезной "абстрактную ручную оптимизацию на ЯВУ".

Добавлено after 2 minutes 12 seconds:
VladislavS писал(а):и память тю-тю...
так ведь всегда можно взять pin2pin совместимый МК с памятью побольше - они же копейки стоят! :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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