STM32的位操作问题

用8位的单片机,一般C语言中可以对某寄存器或输出端口进行移位操作和位取反操作,可以使LED灯流水或闪烁.
我想问下:
1. STM32对GPIO操作一般用库函数,那么怎么使某一位端口取反?怎么使某口移位流水? 请写个示范代码.

2.我见一个例子中对PC6端口某个LED闪烁代码如下,不知是什么意思? 是不是取反操作?为什么要先读出位?
GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));

3.中断向量表是不是都是固定如下的?还是某些情况要重设?
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

1.例子如下:

GPIO_Write(GPIOC,DataBus);
或者不用库
GPIOC->ODR &= 0XFF00;
GPIOC->ODR |= DataBus;
流水就简单了移位即可 不用写了吧
2.
先读出才知道状态啊,不读也可以啊 不要那么死

3.中断向量表 肯定是固定的
不然怎么知道是哪个中断。只是优先级可设置
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-31
1、懒的写了。就是用库函数。
2、就是取反。肯定是要先读的啊,不然的话怎么取反。
3、这是给程序在RAM里跑准备的,你复制的也不全,可见你根本没理解这几句什么意思,我也懒的讲了,自己看C语言的宏定义吧。
按你的情况,多数时间程序就这一句管用,其它的都删了吧:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
第2个回答  2010-07-29
union
{
uc Flag1;
struct
{
uc Flag1_bit0:1;
uc Flag1_bit1:1;
uc Flag1_bit2:1;
uc Flag1_bit3:1;
uc Flag1_bit4:1;
uc Flag1_bit5:1;
uc Flag1_bit6:1;
uc Flag1_bit7:1;
};
};

#define XXFlag Flag1_bit0

反正我是这么用的

为什么stm32的库函数操作寄存器时不使用位域\/位段(bi
首先,位域无法将多个操作合并执行,导致性能下降。例如,对于包含三个位域字段的寄存器,如`uint32 a:1, b:1, c:1;`,如果尝试同时将a、b、c设置为1,常规操作需要三次赋值。由于寄存器通常使用volatile修饰,编译器无法优化为一次写入操作,结果产生了三次读取和三次写入,效率低下。其次,寄存器...

stm32位操作时为何要对寄存器进行位翻转?
STM32对外设端口的操作,是通过对相关寄存器的位操作来控制的。STM32将寄存器的位都映射到位带区 bit_band region ,这样对位带区进行位操作时,就会映射到相应寄存器的位,从而实现对端口的操作。STM32有二个位带区 bit_band region :一是内存 SRAM区,在 0x2000 0000~0x200f ffff范围( 1M空间...

最近学习STM32,发现一个奇怪的问题,32位的系统,存储器地址空间应该是2...
你的算法没问题,你的理解有问题!32位的操作系统理论上最多支持4GBytes是没问题的。1Bytes(字节)=8bits(字位)也是没问题的。你存在概念性错误,你的计算方案应该是以CUP的32位数来计算就只有2^32bits= 512MByte,然而2^32Byte=4GB。首先你要区分32位操作系统和32位的处理器(cpu)的区别和联系。

stm32 位操作为什么用或等于等起他复合赋值语句
但是对于高端点的单片机,复位后值就不一定是0了,复位后的值能支持单片机正常工作,因为寄存器一般都是16位,32位,超多功能设定,若是不清楚具体到每一位的值,直接用=,那么之前的值均被更改,单片机反而不工作,

刚开始接触STM32,我想问一下如果我想设置标志位怎么设置。我知道在单片...
可以用一个位来操作,但是在32位系统里,这样做程序效率不高,远不如直接用一个32位变量操作来的快(少于32位的操作,都要在汇编层面上考虑不能溢出,所以会耗费不必要的语句),而且对于32来说,ram的大小多数时候都是远远超过需要的,不想51只有区区几百个字节。其实在STM32里,系统本身也使用了...

在对stm32读写内部flash时,经常见到地址有如下操作。我想请问为什么每次...
如果你是32位操作当然就是每次读4字节的,指针也要加4啊,正常。如果是按BYTE读写就不用。

有关stm32的问题,程序里面的u8、u16这些是什么意思啊
对于STM32这类32位处理器,其处理的数据是按照字(32位)和半字(16位)来划分的。u16类型的变量通常用于操作16位数据,而u8则只能访问数据的低8位。使用u32时,读取通常没有问题,但在写入时可能会因为编译器的处理而有所不同,可能需要特别注意。与传统的ARM处理器(如ARM7或ARM9)相比,STM32...

stm32中,设置数据帧的第一个字节的数据奇偶校验位为1,后面的字节的奇偶...
STM32串口数据寄存器是9位的,直接设置数据位9位,无校验,然后第一个9位数据的最高位强制设置成1,其它9位数据最高位强制设置成0就可以了。

位带操作
位带操作 ,指的就是单独对一个bit位进行读和写。在 STM32 中,有两个地方实现了位带,一个是 SRAM 区 的最低 1MB 空间,令一个是 外设区 最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的 位带别名区 ,位带别名区把这 1MB 的空间的每一个位膨胀...

stm32spi32位读写
stm32spi32位读写要通过STM32使用SPI写入命令字节。向sd卡发送命令参数命令参数是32位数据,spi每次发送8位,需要发送4次,先发送最高8位,依次再发送低位。可通过STM32使用SPI写入命令字节来实现对32个寄存器的读写操作。

相似回答