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   153 / 175
(#) benjami válasza vargham hozzászólására (») Dec 4, 2020 /
 
Sosem használtam gigadevice kontrollert, csak megnéztem az adatlapját. Ha jól értelmezem az FWDGT_CTL regiszterbe írt 0x5555 értékkel lehet kikapcsolni (0x5555: Disable the FWDGT_PSC, FWDGT_RLD and FWDGT_WND write protection)
(#) bbalazs_ válasza vargham hozzászólására (») Dec 4, 2020 /
 
Azért szeretném mégis ezt használni, mert van belőle egy csomó (kb 12db).
Segway sideboardján voltak.

Megpróbálom valahogy kikapcsolni a watchdogot.

Ezeken vannak config bitek egyáltalán? Mert én is olvastam adatlapot, de nemigen találtam ilyeneket.
(#) bbalazs_ hozzászólása Dec 4, 2020 /
 
Sikerült!
A végtelen ciklus tetejére betettem egy
fwdgt_counter_reload();
utasítást, amit egy pluginből bányásztam ki. Ez megjavította. Gondolom, eléggé nagyra kell venni a prescalert, hogy egy teljes ciklus beleférjen. Esetleg betenni a systick-be? És akkor nem kell aggódni, hogy a főprogi újraindul...
Az STM is ilyen, hogy nem lehet kikapcsolni a WDT-t?
szerk: Közben megtaláltam a neten, mindenféle kerülő megoldásokat ajánlanak, de nem lehet kikapcsolni.
A hozzászólás módosítva: Dec 4, 2020
(#) bbalazs_ válasza bbalazs_ hozzászólására (») Dec 4, 2020 /
 
szerk2:
betettem a systick-be, úgy is működik!
(#) vargham válasza bbalazs_ hozzászólására (») Dec 4, 2020 /
 
STM32-nél nincs kötelező WDT.
(#) jefflynn válasza vargham hozzászólására (») Dec 4, 2020 /
 
Elég sok kontrollernél ki- és be lehet kapcsolni. Kikapcsolni pl. sleep előtt érdemes, ha nem akarod, hogy a wdt minduntalan felébressze (és esetleg resetelje) a CPU-t.
(#) benjami válasza bbalazs_ hozzászólására (») Dec 4, 2020 /
 
A kettővel korábbi hozzászólásomban beírt módon nem lehet kikapcsolni? Én nem tudom kipróbálni, mert nincs ilyen kontrollerem.
Az stm32 esetén nem kell kikapcsolni, mert reset után nincs bekapcsolva. Ha használni szeretnénk, akkor be kell kapcsolni, ennyi.
(#) bbalazs_ válasza benjami hozzászólására (») Dec 4, 2020 /
 
Nem, azzal a felsorolt regiszterek írásvédelmét szünteted meg.
(#) benjami válasza bbalazs_ hozzászólására (») Dec 4, 2020 /
 
Jogos, tényleg azt jelenti.
Viszont az option bytes részen van egy ilyen:
0x1fff f802 OB_USER option bytes which user defined
[0.bit]: nWDG_SW
0: Hardware free watchdog timer
1: Software free watchdog timer
Én azon a környéken is körbe néznék.
(#) bbalazs_ válasza benjami hozzászólására (») Dec 5, 2020 /
 
Gond az, hogy nem tudom írni a programozóval az option byteokat külön.
Az st-link hibát jelez rá (mivel ő st-nek ismeri fel, valószínűleg más címre akar írni, mint a gd).
A coflash-ban meg nincs ilyen opció.
Talán valahogyan bele lehet a programba fordítani?
De a software-es watchdog is kiáll valami resetfélével, ha jól olvasom.
(#) jefflynn válasza bbalazs_ hozzászólására (») Dec 5, 2020 /
 
Idézet:
„Megpróbálom valahogy kikapcsolni a watchdogot.”

Inkább ne kapcsold ki, szokd meg, hogy van, és kezelni kell. Hasznos dolog az.
(#) david10 hozzászólása Dec 26, 2020 /
 
Sziasztok,
STM32F042-vel szeretnék CAN buszon keresztül üzenetet fogadni, de a megszakítás nem akar lefutni.
Az üzenet küldéssel nincsen gond, az jól működik, egyedül az üzenet fogadással van a gond.
A filter így van beállítva (egyelőre a buszon érkező összes üzenetet szeretném fogadni):
Idézet:
„HAL_CAN_ConfigFilter(&hcan,&canfil); //Initialize CAN Filter
HAL_CAN_Start(&hcan); //Initialize CAN Bus
HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);// Initialize
canfil.FilterBank = 0;
canfil.FilterMode = CAN_FILTERMODE_IDMASK;
canfil.FilterFIFOAssignment = CAN_RX_FIFO0;
canfil.FilterIdHigh = 0;
canfil.FilterIdLow = 0;
canfil.FilterMaskIdHigh = 0;
canfil.FilterMaskIdLow = 0;
canfil.FilterScale = CAN_FILTERSCALE_32BIT;
canfil.FilterActivation = ENABLE;
canfil.SlaveStartFilterBank = 14;”

A megszakításkor pedig ez fut le (elméletileg amikor üzenet érkezik olyankor a PA0 led kellene villogjon, és UART-on el kellene küldje az üzenet tartalmát, de ez nem történik meg):
Idézet:
„void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan1)
{
HAL_CAN_GetRxMessage(hcan1, CAN_RX_FIFO0, &rxHeader, canRX); //Receive CAN bus message to canRX buffer
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);// toggle PA0 LED
HAL_UART_Transmit(&huart2, canRX, 8, 1000);
HAL_UART_Transmit(&huart2, "\n",1, 1000);
}”

Hol kellene keressem a hibakeresését? Az biztos hogy a HAL_CAN_RxFifo0MsgPendingCallback megszakítás nem fut le.
A HDMI-CEC and CAN global interrupts / HDMI wake-up interrupt through EXTI line 27 megszakítás az be van kapcsolva.
A választ előre is köszönöm.
(#) Peppe válasza david10 hozzászólására (») Dec 26, 2020 / 1
 
Szuper, hogy minden létező platformon kiposztolod a problémád.
Segítek akkor: Attól mert a CubeMX-ben be pipáltad a CAN interuptot. Attól még neked kell engedélyezni a program elején.(mint egy Timer esetén is)A Cube csak a IT függvényeket hozza létre. A többi rád vár. (Google a barátod)
// CAN INTERRUPT Configration
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
(#) david10 válasza Peppe hozzászólására (») Dec 26, 2020 /
 
Köszönöm a válaszodat.
Legalább lefordítottam angol nyelvre is
Bemásoltam a forráskódodat, az első és az utolsó sorra hibát ír a fordító, ami szerintem természetes mert egy másik fajta STM32-re van írva a forráskódod.

Tehát a fordító legelőre a CAN1_RX0_IRQn és CAN_IT_FMP0 kifejezésekbe kötött
bele, a
CAN1_RX0_IRQn-t átjavítottam CEC_CAN_IRQn-re
CAN_IT_FMP0 -t átjavítottam CAN_IER_FMPIE0-re, azokat most elfogadja, viszont beleköt a NVIC_InitStructure és CAN_ITConfig kifejezésekbe. Szerintem kimaradt valami a kódból, a pontosvessszők biztos hogy rendben vannak.
Próbáltam a NVIC_InitTypeDef NVIC_InitStructure;-et is beszúrni, de azzal az NVIC_InitTypeDef -be köt bele. Erre van ötleted hogy miért nem fogadja el a fordító ezeket a kifejezéseket?
(#) Peppe válasza david10 hozzászólására (») Dec 26, 2020 / 1
 
Sok ötletem van, de nem oldom meg helyetted. A CubeMX mappájában ahol a proci HAL könyvtárak vannak. Ott nézz szét. Vannak példa kódok. Ha nincs CAN példa, lehet Guglizni.
Igen jól láttad nem a te procidhoz volt a példa.
Röviden segítek.
A CAN.c CAN.h fájlban érdemes szétnézni. Ott benne lesz a NVIC rövid leírása. Mi kell hozzá hogy az IT jól működjön.
(#) david10 válasza Peppe hozzászólására (») Dec 27, 2020 /
 
Köszönöm a segítséget, ma reggel sikerült megoldjam.
2 dolgon változtattam, egyik a programban az inicializáló soroknak a sorrendje, a másik hogy frissítettem az IDE-t 1.5.0-ról 1.6.1-re.
(#) sirály12 hozzászólása Jan 2, 2021 /
 
Üdv.

Kezdő vagyok STM32-ben, ezért nézzétek el a butaságaimat.

DMA-PWM

Ezen az oldalon lévő leírás alapján megcsináltam egy programot, de egy olyan gondom lenne, hogy a szinusz hullám amplitúdóját nem tudom módosítani. Ehhez gondolom a Wave_LUT tömbből kiolvasott értéket kellene módosítani, mielőtt még PWM jel lenne belőle. Vagyis kivonni például belőle egy számot, ügyelve, hogy ne legyen az eredmény kisebb mint nulla. Meg tudom ezt tenni, vagy milyen más úton induljak el?

Köszönök minden segítséget.
A hozzászólás módosítva: Jan 2, 2021
(#) vargham válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
Először módosítod a tömböt, aztán kezded a DMA transfert. Menet közben nem lehet módosítani.
(#) sirály12 válasza vargham hozzászólására (») Jan 2, 2021 /
 
Épp ez a gondom, mert leállítani nem akarnám menet közben. Ez egy inverter lenne. Nem lenne túl jó dolog.
A hullámtáblát tudom valahogy cserélni menet közben, úgy, hogy ne maradjon ki emiatt semmi? Például legenerálok egy új táblát és kicserélem a jelenleg használttal?
(#) Peppe válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
Tessék
Sine table C
(#) sirály12 válasza Peppe hozzászólására (») Jan 2, 2021 /
 
Köszönöm.

Már igazából találtam ilyen generáló kódot:

  1. void SineWave_Data(uint16_t cycle, uint32_t *D, float Um) {
  2.         uint16_t i;
  3.         float JD;
  4.         float ZH;
  5.         float HD;
  6.         for (i = 0; i < cycle; i++) {
  7.                 JD = 2 * PI * i / cycle;
  8.                 ZH = 1024 / 3.23;
  9.                 HD = (float) sin(JD);
  10.                 D[i] = (Um / 2 * HD + 1) * ZH;
  11.         }
  12. }


Ahol, hogyha jól gondolom a cycle a szinusztábla elemeinek száma, az Um pedig maga az amplitudó.

De hogy lehet, ha lehet egyáltalán kicserélni menet közben a táblát?

Ez működhet így:
  1. void copy(uint32_t *src, uint32_t *dst, int len) {
  2.         memcpy(dst, src, sizeof(src[0]) * len);
  3. }
  4. Vagy nem jó megoldás?
(#) vargham válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
De miért akarod menet közben kicsérlni?
(#) cross51 válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
Nem teljesen értem, ha inverter lesz belőle a hullámtáblát miért akarod cserélni, de
Dolgoz két bufferba, az egyik a DMA-é a másikba meg pakolod az új sin táblát.
Amikor cserélni akarod DMA transfer complete IT-ben meg fogod és a DMA src paramétert át állítod az új tömbre, és következőleg szükséges táblát az előző bufferba fogod majd csinálni. (alias ping-pong buffering)
(#) icserny válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
A jelkimenetre rakhatsz egy digitális potmétert, amivel leosztod a jelet.
(#) sirály12 válasza vargham hozzászólására (») Jan 2, 2021 /
 
Ezzel akarom a kimeneti feszültséget állítani.
Ha tudnám a táblából beolvasott számot módosítani, akkor az is jó lenne(tehát mindegyikból például kivonni egy számot), de ezt nem tudom hogy lehet-e, így úgy gondoltam cserélem az egész táblát.
(#) sirály12 válasza icserny hozzászólására (») Jan 2, 2021 /
 
Pwm megy ki, és az stm után egy IR2110-es driver van. Ide nem jó ez a megoldás, eleve a pwm kitöltését kell állítanom, ami ebben a táblában van.
(#) sirály12 válasza cross51 hozzászólására (») Jan 2, 2021 /
 
Ennek utánanézek.
Köszönöm.
(#) icserny válasza sirály12 hozzászólására (») Jan 2, 2021 / 2
 
Nem kivonni kellene, hanem osztani (mindegyik adatot ugyanolyan arányban csökkenteni).
(#) vargham válasza cross51 hozzászólására (») Jan 2, 2021 /
 
Igen, ez egy járható út. Kérdés, hogy megéri-e. Mert ha a CPU hullámtáblát számol, míg a DMA kitolja az előzőt, akkor tök felesleges a DMA...
(#) vargham válasza sirály12 hozzászólására (») Jan 2, 2021 /
 
Pontosan melyik MCU-ról van szó?
Milyen gyakran akarod módosítani a kimeneti feszültséget?
Csinál-e mást az MCU?
Következő: »»   153 / 175
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