Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   87 / 176
(#) kiborg válasza csatti2 hozzászólására (») Feb 20, 2017 /
 
Szia!
A sok beállítás alatt azt értettem, hogy egy port kimenet legyen, egy csomó paramétert kell beállítani.
EZT a videót elnézve legalábbis, egy szimpla 8bites AVR után soknak tűnik.
Akkor próba majd EmBitz és egy csomó példa lehúz
(#) csatti2 válasza kiborg hozzászólására (») Feb 20, 2017 /
 
Szimpla 8 bites AVR alatt gondolom nem találkoztál az ATXMEGA családdal (már ott is jóval több minden volt mint az ATMEGA-nál).
Az a sok beállítás lehetővé tesz rengeteg olyan dolgot, amihez különben további hardver elemeket kellene betenni, az SPL használata pedig megkönnyíti a portolást az F0, F1 és F4 családok között. Amíg nem jön ki a LowLayer addig nálam marad az SPL, illetve a direkt regiszter piszkálgatás (ahol megéri a plusz macerát).
Egyébként úgyis copy-paste lesz később a konfigurációd. Az újrahasznosítást pedig megkönnyíti, ha nem direktbe hivatkozol a portokra, hanem definiálsz beszédesebb neveket és összegyűjtöd őket egy külön header fájlba, pl.:
  1. // DEBUG USART
  2. #define USART_DEBUG                       USART1
  3. #define USART_DEBUG_GPIO                  GPIOA
  4. #define USART_DEBUG_CLK                   RCC_APB2Periph_USART1
  5. #define USART_DEBUG_GPIO_CLK              RCC_APB2Periph_GPIOA
  6. #define USART_DEBUG_RxPin                 GPIO_Pin_10
  7. #define USART_DEBUG_TxPin                 GPIO_Pin_9
  8. #define USART_DEBUG_IRQn                  USART1_IRQn
  9. #define USART_DEBUG_IRQHandler            USART1_IRQHandler
  10. #define USART_DEBUG_DMA_CLK               RCC_AHBPeriph_DMA1
  11. #define USART_DEBUG_DMA_Channel           DMA1_Channel4     // Depends on USART! See DMA request mapping
  12. #define USART_DEBUG_DMA_IRQn              DMA1_Channel4_IRQn
  13. #define USART_DEBUG_DMA_IRQHandler        DMA1_Channel4_IRQHandler
  14. #define USART_DEBUG_DMA_FLAG              DMA1_FLAG_TC4

Majd a C fájl:
  1. // DEBUG - USART
  2. void USART_DEBUG_Config(uint32_t bufferAddr)
  3. {
  4.   GPIO_InitTypeDef GPIO_InitStruct;
  5.   USART_InitTypeDef USART_InitStruct;
  6.   DMA_InitTypeDef DMA_InitStructure;
  7.  
  8.   RCC_APB2PeriphClockCmd(USART_DEBUG_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);
  9.   RCC_APB2PeriphClockCmd(USART_DEBUG_CLK, ENABLE);
  10.  
  11.  
  12.   // Tx
  13.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  14.   GPIO_InitStruct.GPIO_Pin = USART_DEBUG_TxPin;
  15.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  16.   GPIO_Init(USART_DEBUG_GPIO, &GPIO_InitStruct);
  17.  
  18.   // Rx
  19.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  20.   GPIO_InitStruct.GPIO_Pin = USART_DEBUG_RxPin;
  21.   GPIO_Init(USART_DEBUG_GPIO, &GPIO_InitStruct);
  22.  
  23.   // Enable the DMA Clock
  24.   RCC_AHBPeriphClockCmd(USART_DEBUG_DMA_CLK, ENABLE);
  25.   DMA_DeInit(USART_DEBUG_DMA_Channel);
  26.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART_DEBUG->DR;//USART_DEBUG_DR_Base;
  27.   DMA_InitStructure.DMA_MemoryBaseAddr = bufferAddr;
  28.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  29.   DMA_InitStructure.DMA_BufferSize = 0;
  30.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  31.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  32.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  33.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  34.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  35.   DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
  36.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  37.   DMA_Init(USART_DEBUG_DMA_Channel, &DMA_InitStructure);
  38.   DMA_ITConfig(USART_DEBUG_DMA_Channel, DMA_IT_TC, ENABLE);
  39.   USART_DEBUG_DMA_NVIC_Configuration();
  40.   USART_InitStruct.USART_BaudRate = USART_DEBUG_BAUDRATE;
  41.   USART_InitStruct.USART_StopBits = USART_StopBits_1;
  42.   USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  43.   USART_InitStruct.USART_Parity = USART_Parity_No;
  44.   USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  45.   USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  46.   USART_Init(USART_DEBUG, &USART_InitStruct);
  47.   USART_DMACmd(USART_DEBUG, USART_DMAReq_Tx, ENABLE);
  48.   USART_ITConfig(USART_DEBUG,USART_IT_RXNE,ENABLE);
  49.   USART_DEBUG_NVIC_Configuration();
  50.   USART_Cmd(USART_DEBUG, ENABLE);
  51. }
A hozzászólás módosítva: Feb 20, 2017
(#) benjami válasza csatti2 hozzászólására (») Feb 20, 2017 / 1
 
F1-hez a GPIO-t én így oldottam meg.
A header file:
  1. // portláb módok (PP: push-pull, OD: open drain, FF: input floating
  2. #define ANALOG_INPUT          0x0
  3. #define PP_OUT_10MHZ          0x1
  4. #define PP_OUT_2MHZ           0x2
  5. #define PP_OUT_50MHZ          0x3
  6. #define FF_DIGITAL_INPUT      0x4
  7. #define OD_OUT_10MHZ          0x5
  8. #define OD_OUT_2MHZ           0x6
  9. #define OD_OUT_50MHZ          0x7
  10. #define PU_DIGITAL_INPUT      0x8
  11. #define PP_ALTER_10MHZ        0x9
  12. #define PP_ALTER_2MHZ         0xA
  13. #define PP_ALTER_50MH         0xB
  14. #define RESERVED              0xC
  15. #define OD_ALTER_10MHZ        0xD
  16. #define OD_ALTER_2MHZ         0xE
  17. #define OD_ALTER_50MHZ        0xF
  18.  
  19. #define GPIOX_PORT_(a, b)     GPIO ## a
  20. #define GPIOX_PORT(a)         GPIOX_PORT_(a)
  21.  
  22. #define GPIOX_PIN_(a, b)      b
  23. #define GPIOX_PIN(x)          GPIOX_PIN_(x)
  24.  
  25. #define GPIOX_CLOCK_(a, b)    RCC_APB2Periph_GPIO ## a
  26. #define GPIOX_CLOCK(a)        GPIOX_CLOCK_(a)
  27.  
  28. #define GPIOX_SETMODE_(a,b,c) ((GPIO_TypeDef*)(((c & 8) >> 1) + GPIO ## b ## _BASE))->CRL = (((GPIO_TypeDef*)(((c & 8) >> 1) + GPIO ## b ## _BASE))->CRL & ~(0xF << ((c & 7) << 2))) | (a << ((c & 7) << 2));
  29. #define GPIOX_SETMODE(a, b)   GPIOX_SETMODE_(a, b)
  30.  
  31. #define GPIOX_SETBIT_(a, b)   GPIO ## a->BSRR = 1 << b
  32. #define GPIOX_SETBIT(a)       GPIOX_SETBIT_(a)
  33.  
  34. #define GPIOX_CLRBIT_(a, b)   GPIO ## a->BSRR = 1 << (b + 16)
  35. #define GPIOX_CLRBIT(a)       GPIOX_CLRBIT_(a)
  36.  
  37. #define GPIOX_INBIT_(a, b)    (GPIO ## a->IDR & (1 << b))
  38. #define GPIOX_INBIT(a)        GPIOX_INBIT_(a)
  39.  
  40. #define GPIOX_LINE_(a, b)     EXTI_Line ## b
  41. #define GPIOX_LINE(a)         GPIOX_LINE_(a)
  42.  
  43. #define GPIOX_PORTSRC_(a, b)  GPIO_PortSourceGPIO ## a
  44. #define GPIOX_PORTSRC(a)      GPIOX_PORTSRC_(a)
  45.  
  46. #define GPIOX_PINSRC_(a, b)   GPIO_PinSource ## b
  47. #define GPIOX_PINSRC(a)       GPIOX_PINSRC_(a)


A c-ben pedig így lehet felhasználni:
  1. #define GOMB   A, 2
  2. #define LED_1  B, 9
  3. #define LED_2  B, 10
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7.   RCC_APB2PeriphClockCmd(GPIOX_CLOCK(GOMB) | GPIOX_CLOCK(LED_1) | GPIOX_CLOCK(LED_2));
  8.   GPIOX_SETMODE(PU_DIGITAL_INPUT, GOMB);
  9.   GPIOX_SETBIT(GOMB); // hogy felhuzo ellenállás legyen
  10.   GPIOX_SETMODE(OD_OUT_2MHZ, LED_1);
  11.   GPIOX_SETMODE(OD_OUT_2MHZ, LED_2);
  12.   while(1);
  13.   {
  14.     if(GPIOX_INBIT(GOMB))
  15.     {
  16.       GPIOX_SETBIT(LED_1);
  17.       GPIOX_CLRBIT(LED_2);
  18.     }
  19.     else
  20.     {
  21.       GPIOX_CLRBIT(LED_1);
  22.       GPIOX_SETBIT(LED_2);
  23.     }
  24.   }
  25. }
A hozzászólás módosítva: Feb 20, 2017
(#) benjami válasza benjami hozzászólására (») Feb 20, 2017 /
 
A while(1) után nem kell a pontosvessző (csak már nem tudtam javítani) !
(#) csatti2 válasza benjami hozzászólására (») Feb 20, 2017 /
 
Nem rossz megoldás. Mondjuk én maradok az SPL funkcióknál, ahol lehet (úgy értem, nem rejtem őket makrók mögé), bár vmiért eddig nem jutott eszembe makrókkal összefűzni a leszármaztatott elemeket (pedig rendszeresen használom ilyesmi célra a makrókat , lásd példa: )
  1. #define ISR(x)      void ALWAYSINLINE x ## _code (void); \
  2.                     void __attribute__ ((interrupt ("IRQ"))) x (void) { \
  3.                       MONITOR_1_SET(); \
  4.                       x ## _code(); \
  5.                       MONITOR_1_CLR(); \
  6.                     } \
  7.                     void ALWAYSINLINE x ## _code (void)
A hozzászólás módosítva: Feb 20, 2017
(#) Lardy hozzászólása Feb 21, 2017 /
 
Sziasztok!

Milyen grafikus könyvtárat használtok vagy tudnátok ajánlani STM32 mikrokontrollerekhez GUI fejlesztéshez?
(#) rascal hozzászólása Feb 23, 2017 /
 
Sziasztok!
A kereső szerint senki nem akarta idáig a sleep módokat használni, vagy nem szívott vele, én viszont igen, ezért gondoltam megosztom mi kell, hogy működjön. A három alvó módból a stop módot akartam használni, ami nagyjából mindent megállít, de pl. az sram, az rtc működik tovább. Felébreszteni ebből megszakítással, vagy eseménnyel lehet, és ott folytatódik minden ahol abbamaradt. Az eseményben az a jó, hogy nem kell hozzá megszakítást generálni, megszakítást lekezelő rutint írni, miközben ugyanazokkal a bemenetekkel, vagy belső még működő perifériákkal lehet kiváltani, mint egy megszakítást. A szükséges lépések:

Ha GPIO az ébresztő jel forrása (nekem az, ezért ilyen a példa):

Szükséges GPIO-k bekapcsolása és bemenetként definiálása
SYSCFG regiszterek engedélyezése a megfelelő RCC regiszterben.
SYSCFG->EXTICR regiszterekben a GPIO-k beállítása

EXTI regiszterek beállítása:
EXTI->RTSR beállítása, felfutó él detektálásához (opcionális, de legalább az egyik kell)
EXTI->FTSR beállítása, lefutó él detektálásához (opcionális, de legalább az egyik kell)
EXTI->EMR beállítása, hogy eseményként (event) érzékelje
(EXTI->IMR ha irq-t szeretnénk, de ezen a vonalon nem mentem végig)
EXTI->PR-t törölni (csupa egyest beleírni. Ha másra is használva van az EXTI, akkor lehet, hogy finomabban kell.)
  1. __SEV(); // bekapcsolja proci esemény regiszterét (mellesleg jelet küldene a többi procinak is)
  2. __WFE(); // nem tud elmenni aludni, mert az esemény regiszter 1-ben van, viszont törli.
  3. PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFE); // Az ebben levő WFE() már el tud menni aludni. (stm32f4xx_pwr.c)

A fenti kódrészletben látszik, hogy a CMSIS rutinját használtam, ami pár dolgot még beállít, de ha csak simán meghívtam nem ment el az uC aludni. A procinak van egy titkos kis bitje, ami jelzi ha esemény történt, és ha az 1-ben van, akkor a WFE utasítás nem tudja elaltatni. Annyit viszont megtesz, hogy törli ezt a bitet, így egy következő WFE (ami ott van a függvényben) már el tud menni aludni. (Na ehhez kellett egy félig kínai, félig angol nyelvű oldal elejtett megjegyzése...) Az lutri, hogy az említett státusz bit milyen állapotban van (lekérdezni nem lehet), ezért az első WFE előtt 1-be kell állítani, nehogy az is elmenjen aludni. (Nem biztos, hogy az ébresztő esemény két leálláson is keresztül tudja verekedni magát.) Erre a SEV utasítást lehet használni, aminek az a feladata, hogy multiprocesszoros rendszerben a többi processzornak ébresztő jelet küldjön. Erre esetleg figyelni kell, de nálam ez nem jelent most problémát.
Az altatás lelövi teljesen a PLL-t, ezért ha nem közvetlenül HSI-ről megy a rendszer, akkor újra be kell állítani az órajelet. Egyik timer-t megszakításhoz használtam, azt nem kellett letiltanom, vagy újra konfigurálnom, ébredés után dolgozott tovább probléma nélkül. Stm32f407-esen kísérletezek.
(#) csatti2 válasza rascal hozzászólására (») Feb 23, 2017 /
 
Ez hasonlóan működik Cortex-M3-nál is, csak ott oda kell figyelni, hogy a régebbi revíziók bug-osak és nem mindig állítják be az event bitet, ezért a megszakítások végére oda kell biggyeszteni a __SEV(); -et.
(#) rascal válasza csatti2 hozzászólására (») Feb 24, 2017 /
 
Ezt jó tudni, de ott még nem tartok, hogy értsem miért jó, ha a megszakítás végén 1-be kerül az a státusz bit? Kinek lesz arra szüksége? Gondolom a szoftver egyik fele inkább változókon keresztül dumál a másik felével.
(#) csatti2 válasza rascal hozzászólására (») Feb 24, 2017 /
 
Azért kell, mert beragadhat a program a WFE-n és nem folytatja a futást a megszakításból való visszatéréskor (mint írtam ez egy bug, ami az első pár revíziót érintette).
(#) rascal válasza csatti2 hozzászólására (») Feb 25, 2017 /
 
Akkor hiba esetén pont egy SEV-WFE végrehajtás között jött az irq, vagy egy már WFE-vel altatott procit felébresztett, de az azonnal vissza is aludt, amikor az irq rutin befejezte?
(#) csatti2 válasza rascal hozzászólására (») Feb 25, 2017 /
 
Utóbbi.
Ezért is használom a fenti makrót a megszakítások definiálásához, mert így könnyen hozzáfűzhetek a megszakításaim elejéhez/végéhez kiegészítő utasításokat szükség esetén (pl. DSB, ISB, SEV, stb.) anélkül, hogy mindenütt át kelljen írnom őket. A fenti példában pl. egy kimenetet billegtettek, hogy egy logikai analizátor segítségével megmérhessem a megszakításokban töltött időt.
A hozzászólás módosítva: Feb 25, 2017
(#) rascal válasza csatti2 hozzászólására (») Feb 25, 2017 /
 
Értem. Szép makró! Azt hiszem sokat fogom tanulmányozni.
(#) cimopata hozzászólása Márc 2, 2017 /
 
Üdv.

2. processzorral járok úgy hogy visszaküldték az áramkört mint kiderül bezárlatosodott az SMT32 a panelen. Nem igazán értem hogy mi a kiváltó oka. A 3.3v tápot egy ld1117-33 ról kapja az pedig egy ld1117-5.0-ról mindegyik jó szépen csinálják az 5v és 3.3v-ot. Túlfeszt kaphatott volna valamelyik bemenetéről? Igazából nem szoktam diódázni a bemeneteket hanem teszek a bemenetek elé egy minimum 2k-s ellenállást és a maradékot rábízom a belső diódákra amik a táp felé mennek. Mi lehet a baj? Hasonló valakinek?
(#) csatti2 válasza cimopata hozzászólására (») Márc 2, 2017 /
 
A belső diódákra bízni a védelmet talán elmegy egy hobbista prototípusánál, de nem olyan áramkörnél, amit árusítasz. Mondjuk a leírásodból biztos nem mondjuk meg mi lehet a probléma. Talán ha mellékelnél egy kapcsolási rajzot, illetve leírnád milyen körülmények között használják az áramkört (ipar, iroda, otthon, kültéri).
(#) Lucifer válasza cimopata hozzászólására (») Márc 2, 2017 /
 
Idézet:
„Igazából nem szoktam diódázni a bemeneteket hanem teszek a bemenetek elé egy minimum 2k-s ellenállást és a maradékot rábízom a belső diódákra amik a táp felé mennek. Mi lehet a baj? Hasonló valakinek?”

Erre szokták mondani, hogy együtt sírunk, együtt nevetünk!
(#) cimopata válasza csatti2 hozzászólására (») Márc 2, 2017 /
 
Erősen ipari, viszont össz vissz 2 külső bemenete van (1 analóg és egy digitális) minden más az áramkörön belül mozog. Minden analóg bemenet 0-3.3v közti tápról kapja a jelet (műveleti meg potik a panelen). PWM kimenetek vannak még amik használ a fetmeghajtó.

Egyetlen nagyobb mért jel a tápfesz ami 22k/1k leosztással megy maximum 50V-ot mérek.
A külső potiról kapott jelet 4k7 ellenállással előtétezem a digitálisnál is 4k7 viszont ott elég furán van az ST bemenete mert PB4-es lábnál most, hogy eszembe jut nincs a táp felé diódázva hanem Vcc+4V-nál megfogja ha van valami.

Nem mondom hogy ez lehetett a baj de megnyugtató lenne találni valamit.
(#) cimopata hozzászólása Márc 2, 2017 /
 
Továbbá minden ADC bemenet 100nF al földelve van ami az EMC zavarokat végképp elnyomja. Egyedül a digitális bemenet aggasztó ilyen szempontból.
(#) cimopata hozzászólása Márc 2, 2017 /
 
A fel nem használt lábakat szoktátok konfigurálni pl bemenetnek leúzóellenállással?
(#) csatti2 válasza cimopata hozzászólására (») Márc 3, 2017 /
 
Ipari, és mégis kihagytad a védődiódákat... A katonain kívül nincs is nagyobb igénybevételű terület.

A bemeneteid a képen látható módokon védheted meg. Első fokozatként használj zener vagy TVS diódát (szupresszor). Az első ellenállás nagyobb teljesítményű TVS dióda esetén opcionális (de ártani nem árt). A második ellenállásnál figyelembe kell venni a TVS/zener dióda max. feszét, hogy becsülni lehessen a max áramát a schottky diódáknak (az ehhez tartozó nyitófesznek kell 0,3V alatt lennie). Ha túl nagyok az ellenállások, akkor az viszont hibaként jelentkezik majd a diódák szivárgó árama miatt.

Érdekes lehet még, hogy leválasztottad-e a digitális és analóg földedet a teljesítmény, illetve bejövő jelek földjétől (és ha igen, hogyan).
A hozzászólás módosítva: Márc 3, 2017
(#) killbill válasza cimopata hozzászólására (») Márc 3, 2017 /
 
Ha 5V toleráns a bemenet, akkor nincs is dióda a 3.3v táp felé. Az ESD diódák meg ESD ellen védenek csak.
(#) cimopata válasza killbill hozzászólására (») Márc 3, 2017 /
 
Oké, ezeket akkor legközelebb figyelembe veszem.
(#) kiborg hozzászólása Márc 3, 2017 /
 
Sziasztok!

CooCox és STLinkV2 esete forog fenn. Lefordítom a programot, nincs hibaüzenet,majd amikor debugolni akarom,akkor :
Error: Failed to open flash driver file
Program Download Failed ! hibaüzenet fogad. A rendszer mfizikailag nem hibás, jól van összekötve,mert EmBitz letudja tölteni és működik is.
Mi lehet az ok és hogyan lehetne elhárítani? Járt már más is így?
(#) cpt.zoltan.simon hozzászólása Márc 3, 2017 /
 
Helló Urak!
Kíváncsiskodnék.
Van valakinek Dallas 1-wire driver a birtokában?
Semmi különös, csak send, recieve, ennyi
(#) kiborg hozzászólása Márc 3, 2017 /
 
EmBitz.
A Session Start/Stop-al letölti a programot ugye?
Mert látom, hogy a rákötött led villog, tudom a villogás sebességét változtatni,stb.
De szokás szerint jön a DE ! ha megszüntetem a proci tápját (kihúzom az usb-ből) és újra tápfeszültség alá helyezem, nem történik semmi. Az addig múködő/villogó led megszűnik életjelet adni. Ez nem tetszik Hogy lehet ezt kiküszöbölni?
(#) csatti2 válasza kiborg hozzászólására (») Márc 3, 2017 /
 
Release módra váltasz és úgy töltöd fel. Ha úgy megy, akkor nézd át a beállításaid a debug módhoz.
(#) Topi válasza cpt.zoltan.simon hozzászólására (») Márc 3, 2017 / 1
 
DS18B20-hoz írtam még anno, használd egészséggel
GPIO konfigos, timer vezérelt.

  1. #include "1wire.h"
  2. #include "includes.h"
  3.  
  4. //=============================
  5. void OneWire_Init(GPIO_TypeDef *gpio, unsigned short pin) {
  6. //=============================
  7.   TIM_TimeBaseInitTypeDef TIM_InitStructure;
  8.   GPIO_InitTypeDef GPIO_InitStructure;
  9.  
  10.   OW_GPIO_Periph_F(OW_GPIO_Periph, ENABLE);
  11.   OW_TIM_Periph_F(OW_TIM_Periph, ENABLE);
  12.  
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  14.   GPIO_InitStructure.GPIO_Pin = pin;
  15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.   GPIO_Init(gpio, &GPIO_InitStructure);
  17.   gpio->BSRR = pin;
  18.  
  19.   TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  20.   TIM_InitStructure.TIM_Prescaler = 72 - 1;
  21.   TIM_InitStructure.TIM_Period = 10000 - 1; // Update event every 10000 us / 10 ms
  22.   TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  23.   TIM_InitStructure.TIM_RepetitionCounter = 0;
  24.   TIM_TimeBaseInit(OW_TIM, &TIM_InitStructure);
  25. //      TIM_ITConfig(timer, TIM_IT_Update, ENABLE);
  26.   TIM_Cmd(OW_TIM, ENABLE);
  27.  
  28. }
  29.  
  30. //=============================
  31. void OneWire_DelayUs(unsigned short d) {
  32. //=============================
  33.   OW_TIM->CNT = 0;
  34.   if(d>=3) d -= 3;
  35.   while (OW_TIM->CNT <= d) {}
  36. }
  37.  
  38. //=============================
  39. unsigned char OneWire_Reset(GPIO_TypeDef *gpio, unsigned short pin) {
  40. //=============================
  41.   unsigned int i;
  42.   //Pull down min. 480us
  43.   gpio->BRR = pin;
  44.   OneWire_DelayUs(500);
  45.   gpio->BSRR = pin;
  46.  
  47.   //Wait 70us
  48.   OneWire_DelayUs(70);
  49.   i = (gpio->IDR & pin);
  50.  
  51.   OneWire_DelayUs(430);
  52.  
  53.   return (i == 0);
  54. }
  55.  
  56. //=============================
  57. void OneWire_Write_1(GPIO_TypeDef *gpio, unsigned short pin) {
  58. //=============================
  59.   gpio->BRR = pin;
  60.   OneWire_DelayUs(10);
  61.   gpio->BSRR = pin;
  62.   OneWire_DelayUs(55);
  63. }
  64.  
  65. //=============================
  66. void OneWire_Write_0(GPIO_TypeDef *gpio, unsigned short pin) {
  67. //=============================
  68.   gpio->BRR = pin;
  69.   OneWire_DelayUs(70);
  70.   gpio->BSRR = pin;
  71. }
  72.  
  73. //=============================
  74. unsigned char OneWire_ReadBit(GPIO_TypeDef *gpio, unsigned short pin) {
  75. //=============================
  76.   //Pull down 5us
  77.   gpio->BRR = pin;
  78.   OneWire_DelayUs(5);
  79.   gpio->BSRR = pin;
  80.  
  81.   OneWire_DelayUs(10);
  82.   //Wait 5us before bus check
  83.   unsigned int ret = (gpio->IDR & pin);
  84.  
  85.   //Wait until timeslot end (60 usd + 5us recovery)
  86.   OneWire_DelayUs(50);
  87.  
  88.   return (ret>0)?1:0;
  89. }
  90.  
  91. //=============================
  92. void OneWire_WriteByte(GPIO_TypeDef *gpio, unsigned short pin, unsigned char d) {
  93. //=============================
  94.   unsigned char i;
  95.   for(i=0;i<8;i++) {
  96.     if(d & 0x01) {
  97.       OneWire_Write_1(gpio, pin);
  98.     } else {
  99.       OneWire_Write_0(gpio, pin);
  100.     }
  101.     d >>= 1;
  102.   }
  103. }
  104.  
  105. //=============================
  106. unsigned char OneWire_ReadByte(GPIO_TypeDef *gpio, unsigned short pin) {
  107. //=============================
  108.   unsigned char i;
  109.   unsigned char d;
  110.   d = 0;
  111.   for(i=0;i<8;i++) {
  112.     d >>= 1;
  113.     if(OneWire_ReadBit(gpio, pin)) d |= 0x80;
  114.   }
  115.   return d;
  116. }
A hozzászólás módosítva: Márc 3, 2017
(#) kiborg válasza csatti2 hozzászólására (») Márc 4, 2017 /
 
Kipróbáltam Relase módban is, ugyanaz a helyzet.
Kipróbálgattam, hogy ha a boot jumpereket pakolászom,mi történik, de semmi változás.
(#) csatti2 válasza kiborg hozzászólására (») Márc 4, 2017 /
 
A debuggert bedugva hagytad, vagy kihúztad? Milyen fejlesztői kártyát használsz?
(#) kiborg válasza csatti2 hozzászólására (») Márc 4, 2017 /
 
Szia!

A board-ot a programozó (STLinkV2) látja el 3,3V-al.
Minkét esetet próbáltam.
a; debuggert kihúz USB-ból, minden áramtalanít.
b; debugger bedugva maradt és csak a debugger és target közötti 3,3V szakítottam meg.

Mindkét esetben ugyanaz az eredmény.

Ilyen lapot használok. Amiben STM32F103C8T6 proci van.
A hozzászólás módosítva: Márc 4, 2017
Következő: »»   87 / 176
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem