From 11b856822d3e985297f00d09194d807ef4af3e35 Mon Sep 17 00:00:00 2001 From: Fergus Noble Date: Mon, 26 Sep 2011 14:21:42 -0700 Subject: Moving a couple more headers to stm common. --- include/libopencm3/stm32/tools.h | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 include/libopencm3/stm32/tools.h (limited to 'include/libopencm3/stm32/tools.h') diff --git a/include/libopencm3/stm32/tools.h b/include/libopencm3/stm32/tools.h new file mode 100644 index 0000000..ac7f0bf --- /dev/null +++ b/include/libopencm3/stm32/tools.h @@ -0,0 +1,64 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Piotr Esden-Tempski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef LIBOPENCM3_TOOLS_H +#define LIBOPENCM3_TOOLS_H + +/* + * Register accessors / manipulators + */ + +/* Get register content. */ +#define GET_REG(REG) ((u16) *REG) + +/* Set register content. */ +#define SET_REG(REG, VAL) (*REG = (u16)VAL) + +/* Clear register bit. */ +#define CLR_REG_BIT(REG, BIT) SET_REG(REG, (~BIT)) + +/* Clear register bit masking out some bits that must not be touched. */ +#define CLR_REG_BIT_MSK(REG, MSK, BIT) \ + SET_REG(REG, (GET_REG(REG) & MSK & (~BIT))) + +/* Get masked out bit value. */ +#define GET_REG_BIT(REG, BIT) (GET_REG(REG) & BIT) + +/* + * Set/reset a bit in a masked window by using toggle mechanism. + * + * This means that we look at the bits in the bit window designated by + * the mask. If the bit in the masked window is not matching the + * bitmask BIT then we write 1 and if the bit in the masked window is + * matching the bitmask BIT we write 0. + * + * TODO: We may need a faster implementation of that one? + */ +#define TOG_SET_REG_BIT_MSK(REG, MSK, BIT) \ +do { \ + register u16 toggle_mask = GET_REG(REG) & (MSK); \ + register u16 bit_selector; \ + for (bit_selector = 1; bit_selector; bit_selector <<= 1) { \ + if ((bit_selector & (BIT)) != 0) \ + toggle_mask ^= bit_selector; \ + } \ + SET_REG(REG, toggle_mask); \ +} while(0) + +#endif -- cgit v1.2.3