GPIO
#include "stm32f10x.h"
int main(void)
{
// RCC->APB2ENR=0x00000014;
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; // enable port A
RCC->APB2ENR|=RCC_APB2ENR_IOPCEN; // enable port C
// GPIOC->CRH=0x00000011; //push/pull на С выводы 8, 9
GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
while(1)
{
if(!((GPIOA->IDR)&0x00000001))
{
GPIOC->ODR=0x00000100; //восьмой - зеленый
}
else
{
GPIOC->ODR=0x00000200; // девятый синий
}
}
}
Timer
#include "stm32f10x.h"
int r=0;// это флаг
void TIM2_IRQHandler (void)
{
TIM2->CR1=0x0000; // не enable(бит0)
// TIM2->CR1 &=~TIM_CR1_CEN;
TIM2->SR=TIM2->SR & 0xFFFE; //В status reg обнуляем нулевой бит - UIF
// TIM2->SR&=~TIM_SR_UIF;
if (r==1) { r=2; GPIOC->ODR=0x00000100; //восьмой - зеленый
}
else { r=1; GPIOC->ODR=0x00000200; /*девятый - синий*/
}
TIM2->CNT=0x7530; // от чего считаем
TIM2->CR1=0x0001; // enable(бит0)
// TIM2->CR1|=TIM_CR1_CEN;
}
int main(void)
{
__enable_irq(); // общее включение прерывания
NVIC_EnableIRQ(TIM2_IRQn); //прерывание второго таймера - обработчик
RCC->APB1ENR=0x00000001; // таймер2 enable
// RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
RCC->APB2ENR=0x00000010; // порт C enable
// RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
// GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
TIM2->CNT=0x7530; // предв знач счит с него до 65535
TIM2->PSC=0x00E4; //228 предделитель
TIM2->DIER=0x0001; //прер по переполнен UIE
// TIM2->DIER|=TIM_DIER_UIE;
TIM2->CR1=0x0001; // запуск таймера
// TIM2->CR1|=TIM_CR1_CEN;
int i;
while (1)
{
i++;
}
}
#include "stm32f10x.h"
int r=0;// - флаг
void TIM2_IRQHandler (void)
{
TIM2->CR1=TIM2 ->CR1 & 0xFFFE;//таймер не enable(бит0)
// TIM2->CR1 &=~TIM_CR1_CEN;
TIM2->SR=TIM2->SR & 0xFFFD; //В status reg обнуляем второй бит - 1 - OCR1
// TIM2->SR&=~TIM_SR_CC1IF;
if (r==1) { r=2; GPIOC->ODR=0x00000100; //восьмой - зеленый
}
else { r=1; GPIOC->ODR=0x00000200; /*девятый - синий*/
}
TIM2->CR1=TIM2->CR1 | 0x0001; //таймер enable(бит0)
// TIM2->CR1|=TIM_CR1_CEN;
}
int main(void)
{
__enable_irq(); // общее включение прерывания
NVIC_EnableIRQ(TIM2_IRQn);
RCC->APB1ENR=0x00000001; // таймер2 enable
// RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
RCC->APB2ENR=0x00000010; // порт C enable
// RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
// GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
TIM2->PSC=0x00E4; //228 предделитель
TIM2->DIER=0x0002; //прер по сравн первый канал бит - CC1IE
// TIM2->DIER |= TIM_DIER_CC1IE;
TIM2->CCR1=0x7000; //уровень сравнения - когда возн прер по сравн
TIM2->ARR= 0x7530; //auto reload reg - до чего считаем ( вершина )
TIM2->CR1=0x00E1; // таймер enable(бит0) напр счета от 0 (бит4 DIR если 1 к 0)0,
//ARPE бит enable граница до кот счет бит 7 в 1 -( т е 8)
// 6-5-биты CMS-center align mode-туда-сюда -(11)
// TIM2->CR1|=TIM_CR1_CMS;
// TIM2->CR1|=TIM_CR1_ARPE;
// TIM2->CR1|=TIM_CR1_CEN;
int i = 0;
while (1)
{
i++;
}
}
Timer PWM
#include "stm32f10x.h"
int s=0;// - флаг
void TIM2_IRQHandler (void)
{
TIM2->CR1=TIM2 ->CR1 & 0xFFFE; //таймер не enable(бит0)
// TIM2->CR1 &=~TIM_CR1_CEN;
TIM2->SR=TIM2->SR & 0xFFFD; //В status reg обнуляем второй бит - 1 - OCR1
// TIM2->SR&=~TIM_SR_CC1IF;
if (s==1) { s=2; GPIOC->ODR=0x00000000;
}
else { s=1; GPIOC->ODR=0x00000300; // плавно мерцают оба
}
if ((TIM2->CCR1) < 0x8400 ) {(TIM2->CCR1)=(TIM2->CCR1) + 0x007F;}
else {(TIM2->CCR1) = 0x007F ;}
if ((TIM2->CR1) & 0x0010 ) {(TIM2->CNT)=(TIM2->CNT) + 0x007F ;}// коррекция значения
//счетчика чтобы не перескакивать сравнение
else {(TIM2->CNT) = (TIM2->CNT)+ 0x007F ;}
TIM2->CR1=TIM2->CR1 | 0x0001; //таймер enable(бит0)
// TIM2->CR1|=TIM_CR1_CEN;
}
int main(void)
{
__enable_irq(); // общее включение прерывания
NVIC_EnableIRQ(TIM2_IRQn);
RCC->APB1ENR=0x00000001; // таймер2 enable
// RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
RCC->APB2ENR=0x00000010; // порт C enable
// RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
// GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
TIM2->PSC=0x0001; // предделитель
TIM2->DIER=0x0002; //прер по сравн первый канал бит - CC1IE
// TIM2->DIER |= TIM_DIER_CC1IE;
TIM2->CCR1=0x4000; //уровень сравнения - когда возн прер по сравн
TIM2->ARR= 0x8550; //auto reload reg - до чего считаем ( вершина )
TIM2->CR1=0x00E1; // таймер enable(бит0) напр счета от 0 (бит4 DIR если 1 к 0)0,
//ARPE бит enable граница до кот счет бит 7 в 1 -( т е 8)
// 6-5-биты CMS-center align mode-туда-сюда -(11)
// TIM2->CR1|=TIM_CR1_CMS;
// TIM2->CR1|=TIM_CR1_ARPE;
// TIM2->CR1|=TIM_CR1_CEN;
int i = 0;
while (1)
{
i++;
}
}
Timer synhro master/slave
#include "stm32f10x.h"
int r=0;
int s=0;
void TIM1_UP_TIM16_IRQHandler (void)
{
TIM1->CR1=TIM1 ->CR1 & 0xFFFE; // не enable(бит0)
// TIM1->CR1 &=~TIM_CR1_CEN;
TIM1->SR=TIM1->SR & 0xFFFE; //В status reg обнуляем бит - 0 - UIF
// TIM1->SR&=~TIM_SR_UIF;
if (s==1) { s=2; GPIOC->ODR=GPIOC->ODR & 0xFFFFFDFF;
}
else { s=1; GPIOC->ODR=GPIOC->ODR | 0x00000200;
}
TIM1->CR1=TIM1->CR1 | 0x0001; //enable(бит0)
// TIM1->CR1 |= TIM_CR1_CEN;
}
void TIM2_IRQHandler (void)
{
TIM2->CR1=TIM2 ->CR1 & 0xFFFE; // не enable(бит0)
// TIM2->CR1 &=~TIM_CR1_CEN;
TIM2->SR=TIM2->SR & 0xFFFE; //В status reg обнуляем второй бит - 0 - UIF
// TIM2->SR &=~ TIM_SR_UIF;
if (r==1) { r=2; GPIOC->ODR=GPIOC->ODR & 0xFFFFFEFF;
}
else { r=1; GPIOC->ODR=GPIOC->ODR | 0x00000100;
}
TIM2->CR1=TIM2->CR1 | 0x0001; //enable(бит0)
// TIM2->CR1 |= TIM_CR1_CEN;
}
int main(void)
{
__enable_irq(); // тотальное включение прерывания
NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn );
NVIC_EnableIRQ(TIM2_IRQn);
RCC->APB1ENR=0x00000001; // таймер2 enable
// RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
RCC->APB2ENR=0x00000810; // таймер 1 enable , порт C enable
// RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
// RCC->APB2ENR|=RCC_APB2ENR_TIM1EN;
GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
// GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
// TIMER_2
//master
TIM2->CR2=0x0020; // master timer update mode mms - 010;
// TIM2->CR2|=TIM_CR2_MMS_1;
//
TIM2->PSC=0x0FFF; // предделитель
TIM2->DIER=0x0001; //прер по переполн
// TIM2->DIER |= TIM_DIER_UIE;
TIM2->ARR= 0x01E8; // - до чего считаем ( вершина )
// TIMER_1
//slave
TIM1->SMCR=0x0017; //external clock mode sms - 111,
//TS для таймера 1 по таблице синхр от таймера 2 - 001
// TIM1->SMCR|=TIM_SMCR_SMS;
// TIM1->SMCR|=TIM_SMCR_TS_0;
//
TIM1->PSC=0x0001; //предделитель
TIM1->DIER=0x0001; //прер по переполн
// TIM1->DIER |= TIM_DIER_UIE;
TIM1->ARR= 0x0008; // - до чего считаем ( вершина )
// запуск
TIM1->CR1=0x0081; // тайм1 enable(бит0), ARPE бит enable
//граница до кот счет бит 7 в 1 -( т е 8)
// TIM1->CR1|=TIM_CR1_ARPE;
// TIM1->CR1|=TIM_CR1_CEN;
TIM2->CR1=0x0081; // тайм2 enable(бит0) , ARPE бит enable
//граница до кот счет бит 7 в 1 -( т е 8)
// TIM2->CR1|=TIM_CR1_ARPE;
// TIM2->CR1|=TIM_CR1_CEN;
int i = 0;
while (1)
{
i++;
}
}
Timer DMA
#include "stm32f10x.h"
long int s=0x00000200;
long int r=0x00000100;
// void TIM1_CC_IRQHandler (void)
// {
//
// TIM1->CR1=TIM1 ->CR1 & 0xFFFE; // счет не enable(бит0)
// if (TIM1->SR & TIM_SR_CC1IF){(TIM1->SR)=(TIM1->SR) &(~TIM_SR_CC1IF);GPIOC->ODR=s;}
// else{TIM1->SR=(TIM1->SR) &(~TIM_SR_CC4IF);GPIOC->ODR=r;}
// TIM1->CR1=TIM1->CR1 | 0x0001; // счет enable(бит0)
// }
int main(void)
{
// __enable_irq(); // общее включение прерывания
// NVIC_EnableIRQ(TIM1_CC_IRQn );
RCC->APB2ENR=0x00000810; //порт C enable tacting -1 , 8 - таймер 1 enable tacting
//!!! тактирование до конфигурирования !!!
// GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
GPIOC->CRH = GPIO_CRH_MODE8_0 | GPIO_CRH_MODE9_0;
TIM1->PSC=0x00E4; // предделитель
// TIM1->DIER=0x1200; //запрос 4,1 каналов DMA биты - CC4DE и CC2DE,
//а так без дма 0x0012 - CC1IE и CC4IE
TIM1->DIER |= TIM_DIER_CC1DE;
TIM1->DIER |= TIM_DIER_CC4DE;
// TIM1->DIER |= TIM_DIER_CC1IE;
// TIM1->DIER |= TIM_DIER_CC4IE;
TIM1->CCR1=0x5000; //уровень сравнения - когда возн прер по сравн
TIM1->CCR4=0x0500; //уровень сравнения - когда возн прер по сравн
TIM1->ARR= 0x7530; //auto reload reg - до чего считаем ( вершина )
// TIM1->CR1=0x00C1; // прер enable(бит0)ж напр счета от 0 (бит4 DIR если 1 к 0)0,
//ARPE бит enable граница до кот счет бит 7 в 1 -( т е 8)
// 6-5-биты CMS-center align mode-туда-сюда -(11)
TIM1->CR1 |= TIM_CR1_ARPE;
TIM1->CR1 |= TIM_CR1_CMS_1;
TIM1->CR1 |= TIM_CR1_CEN;
// DMA
RCC->AHBENR |=RCC_AHBENR_DMA1EN; //DMA 1 enable
DMA1_Channel2->CPAR =(uint32_t)&GPIOC->ODR; // адрес порта выхода
DMA1_Channel2->CMAR=(uint32_t)&r; //адрес переменной
DMA1_Channel2->CNDTR=0x00000001; //количество пересылок данных
DMA1_Channel2->CCR |=DMA_CCR2_DIR; //направление пересылки из памяти по ум с периферии
DMA1_Channel2->CCR |= DMA_CCR2_CIRC; //непрерывно
DMA1_Channel2->CCR |= DMA_CCR2_MSIZE_1; // 32 bit
DMA1_Channel2->CCR |= DMA_CCR2_PSIZE_1; // 32 bit
DMA1_Channel4->CPAR =(uint32_t)&GPIOC->ODR;
DMA1_Channel4->CMAR=(uint32_t)&s;
DMA1_Channel4->CNDTR=0x00000001;
DMA1_Channel4->CCR |=DMA_CCR4_DIR;
DMA1_Channel4->CCR |= DMA_CCR4_CIRC;
DMA1_Channel4->CCR |= DMA_CCR4_MSIZE_1;
DMA1_Channel4->CCR |= DMA_CCR4_PSIZE_1;
DMA1_Channel2->CCR |= DMA_CCR2_EN; //вкл
DMA1_Channel4->CCR |= DMA_CCR4_EN; //вкл
// DMA1_Channel2->CCR = 0x00000A31;
// DMA1_Channel4->CCR = 0x00000A31;
int i = 0;
while (1)
{
i++;
}
}
Timer & UART
#include "stm32f10x.h"
int s=0;
int r=0;
void TIM1_UP_TIM16_IRQHandler (void)
{
TIM1->CR1 &=~TIM_CR1_CEN; // не enable(бит0)
TIM1->SR&=~TIM_SR_UIF; //В status reg обнуляем бит - 0 - UIF
if (s==1) { s=2; USART1->DR=211;
}
else { s=1; USART1->DR=110;
}
TIM1->CR1|=TIM_CR1_CEN; //enable(бит0)
}
void USART3_IRQHandler (void)
{
if (USART3->DR==211) { GPIOC->ODR=GPIOC->ODR & ~0x00000200;
}
else {GPIOC->ODR=GPIOC->ODR | 0x00000200;
}
}
void USART1_IRQHandler (void)
{
USART1->SR=USART1->SR & ~USART_SR_TC;
if (r==1) { r=2; GPIOC->ODR=GPIOC->ODR & ~0x00000100;
}
else { r=1; GPIOC->ODR=GPIOC->ODR|0x00000100;
}
}
int main(void)
{
__enable_irq(); // общее включение прерывания
NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn );
NVIC_EnableIRQ(USART1_IRQn);
NVIC_EnableIRQ(USART3_IRQn);
//порт C enable tacting ,таймер 1 enable tacting USART1, ports B,A
// и AFIOEN тактирование до конфигурирования !!!
RCC->APB2ENR |=RCC_APB2ENR_USART1EN;
RCC->APB2ENR |=RCC_APB2ENR_TIM1EN;
RCC->APB2ENR |=RCC_APB2ENR_IOPCEN;
RCC->APB2ENR |=RCC_APB2ENR_IOPBEN;
// RCC->APB2ENR |=RCC_APB2ENR_IOPAEN;//при alternate не нужен
//alternate
RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;//выкл
AFIO->MAPR |=AFIO_MAPR_USART3_REMAP_PARTIALREMAP;
AFIO->MAPR |=AFIO_MAPR_USART1_REMAP;
// USART 3 enable tacting, tim-2
RCC->APB1ENR |=RCC_APB1ENR_USART3EN;
RCC->APB1ENR |=RCC_APB1ENR_TIM2EN;
GPIOC->CRH=0x0000EB11; //C - leds 8--ой и 9-й оба на выход push/pull 10,11 Tx,Rx
// GPIOA->CRH=0x00000EB0; //alternate Tx-9 pin Rx-10 //при alternate не нужен
GPIOB->CRL=0xEB000000; //alternate Tx-6 pin Rx-7
USART1->BRR=(4<<4)+0x5; //115.2kB/s
USART3->BRR=(4<<4)+0x5; //115.2kB/s
USART1->CR1|=USART_CR1_UE; //вкл
USART1->CR1|=USART_CR1_TCIE; //прер по передаче
USART1->CR1|=USART_CR1_TE; //разр передачи
USART3->CR1|=USART_CR1_UE; //вкл
USART3->CR1|=USART_CR1_RXNEIE; //прерывание по приему
USART3->CR1|=USART_CR1_RE; //разрешить прием
// TIMER_1
TIM1->PSC=0x0FFF; //делитель
TIM1->DIER |= TIM_DIER_UIE; //прер по переп
TIM1->ARR= 0x01E8; // auto reload reg - до чего считаем ( вершина )
TIM1->CR1|=TIM_CR1_ARPE;
TIM1->CR1|=TIM_CR1_CEN; // enable(бит0), ARPE бит enable граница до кот счет бит 7
// enable
int i = 0;
while (1)
{
i++;
}
}
Timer & ADC
#include "stm32f10x.h"
long int s=0x00000200;
long int r=0x00000100;
int t=0;
void ADC1_IRQHandler (void)
{
ADC1->SR &= ~ADC_SR_AWD;
if (t==1) { t=2; GPIOC->ODR=0x00000100; //восьмой - зеленый
}
else { t=1; GPIOC->ODR=0x00000200; /*девятый - синий*/
}
ADC1->LTR=(ADC1->DR) - 0x00000005; //коррекция границы собаки
}
int main(void)
{
__enable_irq();
NVIC_EnableIRQ(ADC1_IRQn);
RCC->APB2ENR |=RCC_APB2ENR_IOPCEN; //порт C enable ,ADC - enable.
RCC->APB2ENR |=RCC_APB2ENR_ADC1EN;
GPIOC->CRH=0x00000011; // 8--ой и 9-й оба на выход push/pull
// GPIOC->CRH = GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0;
//ADC
ADC1->CR2 |=ADC_CR2_ADON; //ADON оказывается надо включать 2 раза
ADC1->CR2 |= ADC_CR2_TSVREFE; //термодатчик и опорное напр вкл
ADC1->SQR3 = ADC_SQR3_SQ1_4; //16-й канал идет первым в последовательности
//регулярных(и единственным)
ADC1->SMPR1 |= ADC_SMPR1_SMP16; // время преобразования max
ADC1->CR2 |=ADC_CR2_CAL; //калибровка
ADC1->CR2 |=ADC_CR2_CONT; //непрерывное преобразование
ADC1->CR1 |=ADC_CR1_AWDEN; //аналоговая собака на регулярных каналах
ADC1->CR1 |=ADC_CR1_AWDIE; //прерывание от собаки
ADC1->CR1 |=ADC_CR1_AWDCH_4; //собака на 16 канале
ADC1->CR2 |=ADC_CR2_ADON; //включили АЦП
ADC1->LTR=(ADC1->DR) - 0x00000005; //в нижнюю границу собаки текущее значение
//температуры с коррекцией
//чтобы прерывание сразу не наступило
int i = 0;
while (1)
{
i++;
}
}
Комментариев нет:
Отправить комментарий