<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Jeste koukam, ze GPIO_PIN_x je uint16_t
ale tohle taky nepomuze:<br>
<br>
#define PREPAREDOREGS(A,B,C,v) A = ((v)&0x01) ?
(uint32_t)TFT_D0_Pin : ((uint32_t)TFT_D0_Pin) << 16;\<br>
C = ((v)&0x02) ?
(uint32_t)TFT_D1_Pin : ((uint32_t)TFT_D1_Pin) << 16;\<br>
A |= ((v)&0x04) ?
(uint32_t)TFT_D2_Pin : ((uint32_t)TFT_D2_Pin) << 16;\<br>
B = ((v)&0x08) ?
(uint32_t)TFT_D3_Pin : ((uint32_t)TFT_D3_Pin) << 16;\<br>
B |= ((v)&0x10) ?
(uint32_t)TFT_D4_Pin : ((uint32_t)TFT_D4_Pin) << 16;\<br>
B |= ((v)&0x20) ?
(uint32_t)TFT_D5_Pin : ((uint32_t)TFT_D5_Pin) << 16;\<br>
B |= ((v)&0x40) ?
(uint32_t)TFT_D6_Pin : ((uint32_t)TFT_D6_Pin) << 16;\<br>
A |= ((v)&0x80) ?
(uint32_t)TFT_D7_Pin : ((uint32_t)TFT_D7_Pin) << 16<br>
<br>
Dne 03.11.2017 v 20:08 Jaroslav Buchta napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:aae1d506-23d6-e317-5c98-915f2b69bd43@hascomp.cz">Mam kod
pro plneni displeje pripojeneho osmibitove k STM32F303, bity jsou
namixovany na ruzne porty tak to neni uplne jednoduche. Po zapnuti
optimalizace mi to zacne asi vynechavat nastaveni nekterych bitu,
barvy jsou spatne, nefunguje to se zakomentovanym makrem
APPLYDOREGS, tak jak to je to unguje OK. Pomuze take vypnout
optimalizaci nebo AH,AL... definovat jako volatile. <br>
<br>
assembler je pri optimalizaci strasnej gulas, na prvni pohled se
lisi kody pouzitim str vs str.w - jaky je v tom rozdil? Mel jsem
za to, ze jen v delce kodu instrukce, kdyz jsou operace s
registry... napr.: <br>
<br>
08001720: str r5, [r3, #24] <br>
08001722: str r1, [r4, #24] <br>
08001724: str.w r6, [r8, #24] <br>
<br>
Tusi nekdo cim to je? GPIOx->BSRR je snad definovano jako
volatile uint32_t. Reseni mam ale znervoznuje me to... <br>
<br>
#pragma GCC push_options <br>
#pragma GCC optimize ("O3") <br>
<br>
<br>
#define PREPAREDOREGS(A,B,C,v) A = ((v)&0x01) ? TFT_D0_Pin
: TFT_D0_Pin << 16;\ <br>
C = ((v)&0x02) ? TFT_D1_Pin :
TFT_D1_Pin << 16;\ <br>
A |= ((v)&0x04) ? TFT_D2_Pin :
TFT_D2_Pin << 16;\ <br>
B = ((v)&0x08) ? TFT_D3_Pin :
TFT_D3_Pin << 16;\ <br>
B |= ((v)&0x10) ? TFT_D4_Pin :
TFT_D4_Pin << 16;\ <br>
B |= ((v)&0x20) ? TFT_D5_Pin :
TFT_D5_Pin << 16;\ <br>
B |= ((v)&0x40) ? TFT_D6_Pin :
TFT_D6_Pin << 16;\ <br>
A |= ((v)&0x80) ? TFT_D7_Pin :
TFT_D7_Pin << 16 <br>
<br>
#define APPLYDOREGS(A,B,C) *(uint32_t *)(&GPIOA->BSRR) =
A;\ <br>
*(uint32_t *)(&GPIOB->BSRR) =
B;\ <br>
*(uint32_t *)(&GPIOC->BSRR) = C
<br>
<br>
//#define APPLYDOREGS(A,B,C) GPIOA->BSRR = A;\ <br>
// GPIOB->BSRR = B;\ <br>
// GPIOC->BSRR = C <br>
<br>
static void TftFillData (uint16_t w, int len) <br>
{ <br>
uint32_t AH,AL,BH,BL,CH,CL; <br>
<br>
TFT_RS_TPYA_GPIO_Port->BRR = TFT_RS_TPYA_Pin; <br>
TFT_NCS_GPIO_Port->BRR = TFT_NCS_Pin; <br>
PREPAREDOREGS(AH, BH, CH, 0x2c); <br>
APPLYDOREGS(AH, BH, CH); <br>
TFT_NWR_TPXA_GPIO_Port->BRR = TFT_NWR_TPXA_Pin; <br>
__DSB(); <br>
__ISB(); <br>
TFT_NWR_TPXA_GPIO_Port->BSRR = TFT_NWR_TPXA_Pin; <br>
<br>
TFT_RS_TPYA_GPIO_Port->BSRR = TFT_RS_TPYA_Pin; <br>
PREPAREDOREGS(AH, BH, CH, (uint8_t)(w >> 8)); <br>
PREPAREDOREGS(AL, BL, CL, (uint8_t)(w & 0xff)); <br>
while (len--) <br>
{ <br>
APPLYDOREGS(AH, BH, CH); <br>
TFT_NWR_TPXA_GPIO_Port->BRR = TFT_NWR_TPXA_Pin; <br>
__DSB(); <br>
__ISB(); <br>
TFT_NWR_TPXA_GPIO_Port->BSRR = TFT_NWR_TPXA_Pin; <br>
<br>
APPLYDOREGS(AL, BL, CL); <br>
TFT_NWR_TPXA_GPIO_Port->BRR = TFT_NWR_TPXA_Pin; <br>
__DSB(); <br>
__ISB(); <br>
TFT_NWR_TPXA_GPIO_Port->BSRR = TFT_NWR_TPXA_Pin; <br>
} <br>
TFT_NCS_GPIO_Port->BSRR = TFT_NCS_Pin; <br>
} <br>
<br>
_______________________________________________ <br>
HW-list mailing list - sponsored by <a
class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<br>
<a class="moz-txt-link-abbreviated"
href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a> <br>
<a class="moz-txt-link-freetext"
href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br>
</blockquote>
<p><br>
</p>
</body>
</html>