标题:
32单片机位带操作程序
[打印本页]
作者:
sr861126
时间:
2024-12-2 13:46
标题:
32单片机位带操作程序
#ifndef __SYS_H
#define __SYS_H
#include "hk32f030m.h"
#define u16 unsigned int
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
u16 bit0 : 1;
u16 bit1 : 1;
u16 bit2 : 1;
u16 bit3 : 1;
u16 bit4 : 1;
u16 bit5 : 1;
u16 bit6 : 1;
u16 bit7 : 1;
u16 bit8 : 1;
u16 bit9 : 1;
u16 bit10 : 1;
u16 bit11 : 1;
u16 bit12 : 1;
u16 bit13 : 1;
u16 bit14 : 1;
u16 bit15 : 1;
}Bits16_TypeDef;
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) ( ((Bits16_TypeDef *)(&(GPIOA->ODR)))->bit##n )
#define PAin(n) ( ( GPIOA->IDR&(1 << (n)) )>>n ) //输入
#define PBout(n) ( ((Bits16_TypeDef *)(&(GPIOB->ODR)))->bit##n )
#define PBin(n) ( ( GPIOB->IDR&(1 << (n)) )>>n ) //输入
#define PCout(n) ( ((Bits16_TypeDef *)(&(GPIOC->ODR)))->bit##n )
#define PCin(n) ( ( GPIOC->IDR&(1 << (n)) )>>n ) //输入
#define PDout(n) ( ((Bits16_TypeDef *)(&(GPIOD->ODR)))->bit##n )
#define PDin(n) ( ( GPIOD->IDR&(1 << (n)) )>>n ) //输入
#ifdef __cplusplus
}
#endif
#endif
作者:
zhxzhx
时间:
2024-12-31 17:17
你这是 位带?这不是域吗?
作者:
joyb
时间:
2025-4-10 08:35
位带操作简单的说,就是把每个比特膨胀为一个 32 位的字,当访问这些字的时候就达到了访问比特的目的,比如说 GPIO 的 ODR 寄存器有 32 个位,那么可以映射到 32 个地址上,我们去访问这 32 个地址就达到访问 32 个比特的目的。这样我们往某个地址写 1 就达到往对应比特位写 1 的目的,同样往某个地址写 0 就达到往对应的比特位写 0 的目的。
支持了位带操作后,可以使用普通的加载、存储指令来对单一的比特进行读写。在CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自
己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。
作者:
rundstedt
时间:
2025-7-18 19:14
为了节约1bit的空间,要用32bit位带地址访问,是不是丢了西瓜捡芝麻?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1