Kol gcc (CooCox) bir STM32F4discovery programlamak için kullanıyorum ve bir endian sorunu w / güreş
SPI üzerinden 24 bitlik ADC ile örnek alıyorum. Üç bayt geldiğinden, MSB ilk önce onları (daha önce umuyorum!) Kullanımı biraz daha kolay hale getirmek için bir sendikaya yükleme fikrim vardı.
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
MSB olarak [0] ile spi okumaları analogin0.spibytes [0] - [2] 'ye veri yükledim, sonra bir kerede 8 bitlik bir megabaudda USART aracılığıyla tükürdüm. Sorun yok.
Verileri 12 bitlik bir DAC'ye aktarmaya çalıştığımda sorunlar başladı. Bu SPI DAC, MSB'de başlayan 4 bit önek ve ardından 12 bit veri içeren 16 bit sözcükler ister.
İlk denemeler, ADC'nin verdiği ikişer tamamlayıcıyı, analogin0.spihalfwords [0] 'u 0x8000 ile xoring ederek, sonucu alt 12 bite kaydırarak ve sonra önekini aritmetik olarak ekleyerek ikiliyi dengelemekti.
Analogin0.spibytes [0] = 0xFF ve ve analogin0.spibytes [1] = 0xB5 için analogin0.halfwords [0] 'ın 0xFFB5'e eşit olduğunu ve 0xFFB5'e eşit olduğunu fark edene kadar inanılmaz derecede sinir bozucu !!!!!
Bunu fark ettikten sonra, aritmetik işlemleri ve yarım kelimeyi kullanmayı bıraktım ve bitsel mantık ve baytlara yapıştım
uint16_t temp=0;
.
.
.
// work on top 16 bits
temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]);
temp=temp^0x8000; // convert twos complement to offset binary
temp=(temp>>4) | 0x3000; // shift and prepend with bits to send top 12 bits to DAC A
SPI_I2S_SendData(SPI3,temp); //send to DACa (16 bit SPI words)
... ve bu işe yaradı. Kodun ilk satırından sonra temp'e göz attığımda 0xFFB5 değil 0xB5FF, bu yüzden her şey iyi
Sorular için ...
Korteks benim için yeni. Her iki platformun da küçük endian olmasına rağmen PIC'yi int16'larda değiştirdiğini hatırlayamıyorum. Bu doğru mu?
Bununla baş etmenin daha zarif bir yolu var mı? ARM7'yi büyük endian moduna sokabilseydim harika olurdu. Cortex M4'ün bi-endian olduğuna dair birçok referans görüyorum, ancak tüm kaynaklar bana nasıl yapılacağını söylemekten yoksun gibi görünüyor . Daha spesifik olarak, STM32f407'yi büyük endian moduna nasıl yerleştirebilirim, gcc'de yapılabilirse daha iyi. Bu SADECE AIRCR kaydında uygun bitin ayarlanmasıyla mı ilgili? Derleyiciyi eşleştirmek için ayarlamak veya daha sonra tutarsız kütüphanelerle matematik vidaları gibi herhangi bir sonuç var mı?