Например TDA7294

Форум РадиоКот • Просмотр темы - stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср июл 30, 2025 19:45:37

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
СообщениеДобавлено: Пн май 25, 2020 13:50:44 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
[code][/code]
/*
* main.c
*
* Created on: 20 бер. 2020 р.
* Author: Ivan
*/
#include "main.h"
#include "stm32f103xb.h"
#include "stm32f1xx.h"
//#define start_converADC2 ADC
volatile unsigned int adc_data1=0;
volatile unsigned int adc_data2=0;
volatile unsigned int pauza=0;
//int bufer=TIM4->CCR1*16;
void pauzat (int T)//ввод самой паузы(программы) она написана отдельно и введеннием #include "paua.h"можно писать в основном цыкле pauza()с вводом целой переменной T
{
int i=0;//введение целойперемменой i
char t=0;// введение вещественной переменной t считает такты микроконтролера
for(i=0;i<T;t++) //програмама в цыкле
{
if(t==255)i=i+1;// условия одного цыкла счёта пределитель i определяется регистром TCCR2 определяется 0.1.2 битами это делителем частоты работы таймера
}
}
void ADC1_2_IRQHandler(void)
{

// ADC1->SR &=~ ADC_SR_EOC;
// ADC2->SR &=~ ADC_SR_EOC;
// ADC1->DR=ADC_DR_DATA ;
// adc_data1 = ADC1->DR ;
// TIM4->CCR1=adc_data1*16;


// ADC2->DR=ADC_DR_ADC2DATA ;
// adc_data2 =ADC2->DR;



// TIM4->CCR2=adc_data2*16;



}

void TIM1_UP_IRQHandler(void)
{
TIM1->SR &= ~ TIM_SR_UIF;
IWDG->KR = 0xAAAA;
pauza++;
if(pauza>10)
{
// GPIOC->ODR|=GPIO_ODR_ODR13 ;
}
if(pauza>20)
{
// GPIOC->ODR&=~GPIO_ODR_ODR13 ;
pauza=0;
}
}
void tx_uart(char data)
{
while (!(USART1->SR & USART_SR_TC)); // Ждем пока бит TC в регистре SR станет 1
USART1->DR=data;

}
void RCC_init(void)
{
FLASH->ACR|=FLASH_ACR_PRFTBE;
//FLASH->ACR&=~FLASH_ACR_LATENCY ;
FLASH->ACR|=FLASH_ACR_LATENCY_2;
RCC->CR|=RCC_CR_HSEON ;
while(!(RCC->CR& RCC_CR_HSERDY) )
{

}
RCC->CR|=RCC_CR_CSSON;
RCC->CFGR&=~RCC_CFGR_SW;
RCC->CFGR&=~RCC_CFGR_PLLSRC;
RCC->CFGR&=~RCC_CFGR_PLLXTPRE;
RCC->CFGR&=~RCC_CFGR_PLLMULL;
RCC->CFGR|=RCC_CFGR_PLLMULL9 ;
RCC->CFGR|=RCC_CFGR_HPRE_DIV1;
RCC->CFGR|=RCC_CFGR_PPRE1_DIV2;
RCC->CFGR|=RCC_CFGR_PPRE2_DIV1;
RCC->CFGR|=RCC_CFGR_ADCPRE_DIV6 ;
RCC->CFGR|=RCC_CFGR_PLLSRC;
RCC->CR|= RCC_CFGR_PLLXTPRE_HSE;
RCC->CR|=RCC_CR_PLLON ;
while(!(RCC->CR &RCC_CR_PLLRDY))
{

}

RCC->CFGR|=RCC_CFGR_SW_PLL;
while(!( RCC->CFGR&RCC_CFGR_SWS ))
{

}
}
void sys_timer_init(void)
{

}

void GPIOC_init(void)
{
RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
GPIOC->CRH&=~GPIO_CRH_CNF13;
GPIOC->CRH|= GPIO_CRH_MODE13_1;
}
void APB_init(void)
{
RCC->APB1ENR|=RCC_APB2ENR_IOPAEN;
RCC->APB2ENR|=RCC_APB2ENR_IOPBEN ;
RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;



}
void porta_inifs(void)
{
//RCC->APB1ENR|=RCC_APB2ENR_IOPAEN;

}
void usart1_init(void)
{
RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
GPIOA->CRH|=GPIO_CRH_CNF9_1;
GPIOA->CRH&=~GPIO_CRH_CNF9_0;
GPIOA->CRH|= GPIO_CRH_MODE9_1;
GPIOA->CRH|= GPIO_CRH_MODE9_0;
GPIOA->CRH|=GPIO_CRH_CNF9_1;
GPIOA->CRH&=~GPIO_CRH_CNF10_0;
GPIOA->CRH|= GPIO_CRH_MODE10_1;
GPIOA->CRH|= GPIO_CRH_MODE10_0;
AFIO->MAPR&=~AFIO_MAPR_USART1_REMAP ;
USART1->CR1|=USART_CR1_UE;
USART1->CR1|=USART_CR1_M;
USART1->CR2&= ~USART_CR2_STOP;

USART1->BRR = 0x222E;
USART1->CR1|=USART_CR1_TE;
USART1->CR1|=USART_CR1_RE;
USART1->CR1 |= USART_CR1_RXNEIE; // Разрешить прерывание по приему данных
NVIC_EnableIRQ (USART1_IRQn);
}
void adc1_init(void)
{

// RCC->CFGR &=~ RCC_CFGR_ADCPRE;

// RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
GPIOA->CRL&=~GPIO_CRL_CNF1;
GPIOA->CRL&=~ GPIO_CRL_MODE1;
GPIOA->CRL&=~GPIO_CRL_CNF2;
GPIOA->CRL&=~ GPIO_CRL_MODE2;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;

//RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;

//подаем тактирование АЦП
ADC1->CR2 |= ADC_CR2_RSTCAL;
while (!(ADC1->CR2 & ADC_CR2_RSTCAL))
{
}

ADC1->CR2 |= ADC_CR2_CAL;
// while (!(ADC1->CR2 & ADC_CR2_CAL));
// {
// }

ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП
ADC1->CR2 |= ADC_CR2_EXTSEL;
// ADC1->CR1|=ADC_CR1_SCAN ;
ADC1->CR2 |= ADC_CR2_EXTTRIG;
// ADC1->CR1&=~ADC_CR1_DUALMOD;
ADC1->SMPR2&=~ ADC_SMPR2_SMP1_0; //1
ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1
ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1

ADC1->SQR3 |= ADC_SQR3_SQ1_0; //1 IN1
ADC1->SQR3 &= ~ ADC_SQR3_SQ1_1; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0
ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0
ADC1->SQR3 &= ~ADC_SQR3_SQ1_4;
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART;
//}
//void adc2_init(void)
//{
//RCC->CFGR &=~ RCC_CFGR_ADCPRE;
//RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
// GPIOA->CRL&=~GPIO_CRL_CNF2;
// GPIOA->CRL&=~ GPIO_CRL_MODE2;
// RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;
// RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
// ADC2->CR2 |= ADC_CR2_RSTCAL;
// while (!(ADC2->CR2 & ADC_CR2_RSTCAL))
// {
// }

// ADC2->CR2 |= ADC_CR2_CAL;
//ADC2->CR2 |=ADC_CR2_CONT;//включить АЦП
//ADC2->CR2 |= ADC_CR2_EXTSEL;
// ADC2->CR2 |= ADC_CR2_EXTTRIG;
//ADC2->SMPR2&=~ ADC_SMPR2_SMP2_0; //1
// ADC2->SMPR2&=~ADC_SMPR2_SMP2_1; //1
// ADC2->SMPR2 &=~ ADC_SMPR2_SMP2_2; //1
// ADC2->SQR3 &=~ ADC_SQR3_SQ1_0; //1 IN1
// ADC2->SQR3 |= ADC_SQR3_SQ1_1; //0
// ADC2->SQR3 &= ~ADC_SQR3_SQ1_2; //0
// ADC2->SQR3 &=~ ADC_SQR3_SQ1_3; //0
// ADC2->SQR3 &= ~ADC_SQR3_SQ1_4;
// ADC2->CR2 |= ADC_CR2_ADON;
}
void DMA_init(void)
{
RCC->AHBENR|=RCC_AHBENR_DMA1EN;
DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR;
DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR1;
DMA1_Channel1->CNDTR=1;
DMA1_Channel1->CCR|=DMA_CCR_CIRC;
DMA1_Channel1->CCR&=~DMA_CCR_PINC ;
DMA1_Channel1->CCR&=~DMA_CCR_MINC;
DMA1_Channel1->CCR|=DMA_CCR_PSIZE_0 ;
DMA1_Channel1->CCR|=DMA_CCR_MSIZE_0;
DMA1_Channel1->CCR&=~DMA_CCR_DIR ;
DMA1_Channel1->CCR|=DMA_CCR_EN ;
ADC1->CR2|=ADC_CR2_DMA;
}
void timer1_init(void)
{

RCC-> APB2ENR |=RCC_APB2ENR_TIM1EN;
// NVIC_EnableIRQ (TIM2_IRQn);
//TIM2->CR1&=~ TIM_CR1_CEN;
TIM1->PSC = 2400-1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM1->ARR = 20 ;
TIM1->RCR=10-1;

TIM1->DIER |= TIM_DIER_UIE;
TIM1->EGR = TIM_EGR_UG ;

TIM1->CR1|= TIM_CR1_CEN;
NVIC_EnableIRQ (TIM1_UP_IRQn);
}
void timer2_init(void)
{
//RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;

RCC-> APB1ENR |=RCC_APB1ENR_TIM2EN;
RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;
// GPIOA->CRH&=~GPIO_CRH_CNF15_1;
// GPIOA->CRH|=GPIO_CRH_CNF15_1;

// GPIOA->CRH&=~GPIO_CRH_MODE15;
// GPIOA->CRH|=GPIO_CRH_MODE15;
// AFIO-> MAPR|=AFIO_MAPR_TIM2_REMAP ;
// NVIC_EnableIRQ (TIM2_IRQn);
//TIM2->CR1&=~ TIM_CR1_CEN;
TIM2->PSC = 0; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM2->ARR = 65535 ;
// TIM2->DIER |= TIM_DIER_UIE;
TIM2->EGR |= TIM_EGR_UG ;
TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
// TIM2->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;
// TIM2->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1;
// TIM2->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;
TIM2->CCER |=TIM_CCER_CC1E;
// TIM2->CCER =TIM_CCER_CC2E;
// TIM2->CCER =TIM_CCER_CC3E;
// TIM2->CCER =TIM_CCER_CC4E;
TIM2->CCER&=~TIM_CCER_CC1P;
TIM2->CR1&=~TIM_CR1_DIR;
// NVIC_EnableIRQ (TIM2_IRQn);
// TIM2->CCR1=0;
// TIM2->CCR2=0;
// TIM2->CCR3=0;
// TIM2->CCR4=0;

TIM2->CR1|= TIM_CR1_CEN;
// NVIC_EnableIRQ (TIM2_IRQn);
}
void timer3_init(void)
{
RCC-> APB1ENR |=RCC_APB1ENR_TIM3EN;
TIM3->PSC = 9; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM3->ARR = 7000 ;

TIM3->EGR |= TIM_EGR_UG ;
TIM3->CR1|= TIM_CR1_CEN;
}
void init_pwm_timer4(void)
{

//RCC->APB2ENR|=RCC_APB2ENR_IOPBEN ;

GPIOB->CRL|=GPIO_CRL_CNF6_1;
GPIOB->CRL&=~GPIO_CRL_CNF6_0;
GPIOB->CRL|= GPIO_CRL_MODE6_1;
GPIOB->CRL|= GPIO_CRL_MODE6_0;
//--настройка второго канала шим-порт7------//
GPIOB->CRL|=GPIO_CRL_CNF7_1;
GPIOB->CRL&=~GPIO_CRL_CNF7_0;
GPIOB->CRL|= GPIO_CRL_MODE7_1;
GPIOB->CRL|= GPIO_CRL_MODE7_0;
GPIOB->CRH|=GPIO_CRH_CNF8_1;
GPIOB->CRH&=~GPIO_CRH_CNF8_0;
GPIOB->CRH|= GPIO_CRH_MODE8_1;
GPIOB->CRH|= GPIO_CRH_MODE8_0;

//--настройка второго канала шим-порт9------//
GPIOB->CRH|=GPIO_CRH_CNF9_1;
GPIOB->CRH&=~GPIO_CRH_CNF9_0;
GPIOB->CRH|= GPIO_CRH_MODE9_1;
GPIOB->CRH|= GPIO_CRH_MODE9_0;
// RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;
AFIO->MAPR&=~AFIO_MAPR_TIM4_REMAP;
RCC->APB1ENR|= RCC_APB1ENR_TIM4EN ;
TIM4->PSC= 0;
TIM4->ARR= 4095;
TIM4->CCMR1&=~TIM_CCMR1_CC1S;//настройка канала 1 на выход.
TIM4->CCMR1&=~TIM_CCMR1_CC2S;//настройка канала 2 на выход.
TIM4->CCMR2&=~TIM_CCMR2_CC3S;
TIM4->CCMR2&=~TIM_CCMR2_CC4S;
TIM4->CR1&=~TIM_CR1_DIR;
TIM4->CCMR1|= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;//|TIM_CCMR1_OC1M_0;//;//
TIM4->CCMR1|= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;//|TIM_CCMR1_OC2M_0;//
TIM4->CCMR2|= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1;//|TIM_CCMR1_OC2M_0;//
TIM4->CCMR2|= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;


TIM4->CCMR1|=TIM_CCMR1_OC1PE;
TIM4->CCMR1|=TIM_CCMR1_OC2PE;
TIM4->CCMR2|=TIM_CCMR2_OC3PE;
TIM4->CCMR2|=TIM_CCMR2_OC4PE;




TIM4->CCER |=TIM_CCER_CC1E;
TIM4->CCER |=TIM_CCER_CC2E;
TIM4->CCER |=TIM_CCER_CC3E;
TIM4->CCER |=TIM_CCER_CC4E;
TIM4->CCER &=~TIM_CCER_CC1P;
TIM4->CCER &=~TIM_CCER_CC2P;
TIM4->CCER &=~TIM_CCER_CC3P;
TIM4->CCER &=~TIM_CCER_CC4P;
TIM4->CR1|=TIM_CR1_ARPE;
TIM4->EGR|= TIM_EGR_UG;
// TIM4->CCR1=30000;
TIM4->CR1|= TIM_CR1_CEN;
}

void IWDT_init(void)
{
RCC->CSR|= RCC_CSR_LSION;


IWDG->KR = 0x5555; // Access to registers
IWDG->PR&= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096
IWDG->RLR = 2000;//0x7FF;
while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set.
IWDG->KR = 0xCCCC; // Start count down;
}

int main(void)
{
RCC_init();
APB_init();

GPIOC_init();

IWDT_init();
timer1_init();
timer2_init();
timer3_init();
init_pwm_timer4();

adc1_init();
DMA_init();
//adc2_init();
// ADC1->CR1|= ADC_CR1_EOCIE;
// ADC2->CR1|= ADC_CR1_EOCIE;
// ADC1->CR2 |= ADC_CR2_ADON;
//ADC2->CR2 |= ADC_CR2_ADON;

// NVIC_EnableIRQ ( ADC1_2_IRQn);


//ADC1->CR2 |= ADC_CR2_SWSTART;
// ADC2->CR2 |= ADC_CR2_SWSTART;
// ADC1->CR2 |= ADC_CR2_EXTSEL_2;
//TIM2->CCR1=1000;
while(1)
{
// TIM4->CCR1=65535;
// TIM4->CCR1=bufer;

//ADC1->CR2 |= ADC_CR2_SWSTART;
//ADC2->CR2 |= ADC_CR2_SWSTART;
// ADC1->CR2 |= ADC_CR2_EXTSEL_2;
// while (!(ADC1->SR & ADC_SR_EOC));
// while (!(ADC2->SR & ADC_SR_EOC));
// ADC1->SR &=~ ADC_SR_EOC;
// ADC2->SR &=~ ADC_SR_EOC;
// adc_data1 = ADC1->DR;
// TIM4->CCR1=adc_data1*16;
// ADC1->DR=0;
// ADC2->CR2 |= ADC_CR2_EXTSEL_2;
// while (!(ADC2->SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
//ADC1->SR &=~ ADC_SR_EOC;
//ADC2->SR &=~ ADC_SR_EOC;
// adc_data1 = ADC1->DR;
// adc_data2 = ADC2->DR;
// TIM4->CCR1=adc_data1*16;
// TIM4->CCR2=adc_data2*16;
TIM4->CCR2=4095;
TIM4->CCR3=4095;
TIM4->CCR4=4095;
// TIM4->CCR2=65535;

}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пн май 25, 2020 15:50:57 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2531
Рейтинг сообщения: 0
А кто это сделал???


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пн май 25, 2020 19:26:01 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
неправильно ну я.Не Всевышний.

Добавлено after 4 minutes 36 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Меня волнует проверка настройки RCC Каким образом проверить работу тактирования?

Добавлено after 5 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Меня волнует проверка настройки RCC Каким образом проверить работу тактирования?

Добавлено after 1 minute 27 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
И вобще должны быть коты а не дюдюка


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пн май 25, 2020 20:19:37 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2531
Рейтинг сообщения: 0
Меня волнует проверка настройки RCC Каким образом проверить работу тактирования?
Осциллографом.

Разгребать какашки нет никакого желания. Вот это точно рабочее
Код:
// Настройка FLASH
FLASH->ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY, 2);
// Включаем HSE
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM, 16) | RCC_CR_HSION | RCC_CR_HSEON;
// Ждём пока запустится HSE
while(!(RCC->CR & RCC_CR_HSERDY));
//Задаём источники тактирования и прескалеры
// SYSCLK = 72 МГц, USB = 48 МГц, PCLK1 = 36 МГц, PCLK2 = 72 МГц,  ADC = 12 МГц
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK |
            RCC_CFGR_USBPRE_1d5  |
            RCC_CFGR_PLLMULL9    |
            RCC_CFGR_PLLSRC_HSE  |
            RCC_CFGR_ADCPRE_DIV6 |
            //RCC_CFGR_PLLXTPRE  | // Раскомментировать для кварца 16 МГц
            RCC_CFGR_PPRE2_DIV1  |
            RCC_CFGR_PPRE1_DIV2  |
            RCC_CFGR_HPRE_DIV1   |
            RCC_CFGR_SW_HSE;
// Включаем PLL, выключаем HSI
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM, 16) | RCC_CR_HSEON | RCC_CR_PLLON;
// Ждём пока запустится PLL
while(!(RCC->CR & RCC_CR_PLLRDY));
//Переключаемся на PLL с установленнными ранее прескалерами
RCC->CFGR = RCC_CFGR_MCO_NOCLOCK |
            RCC_CFGR_USBPRE_1d5  |
            RCC_CFGR_PLLMULL9    |
            RCC_CFGR_PLLSRC_HSE  |
            RCC_CFGR_ADCPRE_DIV6 |
            //RCC_CFGR_PLLXTPRE  | // Раскомментировать для кварца 16 МГц
            RCC_CFGR_PPRE2_DIV1  |
            RCC_CFGR_PPRE1_DIV2  |
            RCC_CFGR_HPRE_DIV1   |
            RCC_CFGR_SW_PLL;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пн май 25, 2020 20:28:52 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
каким образом проверить? У меня только MCO не включен а так единтично.Ответте дюдюка


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пн май 25, 2020 21:25:53 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 179
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3379
Рейтинг сообщения: 0
Подключите отладчик. Посмотрите состояние флага RCC_CR_HSERDY.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Ср май 27, 2020 16:20:53 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
void RCC_init(void)
{

FLASH->ACR |= FLASH_ACR_PRFTEN ;
//FLASH->ACR &=~ (FLASH_ACR_LATENCY_2WS) ;
FLASH->ACR |= FLASH_ACR_LATENCY_2WS ;
RCC->CR |= RCC_CR_HSEON; // Enable HSE
while (!(RCC->CR & RCC_CR_HSERDY));

RCC->CR|=RCC_CR_CSSON;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLSRC;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLM;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLN;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLP;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLQ;
RCC->CFGR&=~ RCC_CFGR_SW ;
RCC->PLLCFGR |=RCC_PLLCFGR_PLLM_2;
RCC->PLLCFGR |=RCC_PLLCFGR_PLLN_7;
RCC->PLLCFGR |=RCC_PLLCFGR_PLLN_5;
RCC->PLLCFGR |=RCC_PLLCFGR_PLLN_3;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLP_1;
RCC->PLLCFGR &=~RCC_PLLCFGR_PLLP_0;
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;// настройка шины AHB
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;// настройка шины APB1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;// настройка шины APB2 RCC_PLLCFGR_PLLSRC_HSE
RCC->PLLCFGR |=RCC_PLLCFGR_PLLSRC;
RCC->CR |= RCC_CR_PLLON; // enable PLL
while(!(RCC->CR & RCC_CR_PLLRDY)) ; // wait till PLL is ready

RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL
while(!(RCC->CFGR & RCC_CFGR_SWS));


}

Почему на stmf4 не работает


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Ср май 27, 2020 17:04:01 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
Почему на stmf4 не работает

Почему не пользуемся отладчиком?
И 2WS для 168MHz не маловато?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Ср май 27, 2020 18:08:16 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2531
Рейтинг сообщения: 0
Почему на stmf4 не работает
Какой конкретно F4? Их немало вообще-то.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Ср май 27, 2020 19:47:54 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Да всемогущая дюдюка

Добавлено after 49 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Вы по регистрам поняли

Добавлено after 4 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Вы по регистрам поняли


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Чт май 28, 2020 07:34:38 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2531
Рейтинг сообщения: 0
А чего миндальничать, говнокод будем называть говнокодом. "Товарищ" как на форуме гадит, так и в коде.

СпойлерДоопределим немного констант
Код:
#define RCC_PLLCFGR_PLLP_DIV2              (0x0U << RCC_PLLCFGR_PLLP_Pos)     
#define RCC_PLLCFGR_PLLP_DIV4              (0x1U << RCC_PLLCFGR_PLLP_Pos)     
#define RCC_PLLCFGR_PLLP_DIV6              (0x2U << RCC_PLLCFGR_PLLP_Pos)     
#define RCC_PLLCFGR_PLLP_DIV8              (0x3U << RCC_PLLCFGR_PLLP_Pos)     
#define RCC_CFGR_MCO2_SYSCLK               (0x0U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLLI2S               (0x1U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_HSE                  (0x2U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLL                  (0x3U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2PRE_DIV1              (0x0U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_DIV2              (0x4U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_DIV3              (0x5U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_DIV4              (0x6U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_DIV5              (0x7U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO1PRE_DIV1              (0x0U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_DIV2              (0x4U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_DIV3              (0x5U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_DIV4              (0x6U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_DIV5              (0x7U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_I2SSRC_PLLI2S             (0x0U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_I2SSRC_EXT                (0x1U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_MCO1_HSI                  (0x0U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_LSE                  (0x1U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_HSE                  (0x2U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_PLL                  (0x3U << RCC_CFGR_MCO1_Pos)

Для F407 как-то так будет. Для остальных по аналогии.
Код:
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |
             FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;
 
//Включаем HSE = 8 MHz
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) |
          RCC_CR_HSION | RCC_CR_HSEON;
while(!(RCC->CR & RCC_CR_HSERDY));   

//Настройка PLL SYSCLK = 168 МГц  USB = 48 МГц 
RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE |
               _VAL2FLD(RCC_PLLCFGR_PLLQ,7) |
               _VAL2FLD(RCC_PLLCFGR_PLLN,168) |
               _VAL2FLD(RCC_PLLCFGR_PLLM,4) |
               RCC_PLLCFGR_PLLP_DIV2;

//Включаем PLL
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) |
          RCC_CR_HSION | RCC_CR_HSEON | RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY));
 
//Установим делители шин и переключаемся на PLL
RCC->CFGR = RCC_CFGR_MCO2_HSE |
            RCC_CFGR_MCO2PRE_DIV1 |
            RCC_CFGR_MCO1PRE_DIV1 |
            RCC_CFGR_I2SSRC_PLLI2S |
            RCC_CFGR_MCO1_HSE |
            _VAL2FLD(RCC_CFGR_RTCPRE,8) |
            RCC_CFGR_PPRE2_DIV2 |
            RCC_CFGR_PPRE1_DIV4 |
            RCC_CFGR_HPRE_DIV1 |
            RCC_CFGR_SW_PLL;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Чт май 28, 2020 09:07:46 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
Вы в какой среде писали?

Добавлено after 29 minutes 15 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
_VAL2FLD что это за оператор или команда?

Добавлено after 10 minutes 51 second:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
извините за моё незнание RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) |
RCC_CR_HSION | RCC_CR_HSEON Эти строки я так понимаю вы всё включаете?

Добавлено after 4 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
извините за моё незнание RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) |
RCC_CR_HSION | RCC_CR_HSEON Эти строки я так понимаю вы всё включаете?

Добавлено after 6 minutes 4 seconds:
Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
проблема в моей некомпетентности хочется больше инфы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Пт май 29, 2020 20:04:30 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 179
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3379
Рейтинг сообщения: 1
VladislavS писал(а):
А кто это сделал???


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Вс окт 25, 2020 08:48:25 
Мучитель микросхем

Карма: -8
Рейтинг сообщений: -23
Зарегистрирован: Вс дек 29, 2019 08:05:21
Сообщений: 440
Рейтинг сообщения: 0
[code][/code]
Какая то хрень .Как отключить всё ?На RCC?void RCC_init(void)
{
FLASH->ACR |=FLASH_ACR_PRFTBE ;
FLASH->ACR|=FLASH_ACR_LATENCY_2;

RCC->CR |=RCC_CR_HSEON ;
while(!(RCC->CR&RCC_CR_HSERDY ))
{

}
RCC->CR |=RCC_CR_CSSON ;
RCC->CFGR|=RCC_CFGR_PLLSRC;
RCC->CFGR|=RCC_CFGR_PLLXTPRE_HSE;

RCC->CFGR=RCC_CFGR_PLLMULL9;
RCC->CFGR|=RCC_CFGR_HPRE_DIV1; //_VAL2FLD(RCC_CFGR_HPRE,1);
RCC->CFGR|=RCC_CFGR_PPRE1_DIV2 ;//_VAL2FLD(RCC_CFGR_PPRE1,2);
RCC->CFGR|=RCC_CFGR_PPRE2_DIV1; //_VAL2FLD(RCC_CFGR_PPRE2,1);
RCC->CFGR|= RCC_CFGR_ADCPRE_DIV2;
RCC->CR|=RCC_CR_PLLON;
while(!(RCC->CR&RCC_CR_PLLRDY))
{

}

RCC->CFGR|=RCC_CFGR_SW_PLL;
while(!(RCC->CFGR&RCC_CFGR_SWS_PLL ))
{

}
}
Это контроллер stmf103
void RCC_init(void)
{

FLASH->ACR |= FLASH_ACR_PRFTEN ;
//FLASH->ACR &=~ (FLASH_ACR_LATENCY_2WS) ;
FLASH->ACR |= FLASH_ACR_LATENCY_2WS ;
RCC->CR|=RCC_CR_HSEON; // Enable HSE
while (!(RCC->CR & RCC_CR_HSERDY))
{

}


// RCC->CR|=RCC_CR_CSSON;

RCC->PLLCFGR |=RCC_PLLCFGR_PLLSRC_HSE ;
RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLM,4);
RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,168);
// RCC->PLLCFGR|=_VAL2FLD(RCC_PLLCFGR_PLLQ,9);
RCC->PLLCFGR|=_VAL2FLD(RCC_PLLCFGR_PLLP,2);
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;// настройка шины AHB
RCC->CFGR |= RCC_CFGR_PPRE1_DIV1;// настройка шины APB1

RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;

RCC->CR |= RCC_CR_PLLON; // enable PLL
while(!(RCC->CR & RCC_CR_PLLRDY))
{

}


RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL
while(!(RCC->CFGR & RCC_CFGR_SWS_PLL))
{

}

}
А это контроллер stm32f407 у меня вопрос к автору .Я проверяю по миганию светодиода .Выставил RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLM,4);
RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,210);

RCC->PLLCFGR|=_VAL2FLD(RCC_PLLCFGR_PLLP,4); почему при этой настройке у меня светодиод быстрее мегает?
И как сделать так на RCC чтоб полнастью отключить


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
СообщениеДобавлено: Вс окт 25, 2020 11:05:05 
Друг Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4468
Откуда: Главный Улей России (Moscow)
Рейтинг сообщения: 0
Для STM32F407 все просто.
Вот кусок кода с одного из моих проектов, который активирует HSE и ждет в течении
некоторого времени, когда он заведется.
Спойлер
Код:

  // Starting HSE clock generator
  RCC->CR |= RCC_CR_HSEON; // Enable HSE
  delayVar = SYSTIM_SetDelay(SYS_WAIT_ON_TIMEOUT);
  while(SYSTIM_CheckDelay(&delayVar) != 0) // wait untile HSERDY flag is set or time out
  {
    if((RCC->CR & RCC_CR_HSERDY) == 0)
    {
      continue;
    }
    else
    {
      SYS_ClearErrors(SYS_HSE_ERR); // HSE start OK
      // Enable CSS
      RCC->CR |= RCC_CR_CSSON;
      break;
    }
  }

////////////////////////////////////////////////////////////////////////////////
// NMI Handler
void NMI_Handler(void)
{
  if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail
  {
    RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag
    SYS_SetErrors(SYS_HSE_ERR | SYS_MPLL_ERR | SYS_PLLI2S_ERR);
    
    // Reconfigure system timer to work from HSI
    SysTick_Config(HSI_VAL / SYSTIM_PERIOD);
    // Call the HSE FAIL hook
    SYS_HseFail();
  }
}

Работает ли кварцевый генератор или нет, можно узнать
по состоянию бита RCC_CR_HSERDY в регистре RCC->CR.
Мало того, в моем коде активируется мониторинг тактирования, носящий название CSS.
В случае сбоев в тактировании, МК переходит на тактирование от внутреннего генератора
и генерирует прерывание NMI_Handler(). Помимо этого, CSS аппаратно блокирует выходы таймеров TIM1 и TIM8.
Это те, которые больше заточены для управления силовыми преобразователями и двигателями.

_________________
I am DX168B and this is my favourite forum on internet!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y