Цитата(Petka @ May 16 2011, 12:28)

Обязательно отпишитесь о результатах.
получилось но криво. в линкер ничего пихать не надо.
я залез в объявление структуры DAC_TypeDef (stm32f10x.h)
если компилировать с помощью c++ то проблен нет вообще
заменяем объявление поля структуры на (пример для регистра СR ЦАПа)
Код
typedef struct
{
__IO uint32_t CR;
__IO uint32_t SWTRIGR;
__IO uint32_t DHR12R1;
.....
} DAC_TypeDef;
на
Код
typedef struct
{
union CR {
__IO uint32_t val;
struct
{
uint32_t EN1 : 1;
uint32_t BOFF1 : 1;
uint32_t TEN1 : 1;
uint32_t TSEL1 : 3;
uint32_t WAWE1 : 2;
uint32_t MAMP1 : 4;
uint32_t DMAEN1 : 1;
uint32_t Reserve1 : 3;
uint32_t EN2 : 1;
uint32_t BOFF2 : 1;
uint32_t TEN2 : 1;
uint32_t TSEL2 : 3;
uint32_t WAWE2 : 2;
uint32_t MAMP2 : 4;
uint32_t DMAEN2 : 1;
uint32_t Reserve2 : 3;
} CR_BITS;
CR& operator= (const uint32_t src) { val = src; return *this; }
};
__IO uint32_t SWTRIGR;
__IO uint32_t DHR12R1;
.....
} DAC_TypeDef;
итогом становится то что двойное слово теперь интерпретируется как битовое поле объедененное с этим словом. отладчик бодро отрисовывает содержание полей.
в этом способе есть ложка дегтя - посколькоу __IO uint32_t CR превратился в enum {...} то в коде использующем DAC_TypeDef операция DAC->CR=XXX будет неактуальна, потому что нельзя присвоить целого типа в объект объединения типа, поэтому приходится перегрузит операцию присваивания с помощью CR& operator= (const uint32_t src). Это сразуже ствит крест на возможности скомпилировать с помощю компилятора С.
теперь вариант с компиллером С. в принципе можно объявить структуру анонимной без перегрузки присваивания но уже с полем __IO uint32_t CR :
Код
typedef struct
{
union {
__IO uint32_t CR;
struct
{
uint32_t EN1 : 1;
uint32_t BOFF1 : 1;
uint32_t TEN1 : 1;
uint32_t TSEL1 : 3;
uint32_t WAWE1 : 2;
uint32_t MAMP1 : 4;
uint32_t DMAEN1 : 1;
uint32_t Reserve1 : 3;
uint32_t EN2 : 1;
uint32_t BOFF2 : 1;
uint32_t TEN2 : 1;
uint32_t TSEL2 : 3;
uint32_t WAWE2 : 2;
uint32_t MAMP2 : 4;
uint32_t DMAEN2 : 1;
uint32_t Reserve2 : 3;
} CR_BITS;
};
__IO uint32_t SWTRIGR;
__IO uint32_t DHR12R1;
.....
} DAC_TypeDef;
в этом случае DAC->CR=XXX проходит естественно на ура но..... отладчик теперь не знает имени объединения , потому что его нет - оно анонимное. приплыли.
если на то что нада периписать все обращения вызовы DAC->CR=XXX на DAC->CR.val = XXX закрыть глаза ( например библиотечные где уже с этим регистром чтото делается ) то проблем вообще нет - в данном случае называем объединение конкретным именем CR и все работает.
разумется в скрипт линкера ничего сувать не требуется, он вообще тут непричем, адрес региста из дефайна берется а не из адреса секции.
никакх