47#define CRC_CR_POLYSIZE_16 (0x1u << CRC_CR_POLYSIZE_Pos)
54 RCC->AHB4ENR |= RCC_AHB4ENR_CRCEN;
67 if (data == NULL || len == 0) {
78 CRC->CR |= CRC_CR_RESET;
83 volatile uint8_t *
const dr8 = (
volatile uint8_t *)&CRC->DR;
84 for (uint16_t i = 0; i < len; i++) {
88 uint16_t crc = (uint16_t)(CRC->DR & 0xFFFFu);
96uint16_t
crc16_ccitt(
const uint8_t *data, uint16_t len) {
97 if ((data == NULL) || (len == 0u)) {
100 uint16_t crc = 0xFFFFu;
101 for (uint16_t i = 0u; i < len; i++) {
102 crc ^= (uint16_t)((uint16_t)data[i] << 8u);
103 for (uint8_t bit = 0u; bit < 8u; bit++) {
104 if ((crc & 0x8000u) != 0u) {
105 crc = (uint16_t)((crc << 1) ^ 0x1021u);
107 crc = (uint16_t)(crc << 1);
#define CRC_CR_POLYSIZE_16
static volatile uint8_t crc_initialised
static void crc_hw_init(void)
uint16_t crc16_ccitt(const uint8_t *data, uint16_t len)
Compute CRC16-CCITT (poly 0x1021, init 0xFFFF) over a byte buffer.
CRC16-CCITT helper for the ICARUS OS kernel.
ICARUS OS Configuration Header.
ICARUS Kernel Core - State and Initialization.
void __exit_critical(void)
Privileged implementation of exit_critical.
void __enter_critical(void)
Privileged implementation of enter_critical.