Jump to content
defin

Тактирование STM32F411RE на cmsis

Recommended Posts

Добрый день, имеется отладочная плата Nucleo-F411RE. Не получается настроить в CMSIS ногу PA8 для вывода частоты (MCO) с внутреннего генератора HSI. Через HAL все чётко работает. Из reference manual так и не понял как прописать источник тактирования для MCO. В инете полно примеров для F100 серии, для себя не могу их адаптировать.

RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN; // enable clock for port A

GPIOA->MODER |= GPIO_MODER_MODER8_0;

GPIOA->PUPDR &= ~GPIO_PUPDR_PUPD8_0;
GPIOA->PUPDR |= GPIO_PUPDR_PUPD8_1;
GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR8_1);
   
RCC->CFGR |= RCC_CFGR_SW_HSI; //вот здесь не знаю что писать, написал наугад

Тактирование по умолчанию от HSI

Share this post


Link to post
Share on other sites
15 hours ago, defin said:

GPIOA->MODER |= GPIO_MODER_MODER8_0;

Похоже здесь должно быть GPIOA->MODER |= GPIO_MODER_MODER8_1;

Это будет переключение выхода на альтернативную функцию. По сбросу в регистре альтернативных функций стоит 0 - что вам и нужно для МСО1

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By john2103
      Доброго времени суток, товарищи, пытаюсь создать функции передачи по spi с использованием cmsis и прерываний. Раньше пользовался HAL на "полу- интуитивном" уровне. Все работало. Сейчас пытаюсь все писать только на cmsis и вот возникла проблема... Я попытался сделать две функции ( Отправка по SPI - 8-битного  массива и передача 8 битная DFF = 0 и отправка 16 битного массива и передача 16 бит DFF =1 и все это через прерывания)Результат смотрю анализатором и вот в чем проблема... если сначала идет функция передачи 8 битная а потом 16 битная то мелькает лишняя передача, 8 бит 0x00 и потом идет правильная передача, 16 битная. Не могу понять откуда берется эта передача??? (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF) ,  если поставить передачи 8 бит 16 бит 8 бит 16 бит то получается вот это (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF 0xAA 0xBB 0xCC 0xFE 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF), если между функциями вставить задержку 1 мс то все ок иначе тот результат о котором писал ..."головной убор Михаила Боярского"
      void SPI1_STM32F1_init(void) { // --- Инициализация порта для работы spi --- // ------ Настраиваем порт А -------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //--- Включаем тактирование порта А RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //--- Включаем тактирование альтернативных функции RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //--- Включаем тактированние SPI1 // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_CNF7|GPIO_CRL_MODE5|GPIO_CRL_MODE7); //--- Обнуление первоначальных параметров порта GPIOA->CRL |= ( GPIO_CRL_MODE5 // --- |Настройка вывода SCL, на работу в режиме альтернативной функции |GPIO_CRL_CNF5_1 // --- |режим output mode 11b - max 50 Мгц, CNF = 10b Альтернативная функция output push-pull ) |GPIO_CRL_MODE7 // --- |Настройка вывода MOSI |GPIO_CRL_CNF7_1 // --- | ); // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF6|GPIO_CRL_CNF6); GPIOA->CRL |= GPIO_CRL_MODE6; SPI1->CR1 |= SPI_CR1_BIDIMODE; // --- BIDIMODE режим работы (1 - одна линия, 0 - две линии связи) SPI1->CR1 |= SPI_CR1_BIDIOE; // --- BIDIOE Этот бит в сочетании с битом BIDImode выбирает направление передачи в двунаправленном режиме // --- 0: Output disabled (receive-only mode) // --- 1: Output enabled (transmit-only mode) SPI1->CR1 &=~SPI_CR1_CRCEN; // --- Аппаратный расчет CRC включить // --- 0: расчет CRC отключен // --- 1: Расчет CRC включен SPI1->CR1 &= ~SPI_CR1_CRCNEXT; // --- Следующая передача данных будет завершаться CRC-кодом. // --- 0: Этап передачи данных // --- 1: Следующая передача завершится передачей RCR SPI1->CR1 &= ~SPI_CR1_DFF; // --- Формат кадра данных // --- 0: Размер кадра передачи 8 бит // --- 1: Размер кадра передачи 16 бит SPI1->CR1 &= ~SPI_CR1_RXONLY; // --- Этот бит совместно с BIDIMODE выбирает направление передачи в 2-х проводном (MISO и MISO) режиме. // --- 0: Full duplex — передача и прием // --- 1: Output disabled — только прием SPI1->CR1 |= SPI_CR1_SSM; // --- Программное управление ведомым устройством. Когда бит SSM установлен, сигнал NSS заменяется значением бита SSI. // --- 0: Программное управление ведомым отключено // --- 1: Программное управление ведомым включено SPI1->CR1 |= SPI_CR1_SSI; // --- Внутренний выбор ведомого. Этот бит работает только когда бит SSM установлен. Значение этого бита принудительно подается на NSS, а значение IO вывода NSS игнорируется. // --- 1: (Master) Заменяет значение на выводе NSS // --- 0; (Slave) SPI1->CR1 &= ~SPI_CR1_LSBFIRST;// --- Формат кадра // --- 0: MSB передается первым // --- 1: LSB передается первым SPI1->CR1 |= SPI_CR1_BR; // --- BR[2:0]: Выбор скорости передачи // 000: fPCLK/2 // 001: fPCLK/4 // 010: fPCLK/8 // 011: fPCLK/16 // 100: fPCLK/32 // 101: fPCLK/64 // 110: fPCLK/128 // 111: fPCLK/256 //#define SPI_CR1_BR_Pos (3U) //#define SPI_CR1_BR_Msk (0x7U << SPI_CR1_BR_Pos) /*!< 0x00000038 */ //#define SPI_CR1_BR SPI_CR1_BR_Msk /*!< BR[2:0] bits (Baud Rate Control) */ //#define SPI_CR1_BR_0 (0x1U << SPI_CR1_BR_Pos) /*!< 0x00000008 */ //#define SPI_CR1_BR_1 (0x2U << SPI_CR1_BR_Pos) /*!< 0x00000010 */ //#define SPI_CR1_BR_2 (0x4U << SPI_CR1_BR_Pos) /*!< 0x00000020 */ SPI1->CR1 |= SPI_CR1_MSTR; // --- Выбор режима работы SPI: Master/Slave // --- 0: Режим Slave (ведомый) // --- 1: Режим Master (ведущий) SPI1->CR1 &= ~SPI_CR1_CPOL; // --- Полярность тактового сигнала // --- 0: CK в 0 при простое // --- 1: CK в 1 при простое SPI1->CR1 &= ~SPI_CR1_CPHA; // --- Фаза тактового сигнала // --- 0: Первый переход тактового сигнала является краем захвата данных // --- 1: Второй переход тактового сигнала является краем захвата данных SPI1->CR2 &= ~SPI_CR2_TXEIE; // --- Прерывание опустошения буфера передачи данных Tx // --- 0: Прерывание TXE запрещено // --- 1: Прерывание TXE разрешено. Используется для генерации прерывания когда устанавливается флаг TXE SPI1->CR2 &= ~SPI_CR2_RXNEIE; // --- Прерывание не пустого буфера приема Rx // --- 0: Прерывание RXNE запрещено // --- 1: Прерывание RXNE разрешено. Используется для генерации прерывания когда устанавливается флаг RXNE. SPI1->CR2 &= ~SPI_CR2_ERRIE; // --- Прерывание при возникновении ошибок передачи. Этот бит контролирует генерацию прерывания при возникновении одной из ошибок интерфейса SPI (CRCERR, OVR, MODF). // --- 0: Прерывание при возникновении ошибок запрещено // --- 1: Прерывание при возникновении ошибок разрешено SPI1->CR2 |= SPI_CR2_SSOE; // --- Разрешить выход SS // --- 0: Выход SS отключен в режиме master (ведущий) и есть возможность работать в multimaster режиме // --- 1: Выход SS включен в режиме master (ведущий), при этом нет возможности работать в multimaster режиме SPI1->CR2 &= ~SPI_CR2_TXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага TXE // --- 0: Tx buffer DMA disabled // --- 1: Tx buffer DMA enabled SPI1->CR2 &= ~SPI_CR2_RXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага RXNE // --- 0: Rx buffer DMA disabled // --- 1: Rx buffer DMA enabled SPI1_Enable; NVIC_EnableIRQ(SPI1_IRQn); } void SPI1_STM32F1_write_8bit_irq(uint8_t *data, int32_t len_8bit) { if(len_8bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY)) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 &= ~SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_8_bit = 0; tx_len_8_bit = len_8bit; tx_data_8_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_STM32F1_write_16bit_irq(uint16_t *data, int32_t len_16bit) { if(len_16bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 |= SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_16_bit = 0; tx_len_16_bit = len_16bit; tx_data_16_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_IRQHandler(void) { if ((SPI1->CR1&SPI_CR1_DFF) == 0) { SPI1->DR = tx_data_8_bit[tx_index_8_bit]; //Записываем новое значение в DR tx_index_8_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_8_bit >= tx_len_8_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } else { SPI1->DR = tx_data_16_bit[tx_index_16_bit]; //Записываем новое значение в DR tx_index_16_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_16_bit >= tx_len_16_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } } ............. uint8_t data_8bit[3] = { 0xAA, 0xBB, 0xCC}; uint16_t data_16bit[3] = { 0xDDDD, 0xEEEE, 0xFFFF}; int main(void) { SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); }  
    • By В гостях у Slime
      Здравствуйте, мне нужна помощь с подключением дисплея WG12864 к STM32F103C8T6. А именно? Я не нашёл библиотек для него, лишь только ардуиновские. Может у кого есть своя? С STM32 опыта почти нет. Так мигал светодиодом и всё, но зато ардуину я уже знаю всё. Я перерос её и мне хочется освоить стм.
    • By Mars36
      Доброго времени суток, второй день пытаюсь настроить отправку данных по UART для камня 407vg на плате discovery. Использую USART1 с ножками PB6(TX) и PB7(RX). Тактирование от внешнего кварца. Частота APB2 - 84MHz, соответственно BRR->0x222E.  При заливке прошивки в камень на ПК прилетает один мусорный байт и большей ничего не происходит, при ресете МК соответственно опять прилетает один мусорный байт. Пробовал подключать через USART2, там дела обстоят чуть лучше. Байты отправляются, но в виде мусора. Притом, отправлял разные символы(почти все цифры и буква алфавита) но код на терминали был либо 0xDF либо 0xFF.
      /******************************************************************************/ /* LYBRARY */ /******************************************************************************/ #include "stm32f4xx.h" /******************************************************************************/ /* USE FUNCTION */ /******************************************************************************/ void InitGPIO (void); void InitRCC(void); void InitUSART2(void); void delay (uint32_t time); /******************************************************************************/ /* MAIN */ /******************************************************************************/ int main (void){ InitGPIO (); InitRCC(); InitUSART2(); while (1){ GPIOD->BSRR |= GPIO_BSRR_BS15; while(!(USART1->SR & USART_SR_TC)); USART1->DR = 'h'; delay(200000000); GPIOD->BSRR |= GPIO_BSRR_BR15; delay(200000000); } } /******************************************************************************/ /* InitGPIO */ /******************************************************************************/ void InitUSART2(void){ RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; GPIOB->MODER &= ~GPIO_MODER_MODER6_0; GPIOB->MODER |= GPIO_MODER_MODER6_1; GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; GPIOB->OTYPER &= ~GPIO_OTYPER_OT_6; GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; GPIOB->AFR[0] |= 0x00000700; GPIOB->MODER &= ~GPIO_MODER_MODER7; GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR7; GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; USART1->BRR = 0x0000222E; USART1->CR1 |= USART_CR1_UE; USART1->CR1 |= USART_CR1_TE; USART1->CR1 |= USART_CR1_RE; USART1->CR1 |= USART_CR1_RXNEIE; NVIC_EnableIRQ(USART1_IRQn); } void InitRCC(void){ RCC->CR |= ((uint32_t)RCC_CR_HSEON); while (!(RCC->CR & RCC_CR_HSERDY)); FLASH->ACR = (FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY| FLASH_ACR_ICEN | FLASH_ACR_DCEN); RCC->CFGR |= RCC_CFGR_HPRE_DIV1; RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; RCC->CFGR &= ~RCC_PLLCFGR_PLLSRC; RCC->CFGR &= ~RCC_PLLCFGR_PLLM; RCC->CFGR &= ~RCC_PLLCFGR_PLLN; RCC->CFGR &= ~RCC_PLLCFGR_PLLP; RCC->CFGR |= RCC_PLLCFGR_PLLSRC_HSE; RCC->CFGR |= RCC_PLLCFGR_PLLM_4; RCC->CFGR |= (RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLN_5 | RCC_PLLCFGR_PLLN_3); RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0) {} RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} } void InitGPIO (void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER |= GPIO_MODER_MODE15_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT15; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED15_0; GPIOD->MODER |= GPIO_MODER_MODE14_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT14; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED14_0; GPIOD->MODER |= GPIO_MODER_MODE13_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT13; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED13_0; GPIOD->MODER |= GPIO_MODER_MODE12_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT12; GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0; } void delay(uint32_t time){ uint32_t i; for (i=0; i<time;i++); }  

  • Сообщения

    • Жопа с занавесками.
    • Ты просто самый обычный клоун. Городской дурачок.  
    • Не все люди это знают.   Сейчас нет у народа такого права.   Этого тоже нет, ни выборов, ни референдумов.   По закону не может, но у нас при путине никакие законы не выполняются.))   Поэтому без крайних мер никак не обойтись. 
    • Я честно отмотал тему до 30 страницы. Последняя представленная схема дана страниц 5 назад. Глубже уже другие схемы. Такое ощущение, что автор схемы чувствует, что есть зерно в утверждениях @geran и умышленно не выполняет просьбу, которая расставит все точки над i.   Стоп, машина! Мы обсуждаем частотный демодулятор. Огибающая в данном контексте является помехой (без оглядки на ее происхождение) и ее необходимо исключить. На вход предоставленной схемы мы подаем частотно модулированную несущую, перенесенную на промежуточную частоту. АМ модуляция в ней только для демонстрации возможностей демодулятора. Никакой полезной информации она нести не должна. я хоть по образованию и радиотехник, но вот цифра мне ближе)) Радиоприемники ограничиваются мной радиотрансиверами для передачи цифровой информации. Данная тема интересна после заявления об однобитном демодуляторе. Я решил, что здесь НИР проводится или диссертация какая. Оказывается, за однобитность преподносится однотактность. Если я правильно разобрался в сраче.... Видимо, я не смог удержать нить разговора и решил. что речь про режекторный фильтр. Ведь изначально фокус внимания на нем был.
    • Ага, ну понятно, еще бы... Да, тебе пора бежать за шнобелевкой,  у тебя огибающая синфазна с выходов обоих диодов и складывается, а где S-КРИВАЯ, брателло? У тебя там нет S-КРИВОЙ. И с какого рожна этот мутняк должен называться ЧМ-детектор?
    • Не, брат. Тут ты поспешил. Скоро и в попу им дашь? Не, не серьёзно это. Давайте соблюдать конституцию РФ! Все вместе, и дружно!? Для начала, на осознание вам вот статейка оттуда.   Статья 3 1. Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ. 2. Народ осуществляет свою власть непосредственно, а также через органы государственной власти и органы местного самоуправления. Усвоите- пишите. чава какава. 3. Высшим непосредственным выражением власти народа являются референдум и свободные выборы. 4. Никто не может присваивать власть в Российской Федерации. Захват власти или присвоение властных полномочий преследуется по федеральному закону.
×
×
  • Create New...