http://www.st.com/en/development-tools/stm32cubemx.html
Внизу кнопка "гэт софтвар", но надо зарегаться - это не больно.
+Мурик писал(а):Я бы не стал советовать начинать с куба.
Что же в этом плохого? Сплошные плюсы. Мне один уже заявил, узнав что я не использовал готовые библиотеки в неком проекте, что я от DMA отказался. А DMA совсем несложно настраивается, но вот для него нет, потому что есть автокоды и даже не пытался понимать что это видимо.Ярослав555 писал(а):даешь самопальные функции-инициализаторы периферии через регистры!
Это потом, когда появится опыт работы с МК. А с начала лучше немного упростить задачу взяв SPL и заодно изучив как устроены ее функции.Ярослав555 писал(а):даешь самопальные функции-инициализаторы периферии через регистры!
Для меня как-то SPL никак ничего не упростил. Я имею ввиду для понимания и изучения МК.Мурик писал(а):А с начала лучше немного упростить задачу взяв SPL
Код: Выделить всё
void ADC_Timer_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM15EN;
TIM15->PSC = 720 -1; //new clock = 100kHz
TIM15->ARR = 50 - 1; //period = 0.0005sec
TIM15->CR2 |= TIM_CR2_MMS_1; //COUNTER_ENABLE signal to TIM15, used as trigger output (TRGO)
}
void ADC_Init(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIODEN ;//разрешаем тактирование порта D
GPIOD->MODER |= GPIO_MODER_MODER11;//настраиваем PD11(8chanel) для работы АЦП в режим аналогового входа
GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR11;
RCC->CFGR2 |= RCC_CFGR2_ADCPRE34_DIV1;//предделитель 1 для АЦП
ADC3_4_COMMON->CCR &= ~(ADC34_CCR_CKMODE);//тактируем от PLL
RCC->AHBENR |= RCC_AHBENR_ADC34EN;//включаем тактирование АЦП
ADC3->CR &= ~ADC_CR_ADVREGEN;
ADC3->CR |= ADC_CR_ADVREGEN_0;
delay_us(100);
ADC3->CR &= ~ADC_CR_ADCALDIF;
ADC3->CR |= ADC_CR_ADCAL;//Запуск калибровки АЦП
while (ADC3->CR & ADC_CR_ADCAL);//Ожидание конца колибровки
ADC3->SMPR1 &= ~ADC_SMPR1_SMP8;
ADC3->SMPR1 |= ADC_SMPR1_SMP8_0;
ADC3->SMPR1 |= ADC_SMPR1_SMP8_2;
ADC3->CFGR &= ~ADC_CFGR_ALIGN;//выравниваем результат преобразования по правому краю
ADC3->CFGR &= ~ADC_CFGR_RES; //12bit
ADC3->CFGR &= ~ADC_CFGR_CONT; //одиночное преобразование
ADC3->CFGR |= ADC_CFGR_OVRMOD;
ADC3->CFGR |= ADC_CFGR_EXTSEL; // запуск преобразования по TIM15_TRGO event
ADC3->CFGR &= ~ADC_CFGR_EXTSEL_0;
ADC3->CFGR &= ~ADC_CFGR_EXTEN;// включаем софтовый запуск
//длина последовательности по умолчанию равна 1,
ADC3->SQR1 = ADC_SQR1_SQ1_3; //(PD11 - 8 канал)
ADC3->CR |= ADC_CR_ADEN;//включаем АЦП
while(ADC3->ISR & ADC_ISR_ADRD);//ждём его готовности
delay_us(100);
}
Код: Выделить всё
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // Enable Clock SPI1
SPI1->CR1 = SPI_CR1_MSTR | // Master configuration
SPI_CR1_BR | // Baud rate control = 111 : fPCLK/256
SPI_CR1_SSI | // SSI: Internal slave select
SPI_CR1_SSM; // SSM: Software slave management enabled
SPI1->CR2 = SPI_CR2_DS_0 |
SPI_CR2_DS_1 |
SPI_CR2_DS_2; // | // Data Size 8 bit
// SPI_CR2_TXEIE; // Tx buffer empty interrupt enable
// SPI_CR2_RXNEIE; // Rx buffer empty interrupt enable
// SPI_CR2_SSOE; // SS Output Enable
SPI1->CR1 |= SPI_CR1_SPE; // Enable SPI1Код: Выделить всё
uint32_t memory_read (uint32_t address)
{return (*(__IO uint32_t*) address);}Код: Выделить всё
uint32_t Adress_RAM = 0x20000000;Код: Выделить всё
Data_RAM = memory_read (Adress_RAM);