Forum: Projekte & Code [STM32/HAL] simples U(S)ART-Library


von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Ich möchte hier meinen Code zur komfortablen Nutzung der STM32 U(S)ARTs 
vorstellen.
Es können theoretisch beliebig viele U(S)ARTs konfiguriert werden.

Ich hab mich bemüht, den Code soweit wie nötig zu kommentieren.

Zum Testen muß man ein neues Projekt in CubeMX generieren, und dort den 
gewünschten U(S)ART aktivieren und konfigurieren.
Bitte nicht vergessen auch den Interrupt dieses U(S)ART einzuschalten!

Die Dateien aus dem Zip kopiert man einfach in Core/SRC

Für einen ersten Test habe ich ein simples Demo angehängt. (uart_demo.c, 
und uart_demo.h)

Um das zu nutzen muß man in der generierten main.c die Datei uart_demo.h 
zu den Includes hinzufügen:
1
/* Private includes ----------------------------------------------------------*/
2
/* USER CODE BEGIN Includes */
3
#include "uart_demo.h"
4
/* USER CODE END Includes */

In der main-Funktion wird dann das eigentliche Demo gestartet, und als 
einziger Parameter der Handle des gewünschten U(S)ART übergeben:
1
  /* USER CODE BEGIN 2 */
2
3
  myUART_LineDemo(&huart2);
4
5
  /* USER CODE END 2 */

Der Rest sollte selbsterklärend sein. (In der uart_demo.c und 
uart_demo.h)

Der eigentliche Test findet dann in einem Terminalprogramm deiner Wahl 
statt.

Über Anregungen und/oder Verbesserungs-Vorschläge würde ich mich freuen.

Da das die erste Version ist, kann ich kleinere Bugs im Code derzeit 
nicht ausschließen, allerdings funktioniert das in meinem Labor in NRW 
bei ca 22° Raumtemperatur schon recht zuverlässig.

Viel Spass damit!

: Bearbeitet durch User
von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Noch einen kleinen Bug gefixed und Kommentare im Source ergänzt.

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Und noch ein kleineres Update.

von Jens R. (tmaniac)


Lesenswert?

Schöne Idee. Hast du dir mal überlegt da ein Expansion Pack draus zu 
basteln?

Ich bin (mal mehr und mal weniger) dabei so etwas für den CAN (aktuell 
Unterstützung des bxCAN) zu basteln. Und ich habe die Konfiguration in 
die Cube-Oberfläche integriert.

von Harry L. (mysth)


Lesenswert?

Jens R. schrieb:
> Schöne Idee. Hast du dir mal überlegt da ein Expansion Pack draus zu
> basteln?
>
> Ich bin (mal mehr und mal weniger) dabei so etwas für den CAN (aktuell
> Unterstützung des bxCAN) zu basteln. Und ich habe die Konfiguration in
> die Cube-Oberfläche integriert.

Gute Idee!
Muß ich mir mal anschauen!

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Version 2.0 mit FreeRTOS-Support

von Wastl (hartundweichware)


Lesenswert?

Harry L. schrieb:
> [STM32/HAL] simples U(S)ART-Library

Das Library?

Harry L. schrieb:
> UARTlib_v2.zip

Immer noch die Bindestrich-Krankheit? Ist anstrengend, ich weiss.

Wastl schrieb:
> Du hast die Bindestrich-Krankheit. In der englischen Sprache wird
> der Bindestrich nur in (sehr) besonderen Fällen verwendet.
> Beispiel: state-of-the-art programming
> Da du englischsprachige Texte schreibst nehme ich an dass du dich
> an englischsprachiche User wenden möchtest. Dann bitte keine
> Deppen-Bindestriche.

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Version 2.01
Bugfix und Demo erweitert.

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Und noch ein letztes Update für heute.

Das API sieht nun folgendermaßen aus (aus uartlib_api.h):
1
/*****************************************************************************
2
 *
3
 * initialize uart-system
4
 *
5
 * parameter:
6
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
7
 *
8
 * UART_HandleTypeDef *huart : HAL-handle to the used UART
9
 *
10
 * const char uart_name[] : pointer to a human readable name of this uart
11
 *
12
 *****************************************************************************/
13
14
void uart_init(UART_com_t *UART_com, UART_HandleTypeDef *huart, const char uart_name[]);
15
16
/*****************************************************************************
17
 *
18
 * switch to raw-mode
19
 *
20
 * parameter:
21
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
22
 *
23
 * every single received byte is returned by uart_receive()
24
 *
25
 * this mode is the default after initialisation
26
 *
27
 *****************************************************************************/
28
29
void uart_set_rawmode(UART_com_t *UART_com);
30
31
/*****************************************************************************
32
 *
33
 * switch to string-mode
34
 *
35
 * parameter:
36
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
37
 *
38
 * char *stringbuf : a pointer to an buffer used for internaly construct the received string
39
 * size_t bufsize : size of this buffer which is also the max. string-length
40
 *
41
 * char termchar : a character (usualy <CR>) that is interpreted as an end of line
42
 *
43
 * bool echo : when true, every char is echoed on output. usable for manual input.
44
 * in case of echo = true, <BS> may be used, to edit the input line
45
 *
46
 *****************************************************************************/
47
48
void uart_set_stringmode(UART_com_t *UART_com, char *stringbuf, size_t bufsize,
49
    char termchar, bool echo);
50
51
/*****************************************************************************
52
 *
53
 * receive data from uart
54
 *
55
 * parameter:
56
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
57
 *
58
 * uint8_t *result : a pointer to a buffer where the received data is copied to
59
 * 
60
 * in rawmode this is a single byte
61
 *
62
 * in stringmode, the buffersize has to be equal or bigger than the buffer-size
63
 * set in uart_set_stringmode()
64
 *
65
 * return:
66
 * in non-rtos-mode it returns true if data has been received and copied
67
 * false is returned if no data is available
68
 *
69
 * in rtos-mode the control is passed to the rtos, and the function
70
 * returns true as soon as data is available and copied to the result-buffer
71
 *
72
 *****************************************************************************/
73
74
bool uart_receive(UART_com_t *uart, uint8_t *result);
75
76
/*****************************************************************************
77
 *
78
 * transmit single byte
79
 *
80
 * parameter:
81
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
82
 *
83
 * uint8_t byte : the byte to be tranmitted
84
 *
85
 *****************************************************************************/
86
87
void uart_put_byte(UART_com_t *Serial_COM, uint8_t byte);
88
89
/*****************************************************************************
90
 *
91
 * transmit array of data
92
 *
93
 * parameter:
94
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
95
 *
96
 * uint8_t *data : pointer to an array of bytes to be tranmitted
97
 *
98
 * size_t cnt : number of bytes to transmit
99
 *
100
 *****************************************************************************/
101
102
void uart_put_data(UART_com_t *Serial_COM, uint8_t *data, size_t cnt);
103
104
/*****************************************************************************
105
 *
106
 * transmit a single char
107
 *
108
 * parameter:
109
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
110
 *
111
 * char c : the char to be tranmitted
112
 *
113
 *****************************************************************************/
114
115
void uart_putc(UART_com_t *Serial_COM, char c);
116
117
/*****************************************************************************
118
 *
119
 * transmit a null-terminated string
120
 *
121
 * parameter:
122
 * UART_com_t *UART_com : pointer to an user-created UART_com_t structure
123
 *
124
 * char *s : a pointer to the string to transmit
125
 *
126
 *****************************************************************************/
127
128
void uart_puts(UART_com_t *Serial_COM, char *s);

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.