ringbuffer, helper, HAL_Driver (LL)
This commit is contained in:
parent
32162a2ec4
commit
cf43818890
15
Core/Inc/helper.h
Normal file
15
Core/Inc/helper.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* helper.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 14, 2022
|
||||||
|
* Author: tom
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INC_HELPER_H_
|
||||||
|
#define INC_HELPER_H_
|
||||||
|
|
||||||
|
char *ltrim(char *s);
|
||||||
|
char *rtrim(char *s);
|
||||||
|
char *trim(char *s);
|
||||||
|
|
||||||
|
#endif /* INC_HELPER_H_ */
|
63
Core/Inc/ringbuf.h
Normal file
63
Core/Inc/ringbuf.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* ringbuf.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 12, 2022
|
||||||
|
* Author: tom
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INC_RINGBUF_H_
|
||||||
|
#define _INC_RINGBUF_H_
|
||||||
|
|
||||||
|
#define RING_STATISTICS_ENABLED 1
|
||||||
|
|
||||||
|
#define RINGBUF_MAX_READ_LEN 20
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RINGBUF_PARAM_NONE = 0x00,
|
||||||
|
RINGBUF_ALLOWOVERWRITE= 0x01,
|
||||||
|
} ringbuf_param_t;
|
||||||
|
|
||||||
|
#if !defined _SYS_ERRNO_H_ && !defined __ERRNO_H__ && !defined _STM32_SI5351_H_
|
||||||
|
typedef enum {
|
||||||
|
EPERM = 1, /*!< Operation not permitted */
|
||||||
|
EIO = 5, /*!< I/O error */
|
||||||
|
ENOMEM = 12, /*!< Out of memory */
|
||||||
|
EFAULT = 14, /*!< Bad address */
|
||||||
|
EBUSY = 16, /*!< Device or resource busy */
|
||||||
|
ENODEV = 19, /*!< No such device */
|
||||||
|
EINVAL = 22, /*!< Invalid argument */
|
||||||
|
EADDRINUSE = 98,/*!< Address already in use */
|
||||||
|
ETIMEDOUT = 116,/*!< Connection timed out */
|
||||||
|
} ringbuf_errno_t;
|
||||||
|
#endif
|
||||||
|
//extern ringbuf;
|
||||||
|
#define hring struct ringbuf *
|
||||||
|
//receive callback typedef definition
|
||||||
|
typedef void (*ringbuf_rcv_cb_t)(uint16_t delimiterfound, void* cb_data);
|
||||||
|
|
||||||
|
#if !defined min
|
||||||
|
#define min(a,b) ((a < b)? a : b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
hring ringbuf_create(size_t size, ringbuf_param_t param);
|
||||||
|
void ringbuf_destroy(hring);
|
||||||
|
int ringbuf_push(hring, const uint8_t *data, size_t size);
|
||||||
|
int ringbuf_pull(hring, uint8_t *data, size_t maxsize);
|
||||||
|
int ringbuf_clear(hring);
|
||||||
|
int ringbuf_free(hring);
|
||||||
|
int ringbuf_read(hring, char *str);
|
||||||
|
int ringbuf_write(hring, char *str);
|
||||||
|
int ringbuf_callback_register(hring, ringbuf_rcv_cb_t cb_func, void *cb_data);
|
||||||
|
int ringbuf_set_max_read_len(hring, int max_read_len);
|
||||||
|
int ringbuf_get_max_read_len(hring);
|
||||||
|
int ringbuf_is_empty(hring);
|
||||||
|
int ringbuf_dump(hring);
|
||||||
|
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
int ringbuf_statistics(hring);
|
||||||
|
int ringbuf_stat_writes(hring);
|
||||||
|
int ringbuf_stat_reads(hring);
|
||||||
|
int ringbuf_stat_overflow(hring);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _INC_RINGBUF_H_ */
|
15
Core/Inc/ringbuf_test.h
Normal file
15
Core/Inc/ringbuf_test.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* ringbuf_test.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 14, 2022
|
||||||
|
* Author: tom
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INC_RINGBUF_TEST_H_
|
||||||
|
#define INC_RINGBUF_TEST_H_
|
||||||
|
|
||||||
|
void ringbuf_test(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* INC_RINGBUF_TEST_H_ */
|
27
Core/Src/helper.c
Normal file
27
Core/Src/helper.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* helper.c
|
||||||
|
*
|
||||||
|
* Created on: Jul 14, 2022
|
||||||
|
* Author: tom
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
char *ltrim(char *s)
|
||||||
|
{
|
||||||
|
while(isspace((int)*s)) s++;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *rtrim(char *s)
|
||||||
|
{
|
||||||
|
char* back = s + strlen(s);
|
||||||
|
while(isspace((int)*--back));
|
||||||
|
*(back+1) = '\0';
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *trim(char *s)
|
||||||
|
{
|
||||||
|
return rtrim(ltrim(s));
|
||||||
|
}
|
311
Core/Src/ringbuf.c
Normal file
311
Core/Src/ringbuf.c
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file ringbuf.c
|
||||||
|
* @brief driver for a ring buffer used for UART RX
|
||||||
|
******************************************************************************
|
||||||
|
* @author: Thomas Kuschel KW4NZ
|
||||||
|
* created 2022-07-12
|
||||||
|
*
|
||||||
|
* A description can be found in the header file ringbuf.h
|
||||||
|
******************************************************************************/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h> /* malloc */
|
||||||
|
#include <stdio.h> /* printf */
|
||||||
|
#include <string.h> /* memcpy */
|
||||||
|
#include "ringbuf.h"
|
||||||
|
|
||||||
|
/* macros */
|
||||||
|
#define MEM_USED(b) ((b->size + b->head - b->tail) % b->size)
|
||||||
|
#define MEM_FREE(b) ((b->size + b->tail - b->head - 1) % b->size + 1)
|
||||||
|
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
typedef struct stat {
|
||||||
|
uint32_t overflows;
|
||||||
|
uint32_t reads;
|
||||||
|
uint32_t writes;
|
||||||
|
} stat_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ringbuf {
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
stat_t statistics;
|
||||||
|
#endif
|
||||||
|
ringbuf_rcv_cb_t rcv_callback;
|
||||||
|
void *rcv_cb_data;
|
||||||
|
uint8_t *buf;
|
||||||
|
uint16_t size;
|
||||||
|
uint16_t head;
|
||||||
|
uint16_t tail;
|
||||||
|
uint16_t delimiterfound;
|
||||||
|
uint16_t max_read_len;
|
||||||
|
unsigned full :1; // not implemented yet
|
||||||
|
unsigned halffull:1; // not implemented yet
|
||||||
|
unsigned overflow:1;
|
||||||
|
unsigned allowoverwrite:1;
|
||||||
|
} ringbuf_t;
|
||||||
|
|
||||||
|
struct ringbuf * ringbuf_create(size_t size, ringbuf_param_t param) {
|
||||||
|
|
||||||
|
struct ringbuf * rb;
|
||||||
|
if (size == 0 || size > USHRT_MAX)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// rb = malloc(sizeof(ringbuf_t) + size * sizeof(uint8_t));
|
||||||
|
rb = calloc(1, sizeof(ringbuf_t) + size * sizeof(uint8_t));
|
||||||
|
if (rb == NULL) {
|
||||||
|
puts("Memory not allocated.\n");
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
puts("Memory successfully allocated.\n");
|
||||||
|
// the data area is connected to the structure
|
||||||
|
rb->buf = (uint8_t *)rb + sizeof(ringbuf_t);
|
||||||
|
rb->size = (uint16_t)size;
|
||||||
|
// rb->head = rb->tail = rb->halffull = rb->overflow 0;
|
||||||
|
if (param & RINGBUF_ALLOWOVERWRITE)
|
||||||
|
rb->allowoverwrite = 1;
|
||||||
|
rb->max_read_len = RINGBUF_MAX_READ_LEN;
|
||||||
|
}
|
||||||
|
return rb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ringbuf_destroy(struct ringbuf *ring) {
|
||||||
|
if (ring != 0)
|
||||||
|
free(ring);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_dump(struct ringbuf *ring) {
|
||||||
|
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
printf("Buffer: 0x%08x\n", (unsigned int) ring);
|
||||||
|
printf("Start: 0x%08x\n", (unsigned int) ring->buf);
|
||||||
|
printf("Size: total: %d used: %d free: %d\n", ring->size, MEM_USED(ring), MEM_FREE(ring));
|
||||||
|
printf("Head: %d\n", ring->head);
|
||||||
|
printf("Tail: %d\n", ring->tail);
|
||||||
|
printf("Empty: %s\n", (ring->head == ring->tail) ? "yes" : "no");
|
||||||
|
printf("Max read length: %d\n", ring->max_read_len);
|
||||||
|
for (size_t i = 0; i < ring->size; i += 16 ) {
|
||||||
|
for (size_t j = 0; j < 16 && (j + i) < ring->size; j++) {
|
||||||
|
//printf("%02x%s", *(ring->buf +i), ((i%4)==3)?(((i%16)==15)?"\n":" "):"");
|
||||||
|
printf("%02x%s", *(ring->buf + i + j), ((j%4)==3)?" ":"");
|
||||||
|
}
|
||||||
|
putchar(' ');
|
||||||
|
for (size_t j = 0; j < 16 && (j + i) < ring->size; j++) {
|
||||||
|
uint8_t b = *(ring->buf + i + j);
|
||||||
|
printf("%c", ((b >= ' ') && (b < 127))? b: '.');
|
||||||
|
}
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_push(struct ringbuf *ring, const uint8_t *data, size_t size) {
|
||||||
|
|
||||||
|
size_t delimiterpos;
|
||||||
|
size_t delimiterfound = 0;
|
||||||
|
uint16_t head;
|
||||||
|
uint8_t *ptr;
|
||||||
|
|
||||||
|
if (ring == NULL || size == 0 || data == NULL || size > USHRT_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (size >= ring->size)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (size >= (size_t)MEM_FREE(ring)) { // no free space available, but overwrite ?
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
ring->statistics.overflows++;
|
||||||
|
#endif
|
||||||
|
if (ring->allowoverwrite)
|
||||||
|
ring->overflow = 1;
|
||||||
|
else
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
head = ring->head;
|
||||||
|
if (head + size > ring->size) {
|
||||||
|
uint16_t remaining = ring->size - head;
|
||||||
|
memcpy(ring->buf + head, data, remaining);
|
||||||
|
ring->head = (uint16_t)(size - remaining);
|
||||||
|
memcpy(ring->buf, data + remaining, ring->head);
|
||||||
|
} else {
|
||||||
|
memcpy(ring->buf + head, data, size);
|
||||||
|
ring->head += (uint16_t)size;
|
||||||
|
}
|
||||||
|
for (delimiterpos = 0; delimiterpos < size; delimiterpos++) {
|
||||||
|
if (data[delimiterpos] == '\n' || data[delimiterpos] == 0 ) {
|
||||||
|
delimiterfound++;
|
||||||
|
ptr = ring->buf + ((head + delimiterpos) % ring->size);
|
||||||
|
*ptr = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ring->head %= ring->size;
|
||||||
|
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
ring->statistics.writes +=size;
|
||||||
|
#endif
|
||||||
|
ring->delimiterfound = (uint16_t)delimiterfound;
|
||||||
|
//call registered callback function
|
||||||
|
if (ring->delimiterfound && ring->rcv_callback != NULL)
|
||||||
|
ring->rcv_callback(ring->delimiterfound, ring->rcv_cb_data);
|
||||||
|
return (int)size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_clear(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
ring->tail = ring->head;
|
||||||
|
ring->full = ring->halffull = ring->overflow = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_is_empty(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
return (ring->tail == ring->head);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_pull(struct ringbuf *ring, uint8_t *data, size_t maxsize) {
|
||||||
|
|
||||||
|
size_t datasize;
|
||||||
|
|
||||||
|
if (ring == NULL || maxsize == 0 || data == NULL || maxsize > USHRT_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
datasize = min(maxsize, (size_t)MEM_USED(ring));
|
||||||
|
if (datasize > ring->size)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if ((ring->head > ring->tail) /*|| ring->full*/) {
|
||||||
|
memcpy(data, ring->buf + ring->tail, datasize);
|
||||||
|
ring->tail += (uint16_t)datasize;
|
||||||
|
} else {
|
||||||
|
if (ring->head < ring->tail) {
|
||||||
|
size_t remaining = ring->size -ring->tail;
|
||||||
|
if (datasize < remaining) {
|
||||||
|
memcpy(data, ring->buf + ring->tail, datasize);
|
||||||
|
ring->tail += (uint16_t)datasize;
|
||||||
|
} else {
|
||||||
|
memcpy(data, ring->buf + ring->tail, remaining);
|
||||||
|
ring->tail = (uint16_t)(datasize - remaining);
|
||||||
|
memcpy(data + remaining, ring->buf, ring->tail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
ring->statistics.reads += datasize;
|
||||||
|
#endif
|
||||||
|
ring->overflow = 0;
|
||||||
|
return (int)datasize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_read(struct ringbuf *ring, char *str) {
|
||||||
|
|
||||||
|
int len = 0;
|
||||||
|
uint16_t tail = 0;
|
||||||
|
|
||||||
|
if (ring == NULL || str == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
*str = '\0';
|
||||||
|
if (ring->head == ring->tail){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tail = ring->tail;
|
||||||
|
if (ring->head > ring->tail) {
|
||||||
|
if (ring->max_read_len < 2)
|
||||||
|
return -ENOMEM;
|
||||||
|
strncpy(str, (char *)(ring->buf + ring->tail), ring->max_read_len);
|
||||||
|
str[ring->max_read_len] = '\0';
|
||||||
|
for (int i = ring->tail; i < ring->head; i++) {
|
||||||
|
if (*(ring->buf + i) == 0) {
|
||||||
|
ring->tail = (uint16_t)i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ring->tail == tail) {
|
||||||
|
// no \0 found
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int continu = 1;
|
||||||
|
int tail = 0;
|
||||||
|
strncpy(str, (char *)(ring->buf + ring->tail),(size_t)min(ring->size - ring->tail, ring->max_read_len));
|
||||||
|
str[ring->max_read_len] = '\0';
|
||||||
|
len = (int)strlen(str);
|
||||||
|
for (int i = ring->tail; i < ring->size; i++) {
|
||||||
|
if (*(ring->buf + i) == 0) {
|
||||||
|
tail = i + 1;
|
||||||
|
continu = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (continu) {
|
||||||
|
strncpy(str + ring->size - ring->tail, (char *)ring->buf, (size_t)(ring->max_read_len - ring->size + ring->tail));
|
||||||
|
str[ring->max_read_len] = '\0';
|
||||||
|
continu = 1;
|
||||||
|
for (int i = 0; i < ring->head; i++) {
|
||||||
|
if (*(ring->buf + i) == 0) {
|
||||||
|
tail = i + 1;
|
||||||
|
continu = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (continu)
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
ring->tail = (uint16_t)tail;
|
||||||
|
}
|
||||||
|
len = (int)strlen(str);
|
||||||
|
ring->tail = ring->tail % ring->size;
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
ring->statistics.reads += (uint32_t)len + 1;
|
||||||
|
#endif
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ringbuf_write(struct ringbuf *ring, char *str) {
|
||||||
|
|
||||||
|
size_t len = 0;
|
||||||
|
len = (size_t)strlen(str);
|
||||||
|
if (len > 0)
|
||||||
|
return ringbuf_push(ring, (uint8_t *)str, len + 1);
|
||||||
|
else
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
int ringbuf_statistics(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
puts("Ring Buffer Statistics:");
|
||||||
|
printf(" Bytes written: %ld\n", ring->statistics.writes);
|
||||||
|
printf(" Bytes read: %ld\n", ring->statistics.reads);
|
||||||
|
printf("# of overflows: %ld\n", ring->statistics.overflows);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int ringbuf_stat_writes(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
return (int)ring->statistics.writes;
|
||||||
|
}
|
||||||
|
int ringbuf_stat_reads(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
return (int)ring->statistics.reads;
|
||||||
|
}
|
||||||
|
int ringbuf_stat_overflow(struct ringbuf *ring) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
return (int)ring->statistics.overflows;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int ringbuf_callback_register(struct ringbuf *ring, ringbuf_rcv_cb_t cb_func, void *cb_data) {
|
||||||
|
if (ring == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
ring->rcv_callback = cb_func;
|
||||||
|
ring->rcv_cb_data = cb_data;
|
||||||
|
return 0;
|
||||||
|
}
|
144
Core/Src/ringbuf_test.c
Normal file
144
Core/Src/ringbuf_test.c
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* ringbuf_test.c
|
||||||
|
*
|
||||||
|
* Created on: Jul 14, 2022
|
||||||
|
* Author: tom
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "ringbuf.h"
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
|
||||||
|
void ringbuf_test(void) {
|
||||||
|
size_t usable_size = 0;
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
malloc_stats();
|
||||||
|
|
||||||
|
|
||||||
|
assert(1);
|
||||||
|
// assert(0); // ... assertion "0" failed: ...blabla bla
|
||||||
|
//1. Test Initialization
|
||||||
|
hring rb1 = ringbuf_create(512, RINGBUF_PARAM_NONE);
|
||||||
|
usable_size = malloc_usable_size(rb1);
|
||||||
|
fprintf(stdout, "Malloc Usable Size: %d\n", usable_size);
|
||||||
|
|
||||||
|
hring rb2 = ringbuf_create(512, RINGBUF_ALLOWOVERWRITE);
|
||||||
|
assert(rb1 != NULL);
|
||||||
|
assert(rb2 != NULL);
|
||||||
|
hring rb3 = ringbuf_create(512, RINGBUF_ALLOWOVERWRITE);
|
||||||
|
hring rb4 = ringbuf_create(512, RINGBUF_ALLOWOVERWRITE);
|
||||||
|
|
||||||
|
|
||||||
|
printf("Malloc Usable Size of rb1: %d\n", malloc_usable_size(rb1));
|
||||||
|
printf("Malloc Usable Size of rb2: %d\n", malloc_usable_size(rb2));
|
||||||
|
printf("Malloc Usable Size of rb3: %d\n", malloc_usable_size(rb3));
|
||||||
|
printf("Malloc Usable Size of rb4: %d\n", malloc_usable_size(rb4));
|
||||||
|
|
||||||
|
ringbuf_destroy(rb4);
|
||||||
|
malloc_stats();
|
||||||
|
ringbuf_destroy(rb3);
|
||||||
|
malloc_stats();
|
||||||
|
|
||||||
|
malloc_stats();
|
||||||
|
ringbuf_destroy(rb2);
|
||||||
|
malloc_stats();
|
||||||
|
ringbuf_destroy(rb1);
|
||||||
|
malloc_stats();
|
||||||
|
|
||||||
|
printf("rb1 after destroy is: 0x%08X\n", rb1);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
volatile int ret = 0;
|
||||||
|
ring = ringbuf_create(64,RINGBUF_ALLOWOVERWRITE);
|
||||||
|
if (ring == NULL)
|
||||||
|
printf("we have some problems ...\n");
|
||||||
|
|
||||||
|
uint8_t data[1024];
|
||||||
|
char str[1024]={0};
|
||||||
|
|
||||||
|
strcpy(str, "KW4NZ");
|
||||||
|
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_write(ring, str);
|
||||||
|
printf("Writing string: %s\n", str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_push(ring, (uint8_t *)"Ich gehe spazieren.", sizeof("Ich gehe spazieren."));
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_push(ring, (uint8_t *)"NOCHMALS GEHE ICH RAUS.", sizeof("NOCHMALS GEHE ICH RAUS."));
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s\n", str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s\n", str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s\n", str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
strcpy(str, "OE3TKT,OE1TKT,OE7TKT");
|
||||||
|
ret = ringbuf_write(ring, str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s\n", str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
strcpy(str, "OE1TKT,OE3TKT,OE7TKT");
|
||||||
|
ret = ringbuf_write(ring, str);
|
||||||
|
strcpy(str, "KW4NZ");
|
||||||
|
ret = ringbuf_write(ring, str);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s (OE1TKT,OE3TKT,OE7TKT)\n", str);
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("STRING: %s (KW4NZ)\n", str);
|
||||||
|
|
||||||
|
ret = ringbuf_pull(ring, data, 1024);
|
||||||
|
printf("Read %d bytes...\n", ret);
|
||||||
|
for (int i = 0; i < ret; i++)
|
||||||
|
putchar(data[i]);
|
||||||
|
puts("");
|
||||||
|
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ret = ringbuf_push(ring, (uint8_t *)"Eine 128-tägige Reise ist zu gewinnen!", sizeof("Eine 128-tägige Reise ist zu gewinnen!"));
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
|
||||||
|
// ret = ringbuf_push(ring, (uint8_t *)"Eine 100-tägige Reise ist zu gewinnen!", sizeof("Eine 128-tägige Reise ist zu gewinnen!"));
|
||||||
|
// ret = ringbuf_push(ring, (uint8_t *)"Eine 90-tägige Reise ist zu gewinnen!", sizeof("Eine 90-tägige Reise ist zu gewinnen!"));
|
||||||
|
ret = ringbuf_push(ring, (uint8_t *)"ENDENDENDENDEND", sizeof("ENDENDENDENDEND"));
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_push(ring, (uint8_t *)"Vereinbarungen treffen zu.", sizeof("Vereinbarungen treffen zu."));
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("String: %s (length: %d)\n", str, ret);
|
||||||
|
ret = ringbuf_dump(ring);
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("String: %s (length: %d)\n", str, ret);
|
||||||
|
ret = ringbuf_read(ring, str);
|
||||||
|
printf("String: %s (length: %d)\n", str, ret);
|
||||||
|
|
||||||
|
ret = ringbuf_pull(ring, data, 1024);
|
||||||
|
printf("Read %d bytes...\n", ret);
|
||||||
|
for (int i = 0; i < ret; i++)
|
||||||
|
putchar(data[i]);
|
||||||
|
puts("");
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
|
||||||
|
ringbuf_clear(ring);
|
||||||
|
ringbuf_dump(ring);
|
||||||
|
#if RING_STATISTICS_ENABLED
|
||||||
|
ringbuf_statistics(ring);
|
||||||
|
#endif
|
||||||
|
#endif
|
1954
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_bus.h
Normal file
1954
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_bus.h
Normal file
File diff suppressed because it is too large
Load Diff
637
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_cortex.h
Normal file
637
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_cortex.h
Normal file
@ -0,0 +1,637 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32l4xx_ll_cortex.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief Header file of CORTEX LL module.
|
||||||
|
@verbatim
|
||||||
|
==============================================================================
|
||||||
|
##### How to use this driver #####
|
||||||
|
==============================================================================
|
||||||
|
[..]
|
||||||
|
The LL CORTEX driver contains a set of generic APIs that can be
|
||||||
|
used by user:
|
||||||
|
(+) SYSTICK configuration used by @ref LL_mDelay and @ref LL_Init1msTick
|
||||||
|
functions
|
||||||
|
(+) Low power mode configuration (SCB register of Cortex-MCU)
|
||||||
|
(+) MPU API to configure and enable regions
|
||||||
|
(+) API to access to MCU info (CPUID register)
|
||||||
|
(+) API to enable fault handler (SHCSR accesses)
|
||||||
|
|
||||||
|
@endverbatim
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file in
|
||||||
|
* the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef STM32L4xx_LL_CORTEX_H
|
||||||
|
#define STM32L4xx_LL_CORTEX_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32l4xx.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32L4xx_LL_Driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL CORTEX
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private types -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private constants ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private macros ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/
|
||||||
|
#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */
|
||||||
|
#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */
|
||||||
|
#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __MPU_PRESENT
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */
|
||||||
|
#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */
|
||||||
|
#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */
|
||||||
|
#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_REGION MPU Region Number
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */
|
||||||
|
#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */
|
||||||
|
#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */
|
||||||
|
#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */
|
||||||
|
#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */
|
||||||
|
#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */
|
||||||
|
#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */
|
||||||
|
#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */
|
||||||
|
#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/
|
||||||
|
#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/
|
||||||
|
#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */
|
||||||
|
#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */
|
||||||
|
#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/
|
||||||
|
#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */
|
||||||
|
#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */
|
||||||
|
#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */
|
||||||
|
#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */
|
||||||
|
#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */
|
||||||
|
#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */
|
||||||
|
#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */
|
||||||
|
#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#endif /* __MPU_PRESENT */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Exported functions --------------------------------------------------------*/
|
||||||
|
/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function checks if the Systick counter flag is active or not.
|
||||||
|
* @note It can be used in timeout function on application side.
|
||||||
|
* @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
|
||||||
|
{
|
||||||
|
return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the SysTick clock source
|
||||||
|
* @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource
|
||||||
|
* @param Source This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
|
||||||
|
* @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source)
|
||||||
|
{
|
||||||
|
if (Source == LL_SYSTICK_CLKSOURCE_HCLK)
|
||||||
|
{
|
||||||
|
SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the SysTick clock source
|
||||||
|
* @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
|
||||||
|
* @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void)
|
||||||
|
{
|
||||||
|
return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable SysTick exception request
|
||||||
|
* @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_SYSTICK_EnableIT(void)
|
||||||
|
{
|
||||||
|
SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable SysTick exception request
|
||||||
|
* @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_SYSTICK_DisableIT(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if the SYSTICK interrupt is enabled or disabled.
|
||||||
|
* @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processor uses sleep as its low power mode
|
||||||
|
* @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_EnableSleep(void)
|
||||||
|
{
|
||||||
|
/* Clear SLEEPDEEP bit of Cortex System Control Register */
|
||||||
|
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processor uses deep sleep as its low power mode
|
||||||
|
* @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_EnableDeepSleep(void)
|
||||||
|
{
|
||||||
|
/* Set SLEEPDEEP bit of Cortex System Control Register */
|
||||||
|
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures sleep-on-exit when returning from Handler mode to Thread mode.
|
||||||
|
* @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an
|
||||||
|
* empty main application.
|
||||||
|
* @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void)
|
||||||
|
{
|
||||||
|
/* Set SLEEPONEXIT bit of Cortex System Control Register */
|
||||||
|
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Do not sleep when returning to Thread mode.
|
||||||
|
* @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void)
|
||||||
|
{
|
||||||
|
/* Clear SLEEPONEXIT bit of Cortex System Control Register */
|
||||||
|
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the
|
||||||
|
* processor.
|
||||||
|
* @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_EnableEventOnPend(void)
|
||||||
|
{
|
||||||
|
/* Set SEVEONPEND bit of Cortex System Control Register */
|
||||||
|
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are
|
||||||
|
* excluded
|
||||||
|
* @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_LPM_DisableEventOnPend(void)
|
||||||
|
{
|
||||||
|
/* Clear SEVEONPEND bit of Cortex System Control Register */
|
||||||
|
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EF_HANDLER HANDLER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable a fault in System handler control register (SHCSR)
|
||||||
|
* @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault
|
||||||
|
* @param Fault This parameter can be a combination of the following values:
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_USG
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_BUS
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_MEM
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault)
|
||||||
|
{
|
||||||
|
/* Enable the system handler fault */
|
||||||
|
SET_BIT(SCB->SHCSR, Fault);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable a fault in System handler control register (SHCSR)
|
||||||
|
* @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault
|
||||||
|
* @param Fault This parameter can be a combination of the following values:
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_USG
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_BUS
|
||||||
|
* @arg @ref LL_HANDLER_FAULT_MEM
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault)
|
||||||
|
{
|
||||||
|
/* Disable the system handler fault */
|
||||||
|
CLEAR_BIT(SCB->SHCSR, Fault);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Implementer code
|
||||||
|
* @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer
|
||||||
|
* @retval Value should be equal to 0x41 for ARM
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Variant number (The r value in the rnpn product revision identifier)
|
||||||
|
* @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant
|
||||||
|
* @retval Value between 0 and 255 (0x0: revision 0)
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Constant number
|
||||||
|
* @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant
|
||||||
|
* @retval Value should be equal to 0xF for Cortex-M4 devices
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Part number
|
||||||
|
* @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo
|
||||||
|
* @retval Value should be equal to 0xC24 for Cortex-M4
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release)
|
||||||
|
* @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision
|
||||||
|
* @retval Value between 0 and 255 (0x1: patch 1)
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __MPU_PRESENT
|
||||||
|
/** @defgroup CORTEX_LL_EF_MPU MPU
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable MPU with input options
|
||||||
|
* @rmtoll MPU_CTRL ENABLE LL_MPU_Enable
|
||||||
|
* @param Options This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE
|
||||||
|
* @arg @ref LL_MPU_CTRL_HARDFAULT_NMI
|
||||||
|
* @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT
|
||||||
|
* @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_MPU_Enable(uint32_t Options)
|
||||||
|
{
|
||||||
|
/* Enable the MPU*/
|
||||||
|
WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options));
|
||||||
|
/* Ensure MPU settings take effects */
|
||||||
|
__DSB();
|
||||||
|
/* Sequence instruction fetches using update settings */
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable MPU
|
||||||
|
* @rmtoll MPU_CTRL ENABLE LL_MPU_Disable
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
/* Make sure outstanding transfers are done */
|
||||||
|
__DMB();
|
||||||
|
/* Disable MPU*/
|
||||||
|
WRITE_REG(MPU->CTRL, 0U);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if MPU is enabled or not
|
||||||
|
* @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable a MPU region
|
||||||
|
* @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion
|
||||||
|
* @param Region This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER0
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER1
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER2
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER3
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER4
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER5
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER6
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER7
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region)
|
||||||
|
{
|
||||||
|
/* Set Region number */
|
||||||
|
WRITE_REG(MPU->RNR, Region);
|
||||||
|
/* Enable the MPU region */
|
||||||
|
SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure and enable a region
|
||||||
|
* @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RBAR REGION LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RBAR ADDR LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR XN LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR AP LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR S LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR C LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR B LL_MPU_ConfigRegion\n
|
||||||
|
* MPU_RASR SIZE LL_MPU_ConfigRegion
|
||||||
|
* @param Region This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER0
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER1
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER2
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER3
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER4
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER5
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER6
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER7
|
||||||
|
* @param Address Value of region base address
|
||||||
|
* @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF
|
||||||
|
* @param Attributes This parameter can be a combination of the following values:
|
||||||
|
* @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B
|
||||||
|
* or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB
|
||||||
|
* or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB
|
||||||
|
* or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB
|
||||||
|
* or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB
|
||||||
|
* or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB
|
||||||
|
* @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS
|
||||||
|
* or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO
|
||||||
|
* @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4
|
||||||
|
* @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE
|
||||||
|
* @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE
|
||||||
|
* @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE
|
||||||
|
* @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes)
|
||||||
|
{
|
||||||
|
/* Set Region number */
|
||||||
|
WRITE_REG(MPU->RNR, Region);
|
||||||
|
/* Set base address */
|
||||||
|
WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U));
|
||||||
|
/* Configure MPU */
|
||||||
|
WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | SubRegionDisable << MPU_RASR_SRD_Pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable a region
|
||||||
|
* @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n
|
||||||
|
* MPU_RASR ENABLE LL_MPU_DisableRegion
|
||||||
|
* @param Region This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER0
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER1
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER2
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER3
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER4
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER5
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER6
|
||||||
|
* @arg @ref LL_MPU_REGION_NUMBER7
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region)
|
||||||
|
{
|
||||||
|
/* Set Region number */
|
||||||
|
WRITE_REG(MPU->RNR, Region);
|
||||||
|
/* Disable the MPU region */
|
||||||
|
CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __MPU_PRESENT */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* STM32L4xx_LL_CORTEX_H */
|
||||||
|
|
785
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_crs.h
Normal file
785
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_crs.h
Normal file
@ -0,0 +1,785 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32l4xx_ll_crs.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief Header file of CRS LL module.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef STM32L4xx_LL_CRS_H
|
||||||
|
#define STM32L4xx_LL_CRS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32l4xx.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32L4xx_LL_Driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CRS)
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL CRS
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private types -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
/* Private constants ---------------------------------------------------------*/
|
||||||
|
/* Private macros ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/** @defgroup CRS_LL_Exported_Constants CRS Exported Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_GET_FLAG Get Flags Defines
|
||||||
|
* @brief Flags defines which can be used with LL_CRS_ReadReg function
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_ISR_SYNCOKF CRS_ISR_SYNCOKF
|
||||||
|
#define LL_CRS_ISR_SYNCWARNF CRS_ISR_SYNCWARNF
|
||||||
|
#define LL_CRS_ISR_ERRF CRS_ISR_ERRF
|
||||||
|
#define LL_CRS_ISR_ESYNCF CRS_ISR_ESYNCF
|
||||||
|
#define LL_CRS_ISR_SYNCERR CRS_ISR_SYNCERR
|
||||||
|
#define LL_CRS_ISR_SYNCMISS CRS_ISR_SYNCMISS
|
||||||
|
#define LL_CRS_ISR_TRIMOVF CRS_ISR_TRIMOVF
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_IT IT Defines
|
||||||
|
* @brief IT defines which can be used with LL_CRS_ReadReg and LL_CRS_WriteReg functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_CR_SYNCOKIE CRS_CR_SYNCOKIE
|
||||||
|
#define LL_CRS_CR_SYNCWARNIE CRS_CR_SYNCWARNIE
|
||||||
|
#define LL_CRS_CR_ERRIE CRS_CR_ERRIE
|
||||||
|
#define LL_CRS_CR_ESYNCIE CRS_CR_ESYNCIE
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_SYNC_DIV Synchronization Signal Divider
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_SYNC_DIV_1 ((uint32_t)0x00U) /*!< Synchro Signal not divided (default) */
|
||||||
|
#define LL_CRS_SYNC_DIV_2 CRS_CFGR_SYNCDIV_0 /*!< Synchro Signal divided by 2 */
|
||||||
|
#define LL_CRS_SYNC_DIV_4 CRS_CFGR_SYNCDIV_1 /*!< Synchro Signal divided by 4 */
|
||||||
|
#define LL_CRS_SYNC_DIV_8 (CRS_CFGR_SYNCDIV_1 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 8 */
|
||||||
|
#define LL_CRS_SYNC_DIV_16 CRS_CFGR_SYNCDIV_2 /*!< Synchro Signal divided by 16 */
|
||||||
|
#define LL_CRS_SYNC_DIV_32 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 32 */
|
||||||
|
#define LL_CRS_SYNC_DIV_64 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_1) /*!< Synchro Signal divided by 64 */
|
||||||
|
#define LL_CRS_SYNC_DIV_128 CRS_CFGR_SYNCDIV /*!< Synchro Signal divided by 128 */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_SYNC_SOURCE Synchronization Signal Source
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_SYNC_SOURCE_GPIO ((uint32_t)0x00U) /*!< Synchro Signal source GPIO */
|
||||||
|
#define LL_CRS_SYNC_SOURCE_LSE CRS_CFGR_SYNCSRC_0 /*!< Synchro Signal source LSE */
|
||||||
|
#define LL_CRS_SYNC_SOURCE_USB CRS_CFGR_SYNCSRC_1 /*!< Synchro Signal source USB SOF (default)*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_SYNC_POLARITY Synchronization Signal Polarity
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_SYNC_POLARITY_RISING ((uint32_t)0x00U) /*!< Synchro Active on rising edge (default) */
|
||||||
|
#define LL_CRS_SYNC_POLARITY_FALLING CRS_CFGR_SYNCPOL /*!< Synchro Active on falling edge */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_FREQERRORDIR Frequency Error Direction
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_CRS_FREQ_ERROR_DIR_UP ((uint32_t)0x00U) /*!< Upcounting direction, the actual frequency is above the target */
|
||||||
|
#define LL_CRS_FREQ_ERROR_DIR_DOWN ((uint32_t)CRS_ISR_FEDIR) /*!< Downcounting direction, the actual frequency is below the target */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EC_DEFAULTVALUES Default Values
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Reset value of the RELOAD field
|
||||||
|
* @note The reset value of the RELOAD field corresponds to a target frequency of 48 MHz
|
||||||
|
* and a synchronization signal frequency of 1 kHz (SOF signal from USB)
|
||||||
|
*/
|
||||||
|
#define LL_CRS_RELOADVALUE_DEFAULT ((uint32_t)0xBB7FU)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset value of Frequency error limit.
|
||||||
|
*/
|
||||||
|
#define LL_CRS_ERRORLIMIT_DEFAULT ((uint32_t)0x22U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset value of the HSI48 Calibration field
|
||||||
|
* @note The default value is 64 for STM32L412xx/L422xx, 32 otherwise, which corresponds
|
||||||
|
* to the middle of the trimming interval.
|
||||||
|
* The trimming step is around 67 kHz between two consecutive TRIM steps.
|
||||||
|
* A higher TRIM value corresponds to a higher output frequency
|
||||||
|
*/
|
||||||
|
#if defined (STM32L412xx) || defined (STM32L422xx)
|
||||||
|
#define LL_CRS_HSI48CALIBRATION_DEFAULT ((uint32_t)64U)
|
||||||
|
#else
|
||||||
|
#define LL_CRS_HSI48CALIBRATION_DEFAULT ((uint32_t)32U)
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/** @defgroup CRS_LL_Exported_Macros CRS Exported Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EM_WRITE_READ Common Write and read registers Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write a value in CRS register
|
||||||
|
* @param __INSTANCE__ CRS Instance
|
||||||
|
* @param __REG__ Register to be written
|
||||||
|
* @param __VALUE__ Value to be written in the register
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
#define LL_CRS_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read a value in CRS register
|
||||||
|
* @param __INSTANCE__ CRS Instance
|
||||||
|
* @param __REG__ Register to be read
|
||||||
|
* @retval Register value
|
||||||
|
*/
|
||||||
|
#define LL_CRS_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EM_Exported_Macros_Calculate_Reload Exported_Macros_Calculate_Reload
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to calculate reload value to be set in CRS register according to target and sync frequencies
|
||||||
|
* @note The RELOAD value should be selected according to the ratio between
|
||||||
|
* the target frequency and the frequency of the synchronization source after
|
||||||
|
* prescaling. It is then decreased by one in order to reach the expected
|
||||||
|
* synchronization on the zero value. The formula is the following:
|
||||||
|
* RELOAD = (fTARGET / fSYNC) -1
|
||||||
|
* @param __FTARGET__ Target frequency (value in Hz)
|
||||||
|
* @param __FSYNC__ Synchronization signal frequency (value in Hz)
|
||||||
|
* @retval Reload value (in Hz)
|
||||||
|
*/
|
||||||
|
#define __LL_CRS_CALC_CALCULATE_RELOADVALUE(__FTARGET__, __FSYNC__) (((__FTARGET__) / (__FSYNC__)) - 1U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Exported functions --------------------------------------------------------*/
|
||||||
|
/** @defgroup CRS_LL_Exported_Functions CRS Exported Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EF_Configuration Configuration
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable Frequency error counter
|
||||||
|
* @note When this bit is set, the CRS_CFGR register is write-protected and cannot be modified
|
||||||
|
* @rmtoll CR CEN LL_CRS_EnableFreqErrorCounter
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableFreqErrorCounter(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_CEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable Frequency error counter
|
||||||
|
* @rmtoll CR CEN LL_CRS_DisableFreqErrorCounter
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableFreqErrorCounter(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_CEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Frequency error counter is enabled or not
|
||||||
|
* @rmtoll CR CEN LL_CRS_IsEnabledFreqErrorCounter
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledFreqErrorCounter(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_CEN) == (CRS_CR_CEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable Automatic trimming counter
|
||||||
|
* @rmtoll CR AUTOTRIMEN LL_CRS_EnableAutoTrimming
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableAutoTrimming(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable Automatic trimming counter
|
||||||
|
* @rmtoll CR AUTOTRIMEN LL_CRS_DisableAutoTrimming
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableAutoTrimming(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_AUTOTRIMEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Automatic trimming is enabled or not
|
||||||
|
* @rmtoll CR AUTOTRIMEN LL_CRS_IsEnabledAutoTrimming
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledAutoTrimming(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_AUTOTRIMEN) == (CRS_CR_AUTOTRIMEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set HSI48 oscillator smooth trimming
|
||||||
|
* @note When the AUTOTRIMEN bit is set, this field is controlled by hardware and is read-only
|
||||||
|
* @rmtoll CR TRIM LL_CRS_SetHSI48SmoothTrimming
|
||||||
|
* @param Value a number between Min_Data = 0 and Max_Data = 127 for STM32L412xx/L422xx or 63 otherwise
|
||||||
|
* @note Default value can be set thanks to @ref LL_CRS_HSI48CALIBRATION_DEFAULT
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetHSI48SmoothTrimming(uint32_t Value)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CR, CRS_CR_TRIM, Value << CRS_CR_TRIM_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get HSI48 oscillator smooth trimming
|
||||||
|
* @rmtoll CR TRIM LL_CRS_GetHSI48SmoothTrimming
|
||||||
|
* @retval a number between Min_Data = 0 and Max_Data = 127 for STM32L412xx/L422xx or 63 otherwise
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetHSI48SmoothTrimming(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CR, CRS_CR_TRIM) >> CRS_CR_TRIM_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set counter reload value
|
||||||
|
* @rmtoll CFGR RELOAD LL_CRS_SetReloadCounter
|
||||||
|
* @param Value a number between Min_Data = 0 and Max_Data = 0xFFFF
|
||||||
|
* @note Default value can be set thanks to @ref LL_CRS_RELOADVALUE_DEFAULT
|
||||||
|
* Otherwise it can be calculated in using macro @ref __LL_CRS_CALC_CALCULATE_RELOADVALUE (_FTARGET_, _FSYNC_)
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetReloadCounter(uint32_t Value)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CFGR, CRS_CFGR_RELOAD, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get counter reload value
|
||||||
|
* @rmtoll CFGR RELOAD LL_CRS_GetReloadCounter
|
||||||
|
* @retval a number between Min_Data = 0 and Max_Data = 0xFFFF
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetReloadCounter(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set frequency error limit
|
||||||
|
* @rmtoll CFGR FELIM LL_CRS_SetFreqErrorLimit
|
||||||
|
* @param Value a number between Min_Data = 0 and Max_Data = 255
|
||||||
|
* @note Default value can be set thanks to @ref LL_CRS_ERRORLIMIT_DEFAULT
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetFreqErrorLimit(uint32_t Value)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CFGR, CRS_CFGR_FELIM, Value << CRS_CFGR_FELIM_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get frequency error limit
|
||||||
|
* @rmtoll CFGR FELIM LL_CRS_GetFreqErrorLimit
|
||||||
|
* @retval A number between Min_Data = 0 and Max_Data = 255
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetFreqErrorLimit(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_FELIM) >> CRS_CFGR_FELIM_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set division factor for SYNC signal
|
||||||
|
* @rmtoll CFGR SYNCDIV LL_CRS_SetSyncDivider
|
||||||
|
* @param Divider This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_1
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_2
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_4
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_8
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_16
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_32
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_64
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_128
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetSyncDivider(uint32_t Divider)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCDIV, Divider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get division factor for SYNC signal
|
||||||
|
* @rmtoll CFGR SYNCDIV LL_CRS_GetSyncDivider
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_1
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_2
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_4
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_8
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_16
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_32
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_64
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_128
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetSyncDivider(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCDIV));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set SYNC signal source
|
||||||
|
* @rmtoll CFGR SYNCSRC LL_CRS_SetSyncSignalSource
|
||||||
|
* @param Source This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_GPIO
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_LSE
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_USB
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetSyncSignalSource(uint32_t Source)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCSRC, Source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get SYNC signal source
|
||||||
|
* @rmtoll CFGR SYNCSRC LL_CRS_GetSyncSignalSource
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_GPIO
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_LSE
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_USB
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetSyncSignalSource(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCSRC));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set input polarity for the SYNC signal source
|
||||||
|
* @rmtoll CFGR SYNCPOL LL_CRS_SetSyncPolarity
|
||||||
|
* @param Polarity This parameter can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_POLARITY_RISING
|
||||||
|
* @arg @ref LL_CRS_SYNC_POLARITY_FALLING
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_SetSyncPolarity(uint32_t Polarity)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCPOL, Polarity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get input polarity for the SYNC signal source
|
||||||
|
* @rmtoll CFGR SYNCPOL LL_CRS_GetSyncPolarity
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_POLARITY_RISING
|
||||||
|
* @arg @ref LL_CRS_SYNC_POLARITY_FALLING
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetSyncPolarity(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCPOL));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure CRS for the synchronization
|
||||||
|
* @rmtoll CR TRIM LL_CRS_ConfigSynchronization\n
|
||||||
|
* CFGR RELOAD LL_CRS_ConfigSynchronization\n
|
||||||
|
* CFGR FELIM LL_CRS_ConfigSynchronization\n
|
||||||
|
* CFGR SYNCDIV LL_CRS_ConfigSynchronization\n
|
||||||
|
* CFGR SYNCSRC LL_CRS_ConfigSynchronization\n
|
||||||
|
* CFGR SYNCPOL LL_CRS_ConfigSynchronization
|
||||||
|
* @param HSI48CalibrationValue a number between Min_Data = 0 and Max_Data = 127 for STM32L412xx/L422xx or 63 otherwise
|
||||||
|
* @param ErrorLimitValue a number between Min_Data = 0 and Max_Data = 0xFFFF
|
||||||
|
* @param ReloadValue a number between Min_Data = 0 and Max_Data = 255
|
||||||
|
* @param Settings This parameter can be a combination of the following values:
|
||||||
|
* @arg @ref LL_CRS_SYNC_DIV_1 or @ref LL_CRS_SYNC_DIV_2 or @ref LL_CRS_SYNC_DIV_4 or @ref LL_CRS_SYNC_DIV_8
|
||||||
|
* or @ref LL_CRS_SYNC_DIV_16 or @ref LL_CRS_SYNC_DIV_32 or @ref LL_CRS_SYNC_DIV_64 or @ref LL_CRS_SYNC_DIV_128
|
||||||
|
* @arg @ref LL_CRS_SYNC_SOURCE_GPIO or @ref LL_CRS_SYNC_SOURCE_LSE or @ref LL_CRS_SYNC_SOURCE_USB
|
||||||
|
* @arg @ref LL_CRS_SYNC_POLARITY_RISING or @ref LL_CRS_SYNC_POLARITY_FALLING
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_ConfigSynchronization(uint32_t HSI48CalibrationValue, uint32_t ErrorLimitValue, uint32_t ReloadValue, uint32_t Settings)
|
||||||
|
{
|
||||||
|
MODIFY_REG(CRS->CR, CRS_CR_TRIM, HSI48CalibrationValue);
|
||||||
|
MODIFY_REG(CRS->CFGR,
|
||||||
|
CRS_CFGR_RELOAD | CRS_CFGR_FELIM | CRS_CFGR_SYNCDIV | CRS_CFGR_SYNCSRC | CRS_CFGR_SYNCPOL,
|
||||||
|
ReloadValue | (ErrorLimitValue << CRS_CFGR_FELIM_Pos) | Settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EF_CRS_Management CRS_Management
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate software SYNC event
|
||||||
|
* @rmtoll CR SWSYNC LL_CRS_GenerateEvent_SWSYNC
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_GenerateEvent_SWSYNC(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_SWSYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the frequency error direction latched in the time of the last
|
||||||
|
* SYNC event
|
||||||
|
* @rmtoll ISR FEDIR LL_CRS_GetFreqErrorDirection
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_CRS_FREQ_ERROR_DIR_UP
|
||||||
|
* @arg @ref LL_CRS_FREQ_ERROR_DIR_DOWN
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetFreqErrorDirection(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FEDIR));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the frequency error counter value latched in the time of the last SYNC event
|
||||||
|
* @rmtoll ISR FECAP LL_CRS_GetFreqErrorCapture
|
||||||
|
* @retval A number between Min_Data = 0x0000 and Max_Data = 0xFFFF
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_GetFreqErrorCapture(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> CRS_ISR_FECAP_Pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EF_FLAG_Management FLAG_Management
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC event OK signal occurred or not
|
||||||
|
* @rmtoll ISR SYNCOKF LL_CRS_IsActiveFlag_SYNCOK
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCOK(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_SYNCOKF) == (CRS_ISR_SYNCOKF));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC warning signal occurred or not
|
||||||
|
* @rmtoll ISR SYNCWARNF LL_CRS_IsActiveFlag_SYNCWARN
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCWARN(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_SYNCWARNF) == (CRS_ISR_SYNCWARNF));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Synchronization or trimming error signal occurred or not
|
||||||
|
* @rmtoll ISR ERRF LL_CRS_IsActiveFlag_ERR
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_ERR(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_ERRF) == (CRS_ISR_ERRF));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Expected SYNC signal occurred or not
|
||||||
|
* @rmtoll ISR ESYNCF LL_CRS_IsActiveFlag_ESYNC
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_ESYNC(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_ESYNCF) == (CRS_ISR_ESYNCF));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC error signal occurred or not
|
||||||
|
* @rmtoll ISR SYNCERR LL_CRS_IsActiveFlag_SYNCERR
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCERR(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_SYNCERR) == (CRS_ISR_SYNCERR));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC missed error signal occurred or not
|
||||||
|
* @rmtoll ISR SYNCMISS LL_CRS_IsActiveFlag_SYNCMISS
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCMISS(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_SYNCMISS) == (CRS_ISR_SYNCMISS));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Trimming overflow or underflow occurred or not
|
||||||
|
* @rmtoll ISR TRIMOVF LL_CRS_IsActiveFlag_TRIMOVF
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_TRIMOVF(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->ISR, CRS_ISR_TRIMOVF) == (CRS_ISR_TRIMOVF));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear the SYNC event OK flag
|
||||||
|
* @rmtoll ICR SYNCOKC LL_CRS_ClearFlag_SYNCOK
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_ClearFlag_SYNCOK(void)
|
||||||
|
{
|
||||||
|
WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear the SYNC warning flag
|
||||||
|
* @rmtoll ICR SYNCWARNC LL_CRS_ClearFlag_SYNCWARN
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_ClearFlag_SYNCWARN(void)
|
||||||
|
{
|
||||||
|
WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear TRIMOVF, SYNCMISS and SYNCERR bits and consequently also
|
||||||
|
* the ERR flag
|
||||||
|
* @rmtoll ICR ERRC LL_CRS_ClearFlag_ERR
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_ClearFlag_ERR(void)
|
||||||
|
{
|
||||||
|
WRITE_REG(CRS->ICR, CRS_ICR_ERRC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear Expected SYNC flag
|
||||||
|
* @rmtoll ICR ESYNCC LL_CRS_ClearFlag_ESYNC
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_ClearFlag_ESYNC(void)
|
||||||
|
{
|
||||||
|
WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup CRS_LL_EF_IT_Management IT_Management
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable SYNC event OK interrupt
|
||||||
|
* @rmtoll CR SYNCOKIE LL_CRS_EnableIT_SYNCOK
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableIT_SYNCOK(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_SYNCOKIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable SYNC event OK interrupt
|
||||||
|
* @rmtoll CR SYNCOKIE LL_CRS_DisableIT_SYNCOK
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableIT_SYNCOK(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_SYNCOKIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC event OK interrupt is enabled or not
|
||||||
|
* @rmtoll CR SYNCOKIE LL_CRS_IsEnabledIT_SYNCOK
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_SYNCOK(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_SYNCOKIE) == (CRS_CR_SYNCOKIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable SYNC warning interrupt
|
||||||
|
* @rmtoll CR SYNCWARNIE LL_CRS_EnableIT_SYNCWARN
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableIT_SYNCWARN(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_SYNCWARNIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable SYNC warning interrupt
|
||||||
|
* @rmtoll CR SYNCWARNIE LL_CRS_DisableIT_SYNCWARN
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableIT_SYNCWARN(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_SYNCWARNIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if SYNC warning interrupt is enabled or not
|
||||||
|
* @rmtoll CR SYNCWARNIE LL_CRS_IsEnabledIT_SYNCWARN
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_SYNCWARN(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_SYNCWARNIE) == (CRS_CR_SYNCWARNIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable Synchronization or trimming error interrupt
|
||||||
|
* @rmtoll CR ERRIE LL_CRS_EnableIT_ERR
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableIT_ERR(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_ERRIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable Synchronization or trimming error interrupt
|
||||||
|
* @rmtoll CR ERRIE LL_CRS_DisableIT_ERR
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableIT_ERR(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_ERRIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Synchronization or trimming error interrupt is enabled or not
|
||||||
|
* @rmtoll CR ERRIE LL_CRS_IsEnabledIT_ERR
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_ERR(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_ERRIE) == (CRS_CR_ERRIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable Expected SYNC interrupt
|
||||||
|
* @rmtoll CR ESYNCIE LL_CRS_EnableIT_ESYNC
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_EnableIT_ESYNC(void)
|
||||||
|
{
|
||||||
|
SET_BIT(CRS->CR, CRS_CR_ESYNCIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable Expected SYNC interrupt
|
||||||
|
* @rmtoll CR ESYNCIE LL_CRS_DisableIT_ESYNC
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_CRS_DisableIT_ESYNC(void)
|
||||||
|
{
|
||||||
|
CLEAR_BIT(CRS->CR, CRS_CR_ESYNCIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if Expected SYNC interrupt is enabled or not
|
||||||
|
* @rmtoll CR ESYNCIE LL_CRS_IsEnabledIT_ESYNC
|
||||||
|
* @retval State of bit (1 or 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_ESYNC(void)
|
||||||
|
{
|
||||||
|
return (READ_BIT(CRS->CR, CRS_CR_ESYNCIE) == (CRS_CR_ESYNCIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(USE_FULL_LL_DRIVER)
|
||||||
|
/** @defgroup CRS_LL_EF_Init Initialization and de-initialization functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
ErrorStatus LL_CRS_DeInit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#endif /* USE_FULL_LL_DRIVER */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* defined(CRS) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* STM32L4xx_LL_CRS_H */
|
2430
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_dma.h
Normal file
2430
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_dma.h
Normal file
File diff suppressed because it is too large
Load Diff
1981
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_dmamux.h
Normal file
1981
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_dmamux.h
Normal file
File diff suppressed because it is too large
Load Diff
1359
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_exti.h
Normal file
1359
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_exti.h
Normal file
File diff suppressed because it is too large
Load Diff
1056
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_gpio.h
Normal file
1056
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_gpio.h
Normal file
File diff suppressed because it is too large
Load Diff
2272
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_i2c.h
Normal file
2272
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_i2c.h
Normal file
File diff suppressed because it is too large
Load Diff
2881
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_lpuart.h
Normal file
2881
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_lpuart.h
Normal file
File diff suppressed because it is too large
Load Diff
1675
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_pwr.h
Normal file
1675
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_pwr.h
Normal file
File diff suppressed because it is too large
Load Diff
6233
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_rcc.h
Normal file
6233
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_rcc.h
Normal file
File diff suppressed because it is too large
Load Diff
5574
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_rtc.h
Normal file
5574
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_rtc.h
Normal file
File diff suppressed because it is too large
Load Diff
1627
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_system.h
Normal file
1627
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_system.h
Normal file
File diff suppressed because it is too large
Load Diff
4701
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usart.h
Normal file
4701
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usart.h
Normal file
File diff suppressed because it is too large
Load Diff
329
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_utils.h
Normal file
329
Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_utils.h
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32l4xx_ll_utils.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief Header file of UTILS LL module.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
@verbatim
|
||||||
|
==============================================================================
|
||||||
|
##### How to use this driver #####
|
||||||
|
==============================================================================
|
||||||
|
[..]
|
||||||
|
The LL UTILS driver contains a set of generic APIs that can be
|
||||||
|
used by user:
|
||||||
|
(+) Device electronic signature
|
||||||
|
(+) Timing functions
|
||||||
|
(+) PLL configuration functions
|
||||||
|
|
||||||
|
@endverbatim
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef STM32L4xx_LL_UTILS_H
|
||||||
|
#define STM32L4xx_LL_UTILS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32l4xx.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32L4xx_LL_Driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_LL UTILS
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private types -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private constants ---------------------------------------------------------*/
|
||||||
|
/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Max delay can be used in LL_mDelay */
|
||||||
|
#define LL_MAX_DELAY 0xFFFFFFFFU
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unique device ID register base address
|
||||||
|
*/
|
||||||
|
#define UID_BASE_ADDRESS UID_BASE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Flash size data register base address
|
||||||
|
*/
|
||||||
|
#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Package data register base address
|
||||||
|
*/
|
||||||
|
#define PACKAGE_BASE_ADDRESS PACKAGE_BASE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private macros ------------------------------------------------------------*/
|
||||||
|
/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @brief UTILS PLL structure definition
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t PLLM; /*!< Division factor for PLL VCO input clock.
|
||||||
|
This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_PLL_ConfigDomain_SYS(). */
|
||||||
|
|
||||||
|
uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock.
|
||||||
|
This parameter must be a number between Min_Data = 8 and Max_Data = 86
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_PLL_ConfigDomain_SYS(). */
|
||||||
|
|
||||||
|
uint32_t PLLR; /*!< Division for the main system clock.
|
||||||
|
This parameter can be a value of @ref RCC_LL_EC_PLLR_DIV
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_PLL_ConfigDomain_SYS(). */
|
||||||
|
} LL_UTILS_PLLInitTypeDef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief UTILS System, AHB and APB buses clock configuration structure definition
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK).
|
||||||
|
This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_SetAHBPrescaler(). */
|
||||||
|
|
||||||
|
uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK).
|
||||||
|
This parameter can be a value of @ref RCC_LL_EC_APB1_DIV
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_SetAPB1Prescaler(). */
|
||||||
|
|
||||||
|
uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK).
|
||||||
|
This parameter can be a value of @ref RCC_LL_EC_APB2_DIV
|
||||||
|
|
||||||
|
This feature can be modified afterwards using unitary function
|
||||||
|
@ref LL_RCC_SetAPB2Prescaler(). */
|
||||||
|
|
||||||
|
} LL_UTILS_ClkInitTypeDef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */
|
||||||
|
#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP64 0x00000000U /*!< LQFP64 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_WLCSP64 0x00000001U /*!< WLCSP64 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP100 0x00000002U /*!< LQFP100 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_BGA132 0x00000003U /*!< BGA132 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP144_CSP72 0x00000004U /*!< LQFP144, WLCSP81 or WLCSP72 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFQFPN32 0x00000008U /*!< UFQFPN32 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFQFPN48 0x0000000AU /*!< UFQFPN48 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP48 0x0000000BU /*!< LQFP48 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_WLCSP49 0x0000000CU /*!< WLCSP49 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFBGA64 0x0000000DU /*!< UFBGA64 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFBGA100 0x0000000EU /*!< UFBGA100 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFBGA169_CSP115 0x00000010U /*!< UFBGA169 or WLCSP115 package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP100_DSI 0x00000012U /*!< LQFP100 with DSI package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_WLCSP144_DSI 0x00000013U /*!< WLCSP144 with DSI package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFBGA144_DSI 0x00000013U /*!< UFBGA144 with DSI package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_UFBGA169_DSI 0x00000014U /*!< UFBGA169 with DSI package type */
|
||||||
|
#define LL_UTILS_PACKAGETYPE_LQFP144_DSI 0x00000015U /*!< LQFP144 with DSI package type */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Exported functions --------------------------------------------------------*/
|
||||||
|
/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Word0 of the unique device identifier (UID based on 96 bits)
|
||||||
|
* @retval UID[31:0]: X and Y coordinates on the wafer expressed in BCD format
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_GetUID_Word0(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Word1 of the unique device identifier (UID based on 96 bits)
|
||||||
|
* @retval UID[63:32]: Wafer number (UID[39:32]) & LOT_NUM[23:0] (UID[63:40])
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_GetUID_Word1(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 4U))));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Word2 of the unique device identifier (UID based on 96 bits)
|
||||||
|
* @retval UID[95:64]: Lot number (ASCII encoded) - LOT_NUM[55:24]
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_GetUID_Word2(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U))));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Flash memory size
|
||||||
|
* @note This bitfield indicates the size of the device Flash memory expressed in
|
||||||
|
* Kbytes. As an example, 0x040 corresponds to 64 Kbytes.
|
||||||
|
* @retval FLASH_SIZE[15:0]: Flash memory size
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_GetFlashSize(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS)) & 0xFFFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Package type
|
||||||
|
* @retval Returned value can be one of the following values:
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP64 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP100 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_BGA132 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_CSP72 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFQFPN32 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFQFPN48 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP48 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_WLCSP49 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFBGA64 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFBGA100 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFBGA169 (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_DSI (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_WLCSP144_DSI (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFBGA144_DSI (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_UFBGA169_DSI (*)
|
||||||
|
* @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_DSI (*)
|
||||||
|
*
|
||||||
|
* (*) value not defined in all devices.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t LL_GetPackageType(void)
|
||||||
|
{
|
||||||
|
return (uint32_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x1FU);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_LL_EF_DELAY DELAY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function configures the Cortex-M SysTick source of the time base.
|
||||||
|
* @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro)
|
||||||
|
* @note When a RTOS is used, it is recommended to avoid changing the SysTick
|
||||||
|
* configuration by calling this function, for a delay use rather osDelay RTOS service.
|
||||||
|
* @param Ticks Number of ticks
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
|
||||||
|
{
|
||||||
|
/* Configure the SysTick to have interrupt in 1ms time base */
|
||||||
|
SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
|
||||||
|
}
|
||||||
|
|
||||||
|
void LL_Init1msTick(uint32_t HCLKFrequency);
|
||||||
|
void LL_mDelay(uint32_t Delay);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup UTILS_EF_SYSTEM SYSTEM
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
void LL_SetSystemCoreClock(uint32_t HCLKFrequency);
|
||||||
|
ErrorStatus LL_SetFlashLatency(uint32_t HCLKFrequency);
|
||||||
|
ErrorStatus LL_PLL_ConfigSystemClock_MSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct,
|
||||||
|
LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct);
|
||||||
|
ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct,
|
||||||
|
LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct);
|
||||||
|
ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass,
|
||||||
|
LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* STM32L4xx_LL_UTILS_H */
|
Loading…
Reference in New Issue
Block a user