Код: Выделить всё
* 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;
}
}


