Форум РадиоКот • Просмотр темы - stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 15 ]
Автор
Сообщение
ivan dimir
Заголовок сообщения: 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; } }
Вернуться наверх
Реклама
VladislavS
Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
Добавлено: Пн май 25, 2020 15:50:57
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2531
Рейтинг сообщения: 0
Вернуться наверх
Реклама
ivan dimir
Заголовок сообщения: 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 И вобще должны быть коты а не дюдюка
Вернуться наверх
VladislavS
Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
Добавлено: Пн май 25, 2020 20:19:37
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2531
Рейтинг сообщения: 0
Меня волнует проверка настройки RCC Каким образом проверить работу тактирования?
Осциллографом.
Разгребать какашки нет никакого желания. Вот это точно рабочее
Код:
FLASH-> ACR = FLASH_ACR_PRFTBE | _VAL2FLD(FLASH_ACR_LATENCY, 2 ); RCC-> CR = _VAL2FLD(RCC_CR_HSITRIM, 16 ) | RCC_CR_HSION | RCC_CR_HSEON;while (!(RCC-> CR & RCC_CR_HSERDY)); RCC-> CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_USBPRE_1d5 | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_ADCPRE_DIV6 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_HSE; RCC-> CR = _VAL2FLD(RCC_CR_HSITRIM, 16 ) | RCC_CR_HSEON | RCC_CR_PLLON;while (!(RCC-> CR & RCC_CR_PLLRDY)); RCC-> CFGR = RCC_CFGR_MCO_NOCLOCK | RCC_CFGR_USBPRE_1d5 | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_ADCPRE_DIV6 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
Вернуться наверх
ivan dimir
Заголовок сообщения: 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.
Вернуться наверх
Реклама
ivan dimir
Заголовок сообщения: 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 не работает
Вернуться наверх
Reflector
Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
Добавлено: Ср май 27, 2020 17:04:01
Поставщик валерьянки для Кота
Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03Сообщений: 2089
Рейтинг сообщения: 0
Почему на stmf4 не работает
Почему не пользуемся отладчиком?
И 2WS для 168MHz не маловато?
Вернуться наверх
VladislavS
Заголовок сообщения: Re: stm32f1 stm32f4 cmsis RCC настройка как проверить работу
Добавлено: Ср май 27, 2020 18:08:16
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 428
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2531
Рейтинг сообщения: 0
Почему на stmf4 не работает
Какой конкретно F4? Их немало вообще-то.
Вернуться наверх
Реклама
ivan dimir
Заголовок сообщения: 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 Вы по регистрам поняли
Вернуться наверх
VladislavS
Заголовок сообщения: 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; RCC-> CR = _VAL2FLD(RCC_CR_HSITRIM,16 ) | RCC_CR_HSION | RCC_CR_HSEON;while (!(RCC-> CR & RCC_CR_HSERDY)); 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; RCC-> CR = _VAL2FLD(RCC_CR_HSITRIM,16 ) | RCC_CR_HSION | RCC_CR_HSEON | RCC_CR_PLLON; while (!(RCC-> CR & RCC_CR_PLLRDY)); 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;
Вернуться наверх
ivan dimir
Заголовок сообщения: 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 писал(а):
А кто это сделал???
VIDEO
Вернуться наверх
ivan dimir
Заголовок сообщения: 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 чтоб полнастью отключить
Вернуться наверх
DX168B
Заголовок сообщения: 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!
Вернуться наверх
Страница 1 из 1
[ Сообщений: 15 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения