Jag håller på att få en utgång att blinka med STM32. Här använder jag inte mig av någon CubeMX32 eller något annat. Jag tänkte använda register för att styra hela epikaget.
Jag har en STM32F401RE på ett Nucleo-kort och jag ska få D13 att blinka. Det är en LED där.
Nu söker jag på att sätta vilken inställning D13 ska ha på GPIOA. I detta fall vill jag att D13 ska vara OUTPUT. Då hittar jag GPIO port mode register (GPIOx_MODER) (x = A..E and H)
Jag brände in koden och sedan fick STM32 något fnatt och jag "loggades" ut från den. Jahapp, tänkte jag. Nu får jag bara detta meddelande när jag försöker bränna in kod
STMicroelectronics ST-LINK GDB server. Version 5.1.0
Copyright (c) 2018, STMicroelectronics. All rights reserved.
Starting server with the following options:
Persistent Mode : Disabled
Logging Level : 1
Listen Port Number : 61234
Status Refresh Delay : 15s
Verbose Mode : Disabled
SWD Debug : Enabled
Target no device found
Error in initializing ST-LINK device.
Reason: No device found on target.
Datorn känner utav min ST-Link och annars verkar det inte vara något problem. Men finns det något sätt att nollställa min uC?
Nu testade jag bränna över min kod och noterade felmeddelandet.
Jag följde en person på Youtube som visade hur man ska styra GPIO pinnarna. Han hade dock en annan IDE och annan uC, men jag tänkte att det ska inte vara någon skillnad. Bara andra nummer.
Skillnaden mellan hans kod och min kod är att jag använder RCC->AHB1ENR och han använder RCC->APB2ENR. Alltså skillnaden var H mot P.
Sedan använder han
när jag använder GPIOA->MODER. Hans LED är på GPIOC, medan min är på GPIOA. Men skillnaden här var CHR mot MODER.
Sista skillnaden är att jag använder GPIOA->BSRRH och GPIOA->BSRRL när han använder endast GPIOC->BSRR.
Orsaken varför jag valde MODER istället för CHR har med att det fanns inte CHR i mitt datablad. Vart tror ni jag har gjort fel någonstans?
Notera att detta är absolut första gången jag programmerar med register. Jag är oftast van att hålla på med HAL-lager.
STMicroelectronics ST-LINK GDB server. Version 5.1.0
Copyright (c) 2018, STMicroelectronics. All rights reserved.
Starting server with the following options:
Persistent Mode : Disabled
Logging Level : 1
Listen Port Number : 61234
Status Refresh Delay : 15s
Verbose Mode : Disabled
SWD Debug : Enabled
Waiting for debugger connection...
Debugger connected
-------------------------------------------------------------------
STM32CubeProgrammer v1.3.0
-------------------------------------------------------------------
Log output file: /tmp/STM32CubeProgrammer_WuG3mu.log
ST-LINK SN : 066EFF363732594D43183143
ST-LINK FW : V2J32M22
Voltage : 3.25V
SWD freq : 4000 KHz
Connect mode: Under Reset
Reset mode : Hardware reset
Device ID : 0x433
Device name : STM32F401xD/E
Device type : MCU
Device CPU : Cortex-M4
Memory Programming ...
Opening and parsing file: /
File : /
Size : 1260 Bytes
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sector 0
Download in Progress:
File download complete
Time elapsed during download operation: 00:00:00.613
Verifying ...
Download verified successfully
Error in executing 'cont' command ...
CM4 Failed to read all registers
FAILED to REGISTER Values from the target
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Debugger connection lost.
Shutting down...
Hur är det tänkt att fungera? Det där (0<<27) fyller ju ingen funktion, en bit som OR:as med noll behåller sitt värde.
OR kan man använda för att ett-ställa en bit, men för att nollställa så måste man köra AND med inversen (d.v.s. & ~(0<<27) eller nåt sånt)
Tittar man på databladet så för att beskriva en utgång så måste man sätta 01, alltså är 0<<27 också 0. Jag bara skrev ut den bara för att följa databladet
Mr Andersson skrev:
Al_Bundy skrev:Hej! Det är PA5 jag håller på att blinka med, dvs D13 i bilden ovan i post #1.
Nyfiken fråga? Hur vem man vilken bitoperatör man skall använda sig av? ^=, |=, = osv
Vi kan ta detta exempel. Pull-up och pull-down register. Jag vill ha en pull-down på min ADC, av ren säkerhet. Då är det 0x02 som jag måste använda för att få binärt 10.
Om jag vill skriva till PUPDR2[1:0] så måste jag väll skriva en kod som lyder:
Nyfiken fråga? Hur vem man vilken bitoperatör man skall använda sig av? ^=, |=, = osv
Det beror ju helt på vad du ska göra. a = b skriver över hela registret med valfritt värde. a |= b sätter alla bitar som är 1 i b till 1 i a. 0:or i b ger ingen ändring i a. Kan inte ändra 1 till 0. a &= b sätter alla bitar som är 0 i b till 0 i a. 1:or i b ger ingen ändring i a. Kan inte ändra 0 till 1. a ^= b inverterar alla bitar i a som är 1 i b. 0:or i b ger ingen ändring i a.
Hur vet man om man kan endast skriva eller läsa till registret? Självklart står det i databladet. Men i vilken avdelning?
I registerbeskrivningarna finns det en rad med r och/eller w.
Al_Bundy skrev:
Japp. Bara en bit, vilket jag också vill att det ska bli :) Då sätter jag pull-down på PUPDR2.
Ja, om du vill att alla andra bitar ska vara noll så är det ok. Men om du vill sätta flera pull-down så måste du alltså sätta alla vid samma skrivning, annars kommer bara den sista du skriver att "ta", eftersom du skriver både ettor och nollor varje gång. Så om du bara skriver en etta så skriver du resten med nollor.
Det man normalt gör är att man "bygger upp" en variabel med det värde man vill ha och sen skriver den till registret.
Börja med att sätta variabeln till noll.
Använd sen =| för att ettställa alla de bitar som ska vara ett. Sen skriver du variabeln till registret.