STM32G071K8 проблема с запуском
STM32G071K8 проблема с запуском
Взял на пробу STM32G071K8T3. Раскуриваю тактирование. Столкнулся с проблемами.
Первая - не запускается HSE. С любыми кварцами и конденсаторами. На одном из форумов прочитал что в таком корпусе HSE не работает, только от внешнего генератора. При инициализации бит HSEON выставляется, но нет готовности HSERDY.
Вторая - не выставляется нужный коэффициент в умножителе PLL. 7ми битный PLLN имеет связанные биты 4,5,6. При установке бита 5 одновременно устанавливается бит 4. При этом к нужному коэфф умножения добавляется 16.
Кто сталкивался с G0 серией,подскажите настройку тактирования. Желательно на чистом CMSIS.
Первая - не запускается HSE. С любыми кварцами и конденсаторами. На одном из форумов прочитал что в таком корпусе HSE не работает, только от внешнего генератора. При инициализации бит HSEON выставляется, но нет готовности HSERDY.
Вторая - не выставляется нужный коэффициент в умножителе PLL. 7ми битный PLLN имеет связанные биты 4,5,6. При установке бита 5 одновременно устанавливается бит 4. При этом к нужному коэфф умножения добавляется 16.
Кто сталкивался с G0 серией,подскажите настройку тактирования. Желательно на чистом CMSIS.
- Реклама
Re: STM32G071K8 проблема с запуском
Брал G071R8, все нормально работает. В твоем корпусе кварц просто некуда подключать, только часовой, потому непонятно как ты хочешь запустить HSE...
Re: STM32G071K8 проблема с запуском
Спасибо, разобрался на свежую голову. Множитель не очищал перед установкой. Теперь все четко.
Попробую внешний генератор прицепить, все таки стабильность может потребоваться.
Попробую внешний генератор прицепить, все таки стабильность может потребоваться.
Re: STM32G071K8 проблема с запуском
[uquote="Sergi",url="/forum/viewtopic.php?p=3783622#p3783622"]Попробую внешний генератор прицепить, все таки стабильность может потребоваться.[/uquote]
У этой серии немного другое назначение, а если нужна стабильность, то проще брать в корпусах на 48 ног. Касательно тактирования, я всегда ставлю кварц на 8 MHz, таким образом из HSE и HSI можно получить базовые 4 MHz, а из них частоты в диапазоне 16..86 MHz с шагом 1 MHz и далее до 172, хотя настолько сильно мк и не гонится, с шагом 2. Выглядит это так:
Т.е. на главном канале будет 4*80/4 = 80 MHz, на Q будет 160, P выключен и т.к. это шаблон, то любая попытка прописать туда значения выходящие за рамки допустимых приводит к ошибке компиляции. В принципе если ограничится одним каналом, то можно и сразу желаемую частоту подставлять.
ps. Кстати, самой большой неприятной неожиданностью оказалось то, что у M0+ DMA не работает с портами, причем маркетологи ST пытаются представить это как преимущество, типа никакой DMA вам дергать ногами не помешает
У этой серии немного другое назначение, а если нужна стабильность, то проще брать в корпусах на 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, ....*/>ps. Кстати, самой большой неприятной неожиданностью оказалось то, что у M0+ DMA не работает с портами, причем маркетологи ST пытаются представить это как преимущество, типа никакой DMA вам дергать ногами не помешает
Re: STM32G071K8 проблема с запуском
Что в руки попало то и мучаю. Есть много F030K6, там все понятно. Есть много разных генераторов в корпусах 7х6мм, надо найти с четной частотой. Про DMA - печаль, буду иметь в виду. Хотя в мануале нарисован прямой доступ ядра к GPIO надо проверить захват.
Пока разбирался с PLL случайно запускал ядро на 96 МГц, работал.
Мне бы еще АЦП запустить!
Пока разбирался с PLL случайно запускал ядро на 96 МГц, работал.
Мне бы еще АЦП запустить!
- Реклама
Re: STM32G071K8 проблема с запуском
[uquote="Sergi",url="/forum/viewtopic.php?p=3783707#p3783707"]Про DMA - печаль, буду иметь в виду. Хотя в мануале нарисован прямой доступ ядра к GPIO надо проверить захват.[/uquote]
Именно, у ядра прямой доступ к портам минуя шины, потому за такт можно пинами дергать, но больше ни у кого этого доступа нет.
Именно, у ядра прямой доступ к портам минуя шины, потому за такт можно пинами дергать, но больше ни у кого этого доступа нет.
Пока из всех STM32 которые у меня были G0 самые разгоняемые, на 140MHz нормально работал проект с дисплеем.Пока разбирался с PLL случайно запускал ядро на 96 МГц, работал.
Re: STM32G071K8 проблема с запуском
Читаемость просто супер.Reflector писал(а):using pll = Pll<PllSrc::Hse_4M, 80, 4, 2, 0>;
Rcc::switchToPll<pll/*, AhbPresc::_1, ....*/>
Если бы вы увидели что-то подобное у кого-то другого и не были знакомы с исходником библиотеки вам было понятно написанное и все однозначно трактовалось?
Re: STM32G071K8 проблема с запуском
[uquote="Мурик",url="/forum/viewtopic.php?p=3783738#p3783738"]Читаемость просто супер.
[/uquote]
Во-первых, это все-таки мой код и пишу я не в блокноте, потому наведя мышкой на имя класса всплывет подсказка с именами параметров. Во-вторых, делители шин обычно указывать не нужно, третий канал PLL практически никогда не используется, второй используется достаточно редко, в большинстве случаев останется:
Это 80 MHz от HSE.
Это 120 MHz от HSI на первом канале и 80(240 / 3) на втором, при этом автоматически задается латентность и в переменную сохраняется результирующая частота. Но нет предела совершенству, если покажешь как проще и безопаснее, то я с радостью эти передовые идеи позаимствую 
Во-первых, это все-таки мой код и пишу я не в блокноте, потому наведя мышкой на имя класса всплывет подсказка с именами параметров. Во-вторых, делители шин обычно указывать не нужно, третий канал PLL практически никогда не используется, второй используется достаточно редко, в большинстве случаев останется:
Код: Выделить всё
using pll = Pll<PllSrc::Hse_4M, 80, 4>;
Rcc::switchToPll<pll>;Код: Выделить всё
using pll = Pll<PllSrc::Hsi_4M, 60, 2, 3>;Re: STM32G071K8 проблема с запуском
Появилась новая проблемка. Зависание при настройке АЦП и работающем DMA.
Инициализация и опрос канала АЦП.
Все работает. Использую для опроса тача и напряжения батареи. Если запустить вот этот код,
то через некоторое время(0-2сек) зависает на строке ожидания флага ADRDY.
При этом DMA работает и на выходе DAC есть сигнал.
Если не устанавливать TIM_DIER_UDE зависания нет и конечно DMA не работает, на выходе DAC устанавливается сигнал из DAC_buff[0].
Есть мысли как работа 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;
};
При этом DMA работает и на выходе DAC есть сигнал.
Если не устанавливать TIM_DIER_UDE зависания нет и конечно DMA не работает, на выходе DAC устанавливается сигнал из DAC_buff[0].
Есть мысли как работа DMA влияет на флаги АЦП?


