STM32
Jetzt
wird es höchste zeit, daß ich meine Merkzettel hier sammle.
Boad an
der
Uni
STM32L010RB
Mein Speicherplatz
D:\Users\Christof\CloudStation\STM32_Desk
D:\Ac6\SystemWorkbench
Da liegen Beispiele: C:\Users\Christof\AppData\Roaming\Ac6\SW4STM32\firmwares\STM32Cube_FW_L0_V1.11.2\Projects
Eclipse:
F3 |
Navigiert
zur Klasse oder Methode unter dem Cursor |
F4 |
Zeigt
die Klassenhierarchie zur Klasse unter dem Cursor an |
https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html
http://www.openstm32.org/HomePage
Atollic STM Compiler
umsonst ?
Eclipse Compiler Einstellung:
NICHT
GEFUNDEN
C:\Program
Files
(x86)\GNU Tools ARM Embedded\8 2018-q4-major
ALLES
QUATSCH
Lösung:
System
workbench
installeren von ST
SO GEHTS
http://www.openstm32.org/System%2BWorkbench%2Bfor%2BSTM32
http://www.openstm32.org/Downloading%2Bthe%2BSystem%2BWorkbench%2Bfor%2BSTM32%2Binstaller
und noch CubeMX https://www.st.com/en/development-tools/stm32cubeide.html
Youtubes:
https://www.youtube.com/watch?v=cfb1awS_JTw
Einführung
WEBSIDES
http://stefanfrings.de/stm32/stm32l0.html
und
https://jaxenter.de/microcontroller-iot-stm32-59802
Eclipse
im
Microntroller.net
https://www.mikrocontroller.net/articles/STM32_Eclipse_Installation#Downloads
Workbench
start
Nützliche
Eclipse Kurzbefehle
Es
gibt verschiedene Tools um PHP zu entwickeln. Mein bevorzugtes Tool ist Eclipse.
Hier stelle ich ein paar Kurzbefehle vor, welche die Arbeit mit Eclipse
beschleunigen:
Ctrl+Shift+L
Mit diesem Befehl werden alle Kurzbefehle aufgelistet
Ctrl+K
Zur nächsten gleichen Zeichenfolge springen.
Ctrl+Shift+K
Zur vorher gehenden gleichen Zeichenfolge springen
Ctrl+Q
Zur letzen bearbeiteten Stelle springen
Alt+Pfeil
Links / Pfeil rechts
Springt zur Stelle an der man vorher gearbeitet hat. Dies ist sehr
nützlich wenn an verschiedenen Stellen im Script gearbeitet wird.
Alt+Pfeil
hoch / Pfeil runter
Aktuelle Zeile nach oben oder nach unten verschieben
Ctrl+Alt+Pfeil
hoch / Pfeil runter
Kopiert die aktuelle Zeile/n nach oben oder unten
Shift+Alt+A
Spaltenmodus aktivieren. Damit lässt sich über mehrere Zeilen hinweg
ein bestimmter Bereich gleichzeitig bearbeiten.
Ctrl+D
Aktuelle Zeile oder markierte Zeilen löschen
Ctrl+Shift+7
bzw. Ctrl+Shift+C
Zeile aus- oder einkommentieren
Ctrl+Shift+/
Fügt Block-Kommentar Zeichen um den selektierten Bereich ein.
Ctrl+M
Editorfenster maximieren
Ctrl+L
Zu Zeile springen (Zeilennummer eingeben)
Ctrl+Shift+R
Open Resource Dialog öffnen. Schneller als mit diesem findet man keine
Datei im Projekt.
Ctrl+Shift+T
Klassen, Funktionen, Variablen, Macros, Namespaces und vieles mehr
anspringen.
Alt+Space
Autocomplete, den begonnenen Text vervollständigen.
Ctrl+Shift+F
Autoformatierung des Quellcodes.
Ctrl+E
Zeigt die Liste der offenen Tabs an. Dadurch kann via Tastatur zu einem
anderen Tab gesprungen werden.
Ctrl+O
Zeigt alle Funktionen des aktuellen Tabs sowie markiert die Funktion in
welcher sich der Pointer gerade befindet.
Ctrl+Shift+Y
Markierter Text in Kleinbuchstaben umwandeln.
Ctrl+Shift+X
Markierter Text in Grossbuchstaben umwandeln.
Alt+Shift+R
aktive Datei umbenennen
Shift+Enter und Ctrl+Shift+Enter
Shift+Enter fügt eine leere Zeile unterhalb des Cursors ein. Der
Unterschied zum normalen Verhalten ist, dass man hier nicht am Ende
einer Zeile (Linie) sein muss, um eine neue Zeile einzufügen.
Ctrl+Shift+Enter macht das gleiche, der Cursor bleibt jedoch oben
stehen.
Ctrl+F6
Einfach zwischen den geöffneten Dateien hin und her switchen
Weitere
Listen mit Kurzbefehlen sind hier zu finden:
http://eclipse-tools.sourceforge.net/shortcuts.html
http://eclipse.dzone.com/news/effective-eclipse-shortcut-key
STRG
+ S |
Speichern |
STRG
+ Z |
Aktion
rückgängig machen |
STRG
+ Bild hoch/Bild runter |
Zwischen
Tabs wechseln |
STRG
+ W |
Tab
schließen |
STRG
+ Pfeiltasten (Links, Rechts) |
Cursor
Wörterweise verschieben |
STRG
+ Pfeiltasten (Hoch, Runter) |
Scrollen,
ohne das der Cursor mit scrollt |
STRG
+ SHIFT + R |
Schnelles
öffnen eines Item |
STRG
+ L |
In
beliebige Zeile springen |
STRG
+ O |
Schnelles
öffnen einer Methode |
STRG
+ SHIFT + Pfeiltasten (Hoch, Runter) |
Zur
Nachbarmethoden springen |
STRG
+ SHIFT + G |
Alle
Referenzen zur ausgewählten Methode im gesamten Projekt suchen |
STRG
+ Q |
Rücksprung
zur Stelle an dem der Cursor zuletzt eine Stelle verändert hat |
ALT
+ SHIFT + X +J |
Starten
des Programmteils |
STRG
+ . |
Sprung
zum nächsten Fehler |
ALT
+ Pfeiltasten (Hoch, Runter) |
Verschieben
einer kompletten Zeile nach oben/unten |
STRG
+ ALT + Pfeiltasten (Hoch, Runter) |
Vervielfältigung
einer bestimmten Zeile |
STRG
+ D |
Löscht
aktuelle Zeile in der sich der Cursor befindet |
STRG
+ 7 |
Schnelles
auskommentieren |
F3 |
Sprung
zur Deklaration der ausgewählten Variable/Methode/Klasse |
STRG
+ SHIFT + F |
Automatische
Formatierung |
ALT
+ SHIFT + M |
Lagert
markierten Programm-Code in einer neuen Methode aus |
STRG
+ SHIFT + L |
Anzeigen
aller Shortcuts |
static GPIO_InitTypeDef
GPIO_InitStruct;
static void SystemClock_Config(void);
int main(void)
{
HAL_Init();
/* Configure the system clock to 2 MHz */
SystemClock_Config();
/* -1- Enable GPIO Clock (to be able to program the
configuration registers) */
LED2_GPIO_CLK_ENABLE();
/* -2- Configure IO in output push-pull mode to drive external
LEDs */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pin = LED2_PIN;
HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
/* -3- Toggle IO in an infinite loop */
while (1)
{
HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
/* Insert delay 100 ms */
HAL_Delay(100);
}
}
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
/* Enable MSI Oscillator */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
RCC_OscInitStruct.MSICalibrationValue=0x00;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
{
/* Initialization Error */
while(1);
}
/* Select MSI as system clock source and configure the HCLK,
PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_0)!= HAL_OK)
{
/* Initialization Error */
while(1);
}
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption
when the device is
clocked below the maximum system frequency, to
update the voltage scaling value
regarding system frequency refer to product
datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the
source line number
* where the
assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* User can add his own implementation to report the file name
and line number,
ex: printf("Wrong parameters value: file %s on
line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
#define
ADC_CONVERTED_DATA_BUFFER_SIZE
((uint32_t) 32) /* Size of array aADCxConvertedData[]
*/
ADC_HandleTypeDef
AdcHandle;
ADC_ChannelConfTypeDef
sConfig;
static uint16_t
aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
/* Private function prototypes
-----------------------------------------------*/
void SystemClock_Config(void);
static void Error_Handler(void);
int main(void)
{
HAL_Init();
BSP_LED_Init(LED2);
AdcHandle.Instance
= ADCx;
if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
{
/* ADC de-initialization Error */
Error_Handler();
}
AdcHandle.Init.ClockPrescaler
= ADC_CLOCK_SYNC_PCLK_DIV2; /*
Synchronous clock mode, input ADC clock with prscaler 2 */
AdcHandle.Init.Resolution
=
ADC_RESOLUTION_12B;
/* 12-bit resolution for converted data */
AdcHandle.Init.DataAlign
=
ADC_DATAALIGN_RIGHT;
/* Right-alignment for converted data */
AdcHandle.Init.ScanConvMode
= ADC_SCAN_DIRECTION_FORWARD; /* Sequencer disabled
(ADC conversion on only 1 channel: channel set on rank 1) */
AdcHandle.Init.EOCSelection
=
ADC_EOC_SINGLE_CONV;
/* EOC flag picked-up to indicate conversion end */
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
AdcHandle.Init.LowPowerFrequencyMode = DISABLE;
AdcHandle.Init.LowPowerAutoWait =
DISABLE;
/* Auto-delayed conversion feature disabled */
AdcHandle.Init.ContinuousConvMode =
ENABLE;
/* Continuous mode enabled (automatic conversion restart after each
conversion) */
AdcHandle.Init.DiscontinuousConvMode =
DISABLE;
/* Parameter discarded because sequencer is disabled */
AdcHandle.Init.ExternalTrigConv =
ADC_SOFTWARE_START;
/* Software start to trig the 1st conversion manually, without external
event */
AdcHandle.Init.ExternalTrigConvEdge =
ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software
trigger chosen */
AdcHandle.Init.DMAContinuousRequests =
ENABLE;
/* ADC DMA continuous request to match with DMA circular mode */
AdcHandle.Init.Overrun
= ADC_OVR_DATA_OVERWRITTEN; /* DR
register is overwritten with the last conversion result in case of
overrun */
AdcHandle.Init.OversamplingMode =
DISABLE;
/* No oversampling */
AdcHandle.Init.SamplingTime
= ADC_SAMPLETIME_7CYCLES_5;
/* Initialize ADC peripheral according to the passed parameters
*/
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
/* ### - 2 - Start calibration
############################################ */
if (HAL_ADCEx_Calibration_Start(&AdcHandle,
ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
/* ### - 3 - Channel configuration
######################################## */
sConfig.Channel =
ADCx_CHANNEL;
/* Channel to be converted */
sConfig.Rank =
ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) !=
HAL_OK)
{
Error_Handler();
}
/* ### - 4 - Start conversion in DMA mode
################################# */
if (HAL_ADC_Start_DMA(&AdcHandle,
(uint32_t *)aADCxConvertedData,
ADC_CONVERTED_DATA_BUFFER_SIZE
) != HAL_OK)
{
Error_Handler();
}
/* Infinite Loop */
while (1)
{
}
}