bluebird schrieb:
> ... und meine Frage an was dies liegen könnte.
Zuerst an der verwendeten ST-Lib und dann an dir, nämlich daß du diese
überhaupt verwendest, und dann nochmal an dir, daß du selbige
verwendest, OHNE all dem, was da abgeht (oder eben nicht abgeht), mal
gründlich nachzusteigen.
Ich poste dir hier mal nen Ausschnitt aus einem älteren
STM32F103-Projekt:
{c]
void Do_Config (void)
{ long L;
RCC->CIR = 0; /* alle RCC-Interrupts ausschalten */
RCC->APB1RSTR = 0; /* evtl. Reset's beseitigen */
RCC->APB2RSTR = 0;
FLASH->ACR = (1<<4); /* Flash-Prefetch-Buffer einschalten */
RCC->CFGR = (5<<24); /* MCO=HSI, sonst nix.. erstmal */
RCC->AHBENR = 0xFFFF; /* */
RCC->APB2ENR = 0xFFFFFFFF;
RCC->APB2ENR = 0xFFFF;
GPIOG->CRL = wf_GPIOG_CRL;
GPIOG->CRH = wf_GPIOG_CRH;
GPIOG->ODR &= ~(1<<6);
L = 10000; while (--L);
/* zuerst Takterzeugung aufsetzen.
nach einem Hardware-Reset sind folgende Bits gesetzt:
in RCC_CR = HSIRDY, HSION, HSITRIM = 8
in RCC_AHBENR = FLITFEN, SRAMEN
in RCC_CSR = PORRSTF, PINRSTF
Vorsicht: nach irgendwelchen Software-Resets muß das nicht so sein!
*/
RCC->CR = (8<<2)|1; /* Umschalten auf HSI = interne 8 MHz
*/
while ((RCC->CR & 2)==0); /* warten auf HSIRDY (wird von
Hardware gesetzt) */
/* so, jetzt ist RCC im Urzustand wie nach einem Hardware-Reset */
RCC->CR |= (1<<16); /* externen 6 MHz Oszillator HSE einschalten
*/
L = 5000;
while (L)
{ --L; if (RCC->CR & (1<<17)) goto _hse_rdy; } /* wenn ext.
Oszi ready */
_hse_rdy:
if (L) /* wenn wir nicht vergeblich auf HSE
gewartet haben.. */
{ FLASH->ACR = (1<<4)|2; /* Prefetch-Buffer + 2 Waits bei 72
MHz */
RCC->CFGR = (7<<24)| /* MCO=1/2PLL */
(0<<22)| /* UsbClk=PLL/1.5 */
(10<<18)| /* PLL = 12*HSE (6*12=72) */
(1<<16)| /* PllSource=HSE */
(3<<14)| /* AdcTakt=PCLK2/8 */
(4<<11)| /* APB2=Hclk/2=36MHz */
(4<<8); /* APB1=Hclk/2=36MHz */
RCC->CR |= (1<<24); /* PLL einschalten */
while ((RCC->CR & (1<<25))==0); /* warten auf PLLRDY */
RCC->CFGR = (RCC->CFGR & 0xFFFFFFFC)|2; /* PLL als Taktquelle
wählen */
do { L = RCC->CFGR & (3<<2);
} while (L!= (2<<2)); /* warten bis PLL=Taktquelle
*/
}
RCC->AHBENR = wf_AHBENR; /* AHB enables */
RCC->APB1ENR = wf_APB1ENR; /* APB1 enables */
RCC->APB2ENR = wf_APB2ENR; /* APB2 enables */
Backup-Domain enables:
sind nach Reset erstmal schreibgeschützt. Entsperren mit PWR->CR
(1<<8) auf hi */
if ((RCC->BDCR & 2)==0) /* wenn 32kHz Oszi nicht ready ist */
{ PWR->CR |= (1<<8);
RCC->BDCR = (1<<16)|(1<<15)|1; /* RTC Reset, enable, 32kHz on */
RCC->BDCR = (1<<15)|(1<<8)|1; /* RTC enable, LSE als Quelle, 32kHz
on
}
/* Pin-Funktionen aufsetzen */
GPIOA->CRL = wf_GPIOA_CRL;
GPIOA->CRH = wf_GPIOA_CRH;
GPIOB->CRL = wf_GPIOB_CRL;
GPIOB->CRH = wf_GPIOB_CRH;
GPIOC->CRL = wf_GPIOC_CRL;
GPIOC->CRH = wf_GPIOC_CRH;
GPIOD->CRL = wf_GPIOD_CRL;
GPIOD->CRH = wf_GPIOD_CRH;
GPIOE->CRL = wf_GPIOE_CRL;
GPIOE->CRH = wf_GPIOE_CRH;
GPIOF->CRL = wf_GPIOF_CRL;
GPIOF->CRH = wf_GPIOF_CRH;
GPIOG->CRL = wf_GPIOG_CRL;
GPIOG->CRH = wf_GPIOG_CRH;
/* Pin-Remap */
AFIO->MAPR = wf_AFIO_MAPR;
[/c]
Ist nicht zum blinden Kopieren gedacht, sondern um mal zu sehen, wie
ich vor 4..5 Jahren daran gegangen bin. Meine Nicht-ungarische Notation
ist ganz einfach: wf_Register meint "Wert für Register" und ist woanders
definiert. Beispiel:1 | #define wf_APB2ENR (en2_AFIO) | (en2_IOPA<<2) | (en2_IOPB<<3) | (en2_IOPC<<4) | (en2_IOPD<<5) | (en2_IOPE<<6) | (en2_IOPF<<7) | (en2_IOPG<<8) | \
|
2 | (en2_ADC1<<9) | (en2_ADC2<<10) | (en2_TIM1<<11) | (en2_SPI1<<12) | (en2_TIM8<<13) | (en2_USART1<<14) | (en2_ADC3<<15)
|
(mal sehen, ob das hier so kommt wie in der Quelle...)
Natürlich kann man das auch anders machen, also streng dich mal an und
lies das RefMan.
W.S.