[STM32/HAL] simples U(S)ART-Library

OP #7347310
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!

Angehängte Dateien:
#7385069
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.

OP #7385846
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);
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren