Rogerclark
Ср. 09 сентября 2015 г. 10:53 утра
Ребята,
Я обнаружил ошибку, которая, кажется, сбивает общий F103C (и я подозреваю, что Maple Mini также, но я еще не проверил его)
Если вы загрузите это запустить, используя загрузчик, затем загрузите снова, плата будет висеть сразу после того, как она получит последовательность сброса через Serial USB
[код
#включать <SPI.час>
void setup () {
// Поместите здесь код настройки, чтобы запустить один раз:
}
void loop () {
// Поместите свой главный код здесь, чтобы запустить многократно:
}
[/код]
В основном, включение SPI, кажется, заставляет его сбой, но если у вас есть полный эскиз, такой как графический тест ILI9341, он не сбои, когда вы загружаете новую версию.
КСТАТИ. Это урезанный пример, изначально у меня было это
Я обнаружил ошибку, которая, кажется, сбивает общий 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 в пустой набросок, казалось, вызвал аварию
Это звучит похоже
Это звучит похоже