GPIOx->BSRR = (((uint32_t)0x01) << pinpos);

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPIOx->BSRR = (((uint32_t)0x01) << pinpos);相关的知识,希望对你有一定的参考价值。

GPIOx->BSRR = (((uint32_t)0x01) << pinpos)里的(((uint32_t)0x01) 是什么意思?

0x01是8位的 二进制是00000001 这里要转成32位的 即0x0001,这句话的意思是将这个1转换成32位之后左移pinpos这个变量值的这么多位!串口编程啊,孩子,这个GPIO口的BSRR寄存器置位操作!追问

(((uint32_t)0x01) << pinpos)为什么就可以把0x01转换成unsigned int类型的呢 有什么固定的转换的格式吗?

uint32_t后面的_t是什意思呢

追答

我X!uint32_t这个是整个的一个数据类型,系统使用typedef 定义的,按照字面上来说这个是个unsigned int 型的数据! typedef uint32_t unsigned int。。。哪那么多为什么,uint32_t是个整体,就是一个类型名罢了! 我之前说了!BSRR是个32位的寄存器!你的数据时8位的,你要对32位进行操作只有进行扩充才行!这。。。。。我感觉你还是去看看书在说,假如你连这个都看不懂,我觉得你的C语言学得相当有问题,并且你不适合对底层硬件接口的编程!你的知识差得太多了!

追问

谢谢 明白了 我看stdint.h里面写的 int_leastN_t, int_fastN_t
least和fast是什么啊
还有(((uint32_t)0x01) << pinpos);写成下面这样行不行啊
((uint32_t)0x01) << pinpos;

追答

既然你都看懂了uint32_t 那就可以看懂int_leastN_t, int_fastN_t啊,,,可以那么写,但是推荐不要改人家的,不清具体情况,不好解答!

参考技术A (((uint32_t)0x01) 他的意思是将 0x01也就是1这个值转换成unsigned int型类型追问

为什么要将 0x01也就是1这个值转换成unsigned int型类型的呢?

追答

这个问题可能是因为GPIOx->BSRR 这个类型是unsigned int 的原因

追问

(((uint32_t)0x01) << pinpos)为什么就可以把0x01转换成unsigned int类型的呢 有什么固定的转换的格式吗?

uint32_t后面的_t是什意思呢

追答

这个是没有的,你想转换成什么就转换成什么的 , uint32_t 是自定义类型,从名称上看应该是
typedef unsigned int uint32_t.

参考技术B ((uint32_t)0x01) 在C语言中属于强制类型转换 uint32_t是用typedef自定义的数据类型,你该好好学一下C语言了

stm32中GPIOx_BSRR和 GPIO_xBRR寄存允许对任何GPIOx进行读\更改的独立访问;

这样在读或更改之间产生的IRQ时不会发生危险。这是什么意思呀,各位帮忙理解一下,谢谢呀。

一般情况下控制控制IO口高低电平就直接控制GPIOx->ODR寄存器即可。
而控制GPIOx->BSRR和GPIOx->BRR就等于间接控制GPIOx->ODR寄存器,而且手册也说了,BSRR、BRR是只写寄存器,写1有效写0无影响,这是什么意思呢;就是对BSRR和BRR寄存器写1就是对相应的IO口电平操作,写0的话IO口电平不变,这样就达到了上面所说的:允许对任何GPIOx进行读、更改的独立访问。
比如我要让GPA0变为高电平,可以有两种做法:
1、GPIOA->ODR|=GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
比如我要让GPA0变为低电平,可以有两种做法:
1、GPIOA->ODR&=~GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
可以看到都是只改变一个IO口电平的时候,明显第2中方法要更加简单一些。
参考技术A 比如我要让GPIOA变为高电平,可以有两种做法:
1、GPIOA->ODR|=GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
比如我要让GPIOA变为低电平,可以有两种做法:
1、GPIOA->ODR&=~GPIO_Pin_0;
2、GPIOA->BRR=GPIO_Pin_0;
总结和纠正一下前面大佬的错别字,本人也是在学习过程中,感谢各位大佬的回答
参考技术B 需要帮你做设计吗 参考技术C 这句话出自何处/?来个完整的看看追问

完整的就是上面加下面的话,因为上面有字数限定,这句话来自刘凯stm32视频GPIO的手册,不太明白,帮忙看一下怎样理解,谢了

追答

就当他放屁了吧,我从来没遇到过什么危险的事情一直用32呢,我进行io口操作的时候来中断的话cpu也会保护现场的

以上是关于GPIOx->BSRR = (((uint32_t)0x01) << pinpos);的主要内容,如果未能解决你的问题,请参考以下文章

GPIOx_BSRR 这个寄存器的功能既有设置又有清除,为啥还要GPIOx_BRR这个呢?啥区

c语言中GPIOA->BSRR=1<<9啥意思

关于STM32的简单问题,GPIOA->BSRR=0x080004;这样写对吗?

STM32F103X datasheet学习笔记---GPIOs and AFIOs

STM32系列单片机IO口模式设置

STM32中的BRR寄存器与BSRR寄存器重复么?