Fórum témák
» Több friss téma |
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)
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.
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
szerk2:
betettem a systick-be, úgy is működik!
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.
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.
Nem, azzal a felsorolt regiszterek írásvédelmét szünteted meg.
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.
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. Idézet: „Megpróbálom valahogy kikapcsolni a watchdogot.” Inkább ne kapcsold ki, szokd meg, hogy van, és kezelni kell. Hasznos dolog az.
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.
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);
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?
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.
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.
Ü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
Először módosítod a tömböt, aztán kezded a DMA transfert. Menet közben nem lehet módosítani.
É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?
Tessék
Sine table C
Köszönöm.
Már igazából találtam ilyen generáló kódot:
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:
De miért akarod menet közben kicsérlni?
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)
A jelkimenetre rakhatsz egy digitális potmétert, amivel leosztod a jelet.
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.
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.
Nem kivonni kellene, hanem osztani (mindegyik adatot ugyanolyan arányban csökkenteni).
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...
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? |
Bejelentkezés
Hirdetés |