Сбой при загрузке, включив <SPI.час>

Rogerclark
Ср. 09 сентября 2015 г. 10:53 утра
Ребята,

Я обнаружил ошибку, которая, кажется, сбивает общий F103C (и я подозреваю, что Maple Mini также, но я еще не проверил его)

Если вы загрузите это запустить, используя загрузчик, затем загрузите снова, плата будет висеть сразу после того, как она получит последовательность сброса через Serial USB

[код
#включать <SPI.час>
void setup () {
// Поместите здесь код настройки, чтобы запустить один раз:

}

void loop () {
// Поместите свой главный код здесь, чтобы запустить многократно:

}
[/код]

В основном, включение SPI, кажется, заставляет его сбой, но если у вас есть полный эскиз, такой как графический тест ILI9341, он не сбои, когда вы загружаете новую версию.

КСТАТИ. Это урезанный пример, изначально у меня было это

Timer2.pause(); Timer2.setPrescaleFactor(1); Timer2.setOverflow(2175); Timer2.setChannel1Mode(TIMER_OUTPUT_COMPARE); Timer2.attachCompare1Interrupt(audio_int); Timer2.refresh(); Timer2.resume();

Мадиас
Ср. 09 сентября 2015 г. 11:02 утра
не могли бы вы вставить #include #include #define WS PA8 File file1; SdFat sd; uint8_t buf[2]; byte buf1[13]; byte buf2[13]; uint8_t buffer_refill; uint8_t flip_flop; uint8_t play1; int buffer_counter; int counter1; int length_audio1; //long? int reading, reading_2, reading_3, reading_4; int number_of_channels; int sample_rate; byte sample_rate_lsb, sample_rate_msb; int bit_depth; byte start_byte_1; void setup() { Timer2.pause(); Timer2.setPrescaleFactor(1); Timer2.setOverflow(2175); Timer2.setChannel1Mode(TIMER_OUTPUT_COMPARE); Timer2.attachCompare1Interrupt(audio_int); Timer2.refresh(); Timer2.resume(); while (!sd.begin(PA4, SPI_CLOCK_DIV2)) { // see if the card is present and can be initialized: Serial.println("SD fail. Holding on loop."); delay(100); } file1.read(buf1, 512); } void loop() { /* if (millis() - what_time > 100) { what_time = millis(); Serial.println(after - before); } */ if (buffer_refill) { if (flip_flop) { file1.read(buf2, 512); } else { file1.read(buf1, 512); } buffer_refill = 0; } /* if (rewind_1) { file1.seekSet(start_byte_1); rewind_1 = 0; } if (rewind_2) { file2.seekSet(start_byte_2); rewind_2 = 0; }*/ } void audio_int(){ if (play1) { if (flip_flop) { buf[0] = buf1[buffer_counter]; buf[1] = buf1[buffer_counter + 1]; } else { buf[0] = buf2[buffer_counter]; buf[1] = buf2[buffer_counter + 1]; } digitalWrite(WS, HIGH); //Select RIGHT Audio channel SPI.transfer(buf[1]); // Data bits 15-8 SPI.transfer(buf[0]); // Data bits 7-0 digitalWrite(WS, LOW); //Select RIGHT Audio channel buffer_counter = buffer_counter + 2; if (buffer_counter == 512) { flip_flop = !flip_flop; buffer_counter = 0; buffer_refill = 1; } counter1++; if (counter1 > length_audio1) { play1 = 0; } } } void audio_info(){ sd.chvol(); //-----------------// //---Open FILE1----// //-----------------// if (!file1.open("song0002.wav")) { } file1.printName(&Serial); Serial.println(); for (int i = 0; i < 100; i++) { reading = file1.read(); if (reading == 0x66) { reading_2 = file1.read(); reading_3 = file1.read(); reading_4 = file1.read(); //search for Subchunk1ID, Contains the letters "fmt " (0x666d7420 big-endian form). if ((reading_2 == 0x6d) && (reading_3 == 0x74) && (reading_4 == 0x20)) { break; } else { file1.seekSet(i - 3); } } } Serial.print("Subchunk1ID start at : "); Serial.println(file1.curPosition() - 4, DEC); //after the Subchunk1ID, we know for sure that the next bytes define important information //skip Subchunk1Size for (int i = 0; i < 4; i++) { file1.read(); } //skip AudioFormat for (int i = 0; i < 2; i++) { file1.read(); } //get number of channels number_of_channels = file1.read(); Serial.print("number of channels : "); Serial.println(number_of_channels, DEC); //byte 2 is empty file1.read(); //get sample rate sample_rate_lsb = file1.read(); sample_rate_msb = file1.read(); sample_rate = sample_rate_lsb; sample_rate |= sample_rate_msb << 8; Serial.print("sample_rate : "); Serial.println(sample_rate, DEC); //byte 3 & 4 are empty file1.read(); file1.read(); //skip bytes until bitdepth for (int i = 0; i < 6; i++) { file1.read(); } //bit depth bit_depth = file1.read(); Serial.print("bitdepth : "); Serial.println(bit_depth, DEC); file1.read(); //scroll through file until reaching the Subchunk2ID for (int i = 0; i < 1000; i++) { reading = file1.read(); //Serial.print(i); // Serial.print(" - "); // Serial.println(reading, HEX); if (reading == 0x64) { reading_2 = file1.read(); reading_3 = file1.read(); reading_4 = file1.read(); //search for Subchunk2ID, Contains the letters "data" (0x64617461 big-endian form). if ((reading_2 == 0x61) && (reading_3 == 0x74) && (reading_4 == 0x61)) { break; } else { file1.seekSet(i - 3); } } } Serial.print("Subchunk2ID start at : "); Serial.println(file1.curPosition() - 4, DEC); //we then reached the Subchunk2Size, and can read the length of the file reading = file1.read(); length_audio1 = reading; reading = file1.read(); length_audio1 |= reading << 8; reading = file1.read(); length_audio1 |= reading << 16; reading = file1.read(); length_audio1 |= reading << 32; //length of audio in samples, it's the half of the amount of bytes in mono 16bits length_audio1 = length_audio1 / 2; Serial.println(length_audio1); start_byte_1 = file1.curPosition(); Serial.print("audio starting start at : "); Serial.println(start_byte_1, DEC); // } } //}

Rogerclark
Ср. 09 сентября 2015 г. 11:09
//TIM2_IRQHandler() needs to be changed by commenting out "TIMx->CCR1 += _tim_oc1;" //it looks like this: /* void TIM2_IRQHandler(void) { //oc1 portion if (TIMx->SR & TIM_SR_CC1IF) { //output compare 1 flag is set TIMx->SR &=~TIM_SR_CC1IF; //clear the flag //TIMx->CCR1 += _tim_oc1; //update the output compare register - needs to be commented out _tim_oc1isrptr(); //execute user handler } */ //my isr void myisr(void) { static pr_index=0; //period index switch (pr_index) { case 0: TIM2_CCR1 += PR0; pr_index=1; break; case 1: TIM2_CCR1 += PR1; pr_index=2; break; case 2: TIM2_CCR1 += PR2; pr_index=3; break; case 3: TIM2_CCR1 += PR3; pr_index=0; break; //add additional periods here... } do_your_thing_here(); } tmr2_init(1); //set up tmr2 at 1:1 prescaler tmr2_setpr1(PR0); //use compare channel 1, set period to PR0 tmr2_act1(myisr); //install my isr

Мадиас
Ср. 09 сентября 2015 г., 11:13
...Может ли это быть проблемой, вызванной новым классом?
так что digitalWrite(WS, HIGH); //Select RIGHT Audio channel SPI_2.transfer(buf[1]); // Data bits 15-8 SPI_2.transfer(buf[0]); // Data bits 7-0 digitalWrite(WS, LOW); //Select RIGHT Audio channel

Rogerclark
Ср. 09 сентября 2015 г. 11:16 утра
Привет, Матиас

Эта проблема, возможно, была в коде в течение некоторого времени. Я проверил настоящий эскиз, и все в порядке, это просто минимальный эскиз, который не удается

Однако у меня нет времени отладки в данный момент. У меня может быть время завтра.

Но я не думаю, что это срочная проблема, поскольку это происходит только тогда, когда это не полный набросок

Мадиас
Ср. 09 сентября 2015 г., 11:21
Да, но мы должны помнить эту проблему (возможно, это происходит с другим кодом, чем минимальным!), поэтому я открыл проблему на GitHub в качестве напоминания

Rogerclark
Ср. 09 сентября 2015 12:12
Спасибо

Стивестронг
Вт 20 июня 2017 г., 19:15
[Rogerclark - Ср. 09 сентября 2015 г. 11:09] - ... {GPIOA, NULL, NULL, 12, 0, ADCx}, /* PA12 */ // D23 ...

Rogerclark
Вт 20 июня 2017 г. 22:19
Есть error_led config в досках.TXT, который обсуждался в другой ветке несколько дней назад.

victor_pv
Пн, 3 июля 2017 г. 11:05
[Стивестронг - Вт 20 июня 2017 г., 19:15] -
[Rogerclark - Ср. 09 сентября 2015 г. 11:09] - void findRPM() { //Wraparound correction if (rpm_samples[19] < rpm_samples[0]) { rpm_samples[19] = (rpm_samples[0] - 4294967295) + rpm_samples[19];} mean = 0; for (int i = 0 ; i < 20 ; i++) { mean = (mean + rpm_samples[i]); } mean = mean/20; //Note: there are 1,000,000 microseconds in a second. RPM = (1000000/mean) * 60;

Rogerclark
Втюж 04 июля 2017 г. 1:08
Есть открытая проблема об включении SPI.H в пустой набросок, казалось, вызвал аварию

Это звучит похоже

наносекунд задержка