Forum: Mikrocontroller und Digitale Elektronik stm32f103 exti


von grundschüler (Gast)


Lesenswert?

ich versuche bei meinem mp3-player den byte-transfer zum vs1053 über isr 
zu führen.
1
void read_file_exti(){
2
3
  fileSize=(sizeof(vs_buffer)/32)*32;//rest wird zur Vereinfachung abgeschnitten
4
  pt_vs_buffer=fileSize+1;
5
6
    fat_res=f_open(&File[0], cur_fname, FA_OPEN_EXISTING | FA_READ);   /* Create a file */
7
#if 01
8
    while (fat_res==0){
9
//==================================================================
10
11
//1. Lesebedingung prüfen
12
    if(pt_vs_buffer>=fileSize){
13
      fat_res = f_read(&File[0], vs_buffer, sizeof vs_buffer, &fat_bitct);     /* Read a chunk of src file */
14
      pt_vs_buffer=0;
15
//2. fileende erreicht?
16
      if (fat_res || fat_bitct == 0){
17
        //eof => close file
18
        f_close(&File[0]);
19
        vs_status &= ~(1<<0);
20
        //eof => open next file
21
        break;
22
      } /* error or eof */
23
    }//1.
24
25
         u32 i;// = 0,x=0,xx=0;
26
27
28
//3. isr if statt while end of buffer?
29
    while (pt_vs_buffer < fileSize) {
30
//      if (pt_vs_buffer < fileSize) {
31
32
//+++++++++++++++++++++
33
34
        vs_status |= (1<<0);//isr zuschalten
35
         while (dreq==0){;} //in isr nicht erforderlich
36
//Hier müsste die isr einsetzen
37
38
         xdcs_l;
39
         for (i = 0; i < 32; i++) {
40
           vs_spi_byte(*(vs_buffer+pt_vs_buffer+i));
41
         }
42
         xdcs_h;
43
44
      //------------------
45
46
47
      pt_vs_buffer += 32;
48
    }
49
50
//==================================================================
51
  }//while (fat_res==0){
52
#endif
53
//+++++++++++++++++++++++++++++++++++++++
54
//---------------------------------------
55
}
56
57
void EXTI1_x_IRQHandler(void)
58
{
59
    if(EXTI_GetITStatus((1<<kk_exti_pin)) != RESET)
60
{//============================================
61
if(vs_status & (1<<0)){
62
if (!timer_ledoff){timer_ledoff=100;}
63
     u32 i;// = 0,x=0,xx=0;
64
65
//    vs_write32Byte(vs_buffer,pt_vs_buffer);
66
67
...


nach
      vs_status |= (1<<0);//isr zuschalten
         while (dreq==0){;} //in isr nicht erforderlich
müsste die ISR/rising_edge Aufgerufen werden, weil dreq/pinA8 auf high 
geht.

Beim vs1053-Beschreiben im Hauptprogramm blinkt die in der isr 
aufgerufene led.

Nehme ich das Senden aus dem Hauptprogramm raus, wird die isr nicht mehr 
angessprungen obwohl dreq aus der Warteschleife heraus - also auf high _ 
geht.


Jemand eine Idee? Oder noch besser fertigen vs1053-isr code?

von john doe (Gast)


Lesenswert?

Was ist das denn für ein Murks?

Stell mal den kompletten Sourcecode ein, so versteht das ja keiner. Dazu 
die Verschaltung der Pins mit dem VS1053.

Den Transfer der 32Byte-Häppchen an den VS1053 machst Du übrigens am 
sinnvollsten per DMA, der STM32F103 hat einen simplen DMA-Controller, 
der einfach zu konfigurieren ist. Alles andere ist verschwendete 
Rechenzeit.

von grundschüler (Gast)


Lesenswert?

john doe schrieb:
> am sinnvollsten per DMA

Das hört sich doch gut an. Das müsste ja auch mit dem sd-Leseteil 
funktionieren?

Der player läuft. Problem ist nur, dass wenn er in der Hauptschleife 
läuft, über Polling keine ir-Befehle mehr erkannt werden und dann das 
gesamte Verzeichnis abgespielt wird. Bin dabei, den ir-Teil auf 
Interrupt umzustellen. Sobald das fertig ist, versuche ich es mit DMA 
und stelle den code ein, da ich für DMA sicher Hilfe brauche.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.