[Решено] SPI STM32F407 не работает

Акронис
Вторник 07 ноября 2017 г. 12:10
Привет.

Сделайте проект с магниторезистентным датчиком KMA200. (https: // www.nxp.com/docs/en/data-sheet/kma200.PDF)

Правление - STM32F407VET6 Black
Библиотека - Leaflabs Maple (https: // github.com/stevstrong/arduino_stm32/)

SPI не работает !
#include #include RTClock rt(RTCSEL_LSE); long int alarmDelay = 5; void setup() { // We have just started or woken up from sleep! System clock is set to 72MHz HSE. delay(1000); sleepAndWakeUp(STANDBY, &rt, alarmDelay); } void loop() { } // This is never run

Стивестронг
Вторник 07 ноября 2017 г. 12:32
Конечно, SPI работает.
Только то, что вы не объявили правильный экземпляр SPI.
По умолчанию SPI3 используется в качестве экземпляра SPI, потому что он является наиболее часто используемым интерфейсом на плате Black F4.

Чтобы использовать SPI1, вы должны объявить свой собственный экземпляр SPI: P = C * V^2 * F * N

Акронис
Вторник 07 ноября 2017 г. 12:37
ХОРОШО.
Теперь я попробую.
Спасибо !

Акронис
Вторник 07 ноября 2017 г. 12:46
Стивен
изменил ли я код на SPI1 ?

#include #include #include RTClock rt(RTCSEL_LSE); // initialise RTC to use LSE void alarm_triggered() {}; // no op void setup() { //blink the led to say that we are alive :) pinMode(LED_BUILTIN, OUTPUT); for(int i=0; i<10; i++) { digitalWrite(LED_BUILTIN, HIGH); delay(100); digitalWrite(LED_BUILTIN, LOW); delay(100); } //set alarm rt.attachAlarmInterrupt(&alarm_triggered); rt.setAlarmTime(rt.getTime()+10); //10 secs away // standby mode //https://www.st.com/content/ccc/resource/technical/document/application_note/ff/0a/dc/d2/5e/f5/4b/5a/CD00171691.pdf/files/CD00171691.pdf/jcr:content/translations/en.CD00171691.pdf PWR_BASE->CR &= ~PWR_CR_LPDS; // clear LPDS PWR_BASE->CR |= PWR_CR_PDDS; // set PDDS PWR_BASE->CR |= PWR_CR_CWUF; //clear WUF PWR_BASE->CR |= PWR_CSR_EWUP; //enable wakeup pin SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP; //set DEEPSLEEP // goto standby mode / sleep() asm("wfi"); //once wake up reboot/reset nvic_sys_reset(); } void loop() { //this won't run, there is a ghost if this does run lol }

ZMEMW16
Вторник 07 ноября 2017 г. 13:29
Хорошо, это станет запутанным, это был первый раз, когда я попытался описать это.

Глядя на схему, PB3, PB4, PB5 помечены вне кадра CPU как SPI1_CLK, SPI1_MISO, SPI1_MOSI

Внутри рамы и внутри скобок на этикетке e.глин. pinMode(PA0, INPUT_ANALOG);

Акронис
Вторник 07 ноября 2017 г. 13:34
Привет, Стивен.

Как пережить SPI1 ?
Не могли бы вы сказать мне код, пожалуйста

Стивестронг
Вторник 07 ноября 2017 г. 13:44
Я предлагаю использовать: PWR_BASE->CR |= PWR_CR_PDDS | PWR_CR_CWUF;// set PDDS, clear WUF

Акронис
Вторник 07 ноября 2017 г. 14:20
Стивен, я в замешательстве (

Что я делаю не так ?
Мне нужно сделать это на SPI1 .
Redid Code
void enterSleepMode(){ asm(" wfi"); }

ZMEMW16
Вторник 07 ноября 2017 г. 16:49
B2/B3/B4 может быть одним из 'SPI1 A5-A7 Rememance'И (более правильно для меня) все еще помечен SPI1 или как'SPI3 B2-B4', а затем переименован (по крайней мере, для меня неправильно) как spi1
Под родным я имею в виду, что это не подчиняется afio_remap.
Я думаю, вам вполне может понадобиться повторная карта/отключить выводы отладки.

Если бы я использовал Cubemx для этого, в соответствии с их определенной нативной функцией (левая мышиная меню) функции PIN -контакта путем их инициализации выводов в виде переизданного SPI1 или как SPI3 (нативно) и пометить их как SPI1 в имени пользователя PIN -кода ( щелкните правой кнопкой мыши, выпадайте).
Вариант Remap для меня кажется способом, чтобы соответствовать названию PIN -штифта процессора на плату в соответствии с схемой.

REMAP SPI был выполнен ранее, поиск сайта с использованием >afio_remap spi<
ViewTopic.PHP?f = 3&t = 2672&P = 35479&hilit = ... SPI#P35479

Даже не думай о i2c1 & I2c2 :!:

это все немного загадки : D Один из способов ориентирована на доску, другой, ориентированный на процессор.
Я столкнулся с этим, когда пытался собрать для этого файл Cubemx, отсюда и мой более ранний, чтобы получить запутанную комментарий.

Стивен

Стивестронг
Вторник 07 ноября 2017 г. 22:22
Ну, я только что попробовал этот пример с моим текущим репо: asm(" wfi");

Акронис
Ср. 8 ноября 2017 г. 12:15
Дорогие друзья !

Спасибо всем за вашу помощь в моем вопросе !
Особое спасибо, Стивестронг !
Ваш код работает нормально !!!

Все вы правильно написали мне. (((
Я не обращал внимания, проблема была в проводе, соединяющем CS микроконтроллера, и датчик был плохой (китайское качество), и не было контакта.
Изменил проволоку, и теперь происходит управление датчиком, но ответа нет из -за слишком высокой скорости SPI.

Мне нужно настроить STM32F407 на частоте 128 МГц .
Расскажите, пожалуйста, как это правильно делать ?
Можно ли это сделать в настройке () ?

Стивестронг
Ср. 8 ноября 2017 г. 12:35
Вы действительно уверены, что 1.3125 МГц или 0.65625 МГц недостаточно хорошо?

Если вы установите процессор на 128 МГц, USB не будет работать.
Если вы хотите сохранить сериал USB, то - это решение 120 МГц, где часы SPI будут 0.9375 МГц.
Для этого вы можете попробовать использовать в настройке: typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; HAL_RCC_DeInit(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; /** * Step: Disable all interrupts */ __disable_irq(); /* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/ __DSB(); __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); /* Remap is bot visible at once. Execute some unrelated command! */ __DSB(); __ISB(); JumpToApplication = (void (*)(void)) (*((uint32_t *)(0x1FFF0000 + 4))); /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) 0x1FFF0000); JumpToApplication();

Акронис
Ср. 8 ноября 2017 г. 12:41
Стивен, и как сделать 0.65625 МГц ?

Стивестронг
Ср. 8 ноября 2017 г. 13:04
#include void RCC_DeInit() { /* Set HSION bit */ RCC->CR |= (RCC_CR_HSION | RCC_CR_HSITRIM_4); /* Reset CFGR register */ RCC->CFGR = 0; /* Reset HSEON, CSSON, PLLON, PLLI2S */ RCC->CR &= ~(RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON| RCC_CR_PLLI2SON); /* Reset PLLCFGR register */ RCC->PLLCFGR = 0; RCC->PLLCFGR = (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2); /* Reset PLLI2SCFGR register */ RCC->PLLI2SCFGR = 0; RCC->PLLI2SCFGR = (RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); /* Reset HSEBYP bit */ RCC->CR &= ~(RCC_CR_HSEBYP); /* Disable all interrupts */ RCC->CIR = 0; } void JumpToBootloader(void) __attribute__((optimize("-O0"))); void JumpToBootloader(void) { void (*SysMemBootJump)(void); /** * Step: Set system memory address. * * For STM32F407, system memory is on 0x1FFF 0000 * For other families, check AN2606 document table 110 with descriptions of memory addresses */ volatile register uint32_t addr = 0x1FFF0000; /** * Step: Disable RCC, set it to default (after reset) settings * Internal clock, no PLL, etc. */ RCC_DeInit(); /** * Step: Disable systick timer and reset it to default values */ SYSTICK->CTRL = 0; SYSTICK->LOAD = 0; SYSTICK->VAL = 0; /** * Step: Disable all interrupts */ noInterrupts(); //delay(10000); /** * Step: Remap system memory to address 0x0000 0000 in address space * For each family registers may be different. * Check reference manual for each family. * * For STM32F4xx, MEMRMP register in SYSCFG is used (bits[1:0]) * For STM32F0xx, CFGR1 register in SYSCFG is used (bits[1:0]) * For others, check family reference manual */ SYSCFG->MEMRMP = 0x01; /** * Step: Set jump memory location for system memory * Use address with 4 bytes offset which specifies jump location where program starts */ SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4))); /** * Step: Set main stack pointer. * This step must be done last otherwise local variables in this function * don't have proper value since stack pointer is located on different position * * Set direct address location which specifies stack pointer in SRAM location */ asm volatile ("mov r3, %0\nldr r3, [r3, #0]\nMSR msp, r3\n" : : "r" (addr) : "r3", "sp"); /** * Step: Actually call our function to jump to set location * This will start system memory execution */ SysMemBootJump(); /** * Step: Connect USB<->UART converter to dedicated USART pins and test * and test with bootloader works with STM32 Flash Loader Demonstrator software */ } void setup() { // put your setup code here, to run once: Serial.begin(115200); delay(3000); Serial.println("This is a test how to jump to the system bootloader without setting BOOT0 pin to 1.\n"); Serial.println("Type any key to jump to ROM bootloader...\n"); // wait for user input //while (!Serial.available()) ; // read all serial input data //while (Serial.available()) Serial.read(); //Serial.println("The system will now jump to ROM bootloader..."); //delay(100); // let time for serial to output message // jump to bootloader JumpToBootloader(); } void loop() { // put your main code here, to run repeatedly: }

Акронис
Ср. 8 ноября 2017 г. 13:07
Теперь ясно.
А потом я подумал, что на самом деле 1 000 кГц.
Еще раз спасибо !!!