[fpc-pascal] FPC Embedded DMA with STM32?

Jeppe Johansen jeppe at j-software.dk
Sun May 10 09:59:34 CEST 2015


Are you using 2.6.4? This sounds like something that was fixed some time 
ago in trunk.

Either way I cannot reproduce any problems with SVN trunk.

On 05/10/2015 02:21 AM, turro75 wrote:
> Update:
>
> I solved by declaring individual registers as absolute.
> I need the help of some fpc guru to understand why I got the problem.
>
> According to stm32 manual I declared the same register in two ways:
> /
> TDMAChannel = record
>    CCR,
>    CNDTR,
>    CPAR,
>    CMAR :longword;
>   end;
>
>
> DMA1_Channel1 : TDMAChannel                         absolute ($40020008);
> dma1_ccr1 : longword   absolute($40020008);
> dma1_cndtr1 : longword   absolute($4002000C);
> dma1_cpar1 : longword   absolute($40020010);
> dma1_cmar1 : longword   absolute($40020014);    /
>
> I put some values to the serial port to understand what is happening:
>
> /Serial1.println;
>    Serial1.print('0x'+hexstr(longword(@DMA1_Channel1.CCR),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_CCR1),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_Channel1.CNDTR),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_CNDTR1),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_Channel1.CPAR),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_CPAR1),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_Channel1.CMAR),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_CMAR1),8));
>    Serial1.println;   /
>
> this is the output:
> 0x40020008 0x40020008 0x4002000C 0x4002000C 0x40020010 0x40020010 0x40020014
> 0x40020014
>
> so address are exactly the same
>
> if I remove the @ I should get the value of the register:
>
>   / Serial1.println;
>    Serial1.print('0x'+hexstr(longword(@DMA1_Channel1.CCR),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_CCR1),8));
>    Serial1.print(' 0x'+hexstr(longword(@DMA1_Channel1.CNDTR),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_CNDTR1),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_Channel1.CPAR),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_CPAR1),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_Channel1.CMAR),8));
>    Serial1.print(' 0x'+hexstr(longword(DMA1_CMAR1),8));
>    Serial1.println;  /
>
> this is the output:
> 0x40020008 0x00005A61 0x4002000C 0x0000000D 0x200002F4 0x200002F4 0x40010810
> 0x40010810
>
> If I remove also the @ from /Serial1.print('
> 0x'+hexstr(longword(@DMA1_Channel1.CNDTR),8));/
>
> this is the output:
> 0x40020008 0x00005A61
>
> the program stops running when trying to access this register, it does the
> same with DMA1_Channel1.CCR.
> what makes me mad is that the other 2 registers are well working and in the
> stm32f103fw unit there are a lot of registers which work fine with the
> record declaration.
>
> Any idea?
>
>
>
> --
> View this message in context: http://free-pascal-general.1045716.n5.nabble.com/FPC-Embedded-DMA-with-STM32-tp5721684p5721685.html
> Sent from the Free Pascal - General mailing list archive at Nabble.com.
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>




More information about the fpc-pascal mailing list