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@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal