STM32G071K8 проблема с запуском

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

STM32G071K8 проблема с запуском

Сообщение Sergi »

Взял на пробу STM32G071K8T3. Раскуриваю тактирование. Столкнулся с проблемами.
Первая - не запускается HSE. С любыми кварцами и конденсаторами. На одном из форумов прочитал что в таком корпусе HSE не работает, только от внешнего генератора. При инициализации бит HSEON выставляется, но нет готовности HSERDY.
Вторая - не выставляется нужный коэффициент в умножителе PLL. 7ми битный PLLN имеет связанные биты 4,5,6. При установке бита 5 одновременно устанавливается бит 4. При этом к нужному коэфф умножения добавляется 16.
Кто сталкивался с G0 серией,подскажите настройку тактирования. Желательно на чистом CMSIS.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32G071K8 проблема с запуском

Сообщение Reflector »

Брал G071R8, все нормально работает. В твоем корпусе кварц просто некуда подключать, только часовой, потому непонятно как ты хочешь запустить HSE...
Реклама
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: STM32G071K8 проблема с запуском

Сообщение Sergi »

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

Re: STM32G071K8 проблема с запуском

Сообщение Reflector »

[uquote="Sergi",url="/forum/viewtopic.php?p=3783622#p3783622"]Попробую внешний генератор прицепить, все таки стабильность может потребоваться.[/uquote]
У этой серии немного другое назначение, а если нужна стабильность, то проще брать в корпусах на 48 ног. Касательно тактирования, я всегда ставлю кварц на 8 MHz, таким образом из HSE и HSI можно получить базовые 4 MHz, а из них частоты в диапазоне 16..86 MHz с шагом 1 MHz и далее до 172, хотя настолько сильно мк и не гонится, с шагом 2. Выглядит это так:

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

using pll = Pll<PllSrc::Hse_4M, 80, 4, 2, 0>;
Rcc::switchToPll<pll/*, AhbPresc::_1, ....*/>
Т.е. на главном канале будет 4*80/4 = 80 MHz, на Q будет 160, P выключен и т.к. это шаблон, то любая попытка прописать туда значения выходящие за рамки допустимых приводит к ошибке компиляции. В принципе если ограничится одним каналом, то можно и сразу желаемую частоту подставлять.

ps. Кстати, самой большой неприятной неожиданностью оказалось то, что у M0+ DMA не работает с портами, причем маркетологи ST пытаются представить это как преимущество, типа никакой DMA вам дергать ногами не помешает :)
Реклама
Эиком - электронные компоненты и радиодетали
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: STM32G071K8 проблема с запуском

Сообщение Sergi »

Что в руки попало то и мучаю. Есть много F030K6, там все понятно. Есть много разных генераторов в корпусах 7х6мм, надо найти с четной частотой. Про DMA - печаль, буду иметь в виду. Хотя в мануале нарисован прямой доступ ядра к GPIO надо проверить захват.
Пока разбирался с PLL случайно запускал ядро на 96 МГц, работал.
Мне бы еще АЦП запустить!
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32G071K8 проблема с запуском

Сообщение Reflector »

[uquote="Sergi",url="/forum/viewtopic.php?p=3783707#p3783707"]Про DMA - печаль, буду иметь в виду. Хотя в мануале нарисован прямой доступ ядра к GPIO надо проверить захват.[/uquote]
Именно, у ядра прямой доступ к портам минуя шины, потому за такт можно пинами дергать, но больше ни у кого этого доступа нет.
Пока разбирался с PLL случайно запускал ядро на 96 МГц, работал.
Пока из всех STM32 которые у меня были G0 самые разгоняемые, на 140MHz нормально работал проект с дисплеем.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32G071K8 проблема с запуском

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

Reflector писал(а):using pll = Pll<PllSrc::Hse_4M, 80, 4, 2, 0>;
Rcc::switchToPll<pll/*, AhbPresc::_1, ....*/>
Читаемость просто супер. :dont_know:
Если бы вы увидели что-то подобное у кого-то другого и не были знакомы с исходником библиотеки вам было понятно написанное и все однозначно трактовалось? :dont_know:
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32G071K8 проблема с запуском

Сообщение Reflector »

[uquote="Мурик",url="/forum/viewtopic.php?p=3783738#p3783738"]Читаемость просто супер. :dont_know:[/uquote]
Во-первых, это все-таки мой код и пишу я не в блокноте, потому наведя мышкой на имя класса всплывет подсказка с именами параметров. Во-вторых, делители шин обычно указывать не нужно, третий канал PLL практически никогда не используется, второй используется достаточно редко, в большинстве случаев останется:

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

using pll = Pll<PllSrc::Hse_4M, 80, 4>;
Rcc::switchToPll<pll>;
Это 80 MHz от HSE.

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

using pll = Pll<PllSrc::Hsi_4M, 60, 2, 3>;
Это 120 MHz от HSI на первом канале и 80(240 / 3) на втором, при этом автоматически задается латентность и в переменную сохраняется результирующая частота. Но нет предела совершенству, если покажешь как проще и безопаснее, то я с радостью эти передовые идеи позаимствую :)
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: STM32G071K8 проблема с запуском

Сообщение Sergi »

Появилась новая проблемка. Зависание при настройке АЦП и работающем DMA.
Инициализация и опрос канала АЦП.

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

void init_adc(void)
  {
		RCC->CCIPR |= RCC_CCIPR_ADCSEL_0; //PLLP clock
		RCC->APBENR2 |= RCC_APBENR2_ADCEN; 
		ADC1->CR |= ADC_CR_ADVREGEN;
		delay_us(100);
		ADC1->CFGR1 |=  ADC_CFGR1_RES_1;	//8bit 
		
		ADC1->CFGR2 |= ADC_CFGR2_CKMODE;
		ADC1->CHSELR = ADC_CHSELR_CHSEL1;
		ADC1->CR |= ADC_CR_ADCAL;	
		while (!(ADC1->ISR & ADC_ISR_EOCAL)){};
		ADC1->ISR |= ADC_ISR_EOCAL;
		ADC1->CR |= ADC_CR_ADEN;
  };
uint8_t read_adc(uint8_t chann)
	{	
		uint8_t i;
		ADC1->CR &=~ ADC_CR_ADSTART;
		ADC1->CR |= ADC_CR_ADDIS;	
		ADC1->CR |= ADC_CR_ADSTP; 
		ADC1->CHSELR = (1<<chann);
		ADC1->CFGR1 = 0;
		ADC1->CFGR1 |= ADC_CFGR1_RES_1;	
		ADC1->CFGR2 |= ADC_CFGR2_CKMODE;
		ADC1->CR &=~ ADC_CR_ADSTP;
		while (!(ADC1->ISR & ADC_ISR_CCRDY)){};
		ADC1->ISR |= ADC_ISR_CCRDY;
		ADC1->CR &=~ ADC_CR_ADDIS;	
		ADC1->CR |= ADC_CR_ADEN;
		while (!(ADC1->ISR & ADC_ISR_ADRDY)){};	//not set!!!
		ADC1->CR |= ADC_CR_ADSTART; 
		while (!(ADC1->ISR & ADC_ISR_EOC)){};
		i = (uint8_t)(ADC1->DR & 0xff);
		ADC1->CR &=~ ADC_CR_ADSTART;
		ADC1->CR |= ADC_CR_ADSTP;
		return i; 
	};
Все работает. Использую для опроса тача и напряжения батареи. Если запустить вот этот код,

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

void init_dds (void)
	{	
		RCC->AHBENR |= RCC_AHBENR_DMA1EN; 
		DMAMUX1_Channel1->CCR = 39;
		DMA1_Channel2->CPAR = (uint32_t) (&(DAC1->DHR12R1)); 
		DMA1_Channel2->CMAR = (uint32_t)(DAC_buff); 
		DMA1_Channel2->CNDTR = 512; 
		DMA1_Channel2->CCR |= DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_DIR | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0; 
		
		RCC->APBENR1 |= RCC_APBENR1_TIM7EN;
		TIM7->PSC = 0;
		TIM7->ARR = 140 - 1;										//1kHz
		TIM7->CNT = 0;
		TIM7->CR2 |= TIM_CR2_MMS_1; 						//trgo update
		TIM7->DIER |= TIM_DIER_UDE;
		
		RCC->APBENR1 |= RCC_APBENR1_DAC1EN;
		DAC1->CR |= (0x06<<2);									//TIM7 trgo	
		DAC1->CR |= DAC_CR_EN1; 
		DMA1_Channel2->CCR |= DMA_CCR_EN;
		TIM7->CR1 |= TIM_CR1_CEN;
	};
то через некоторое время(0-2сек) зависает на строке ожидания флага ADRDY.
При этом DMA работает и на выходе DAC есть сигнал.
Если не устанавливать TIM_DIER_UDE зависания нет и конечно DMA не работает, на выходе DAC устанавливается сигнал из DAC_buff[0].
Есть мысли как работа DMA влияет на флаги АЦП?
Ответить

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