使用BSRR和BRR寄存器直接操作STM32的IO端口

合集下载

STM32考试习题及答案

STM32考试习题及答案

S T M32考试习题及答案一、填空题1.当STM32的I/O端口配置为输入时,输出缓冲器被禁止,施密特触发输入被激活。

根据输入配置(上拉,下拉或浮动)的不同,该引脚的弱上拉和下拉电阻被连接。

出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。

2.STM32的所有端口都有外部中断能力。

当使用外部中断线时,相应的引脚必须配置成输入模式。

3.STM32具有单独的位设置或位清除能力。

这是通过GPIOx_BSRR 和GPIOx_BRR 寄存器来实现的。

4.ST公司还提供了完善的通用IO接口库函数,其位于stm32f10x_gpio.c ,对应的头文件为stm32f10x_gpio.h 。

5.为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR) 来实现引脚的重新映射。

二、选择题1.在APB2上的I/O脚的翻转速度为(A )。

A.18MHz B.50MHzC.36MHz D.72MHz4.当输出模式位MODE[1:0]=“10”时,最大输出速度为(B )。

A.10MHz B.2MHzC.50MHz D.72MHz三、简答题1.简述不同复用功能的重映射。

答:为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)来实现引脚的重新映射。

各个复用功能的重映射可以参阅正文的介绍,由于内容比较多,正文介绍非常详细,这里省略。

2.简述STM32的GPIO的一些主要特点(至少5个)。

答:主要特点如下:通用I/O,可以作为输出、输入等功能。

单独的位设置或位清除。

外部中断/唤醒线。

复用功能(AF)和重映射。

stm32复习资料答案

stm32复习资料答案

一、填空题1.当STM32的I/O端口配置为输入时, 输出缓冲器被禁止, 施密特触发输入被激活。

根据输入配置(上拉,下拉或浮动)的不同,该引脚的弱上拉和下拉电阻被连接。

出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。

2.STM32的所有端口都有外部中断能力.当使用外部中断线时,相应的引脚必须配置成输入模式。

3.STM32具有单独的位设置或位清除能力.这是通过GPIOx_BSRR 和GPIOx_BRR 寄存器来实现的.4.ST公司还提供了完善的通用IO接口库函数,其位于stm32f10x_gpio。

c ,对应的头文件为stm32f10x_gpio.h 。

5.为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR) 来实现引脚的重新映射。

二、选择题1.在APB2上的I/O脚的翻转速度为( A ).A.18MHz B.50MHzC.36MHz D.72MHz4.当输出模式位MODE[1:0]=“10”时,最大输出速度为( B )。

A.10MHz B.2MHzC.50MHz D.72MHz三、简答题1.简述不同复用功能的重映射。

答:为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)来实现引脚的重新映射。

各个复用功能的重映射可以参阅正文的介绍,由于内容比较多,正文介绍非常详细,这里省略。

2.简述STM32的GPIO的一些主要特点(至少5个)。

答:主要特点如下:❑通用I/O,可以作为输出、输入等功能。

❑单独的位设置或位清除.❑外部中断/唤醒线。

❑复用功能(AF)和重映射。

❑GPIO锁定机制。

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作GPI0端口STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSR和GPIOx_BRF寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置“或置“ 0。

“GPIOx_BSRR勺高16位中每一位对应端口x的每个位,对高16位中的某位置“狈『端口x的对应位被清“0;“寄存器中的位置“0, “则对它对应的位不起作用。

GPIOx_BSRR的氐16位中每一位也对应端口x的每个位,对低16位中的某位置“1则“它对应的端口位被置“1;“寄存器中的位置“0,“则对它对应的端口不起作用。

简单地说GPIOx_BSR的高16位称作清除寄存器,而GPIOx_BSR的低氐16 位称作设置寄存器。

另一个寄存器GPIOx_BRfl只有低16位有用,与GPIOx_BSR 的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要改变低8位的数据而保持高8位不变,假设新的8 位数据在变量Newdata 中,这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数GPIO_SetBits和GPIO_ResetBits使用了这两个寄存器操作端口。

上述要求可以这样实现:GPI0_SetBits(GPI0E, Newdata & 0xff);GPI0_ResetBits(GPI0E, (~Newdata & 0xff));也可以直接操作这两个寄存器:GPI0E->BSRR = Newdata & 0xff;GPI0E->BRR = ~Newdata & 0xff;当然还可以一次完成对8位的操作:GPIOE->BSRR = (Newdata & 0xff) | (~Newdata & 0xff)<<16;从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

STM32考试习题及答案

STM32考试习题及答案

STM32考试习题及答案一、填空题1.当STM32的I/O端口配置为输入时,输出缓冲器被禁止,施密特触发输入被激活。

根据输入配置(上拉,下拉或浮动)的不同,该引脚的弱上拉和下拉电阻被连接。

出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。

2.STM32的所有端口都有外部中断能力。

当使用外部中断线时,相应的引脚必须配置成输入模式。

3.STM32具有单独的位设置或位清除能力。

这是通过GPIOx_BSRR 和GPIOx_BRR寄存器来实现的。

4.ST公司还提供了完善的通用IO接口库函数,其位于stm32f10x_gpio.c,对应的头文件为stm32f10x_gpio.h。

5.为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)来实现引脚的重新映射。

二、选择题1.在APB2上的I/O脚的翻转速度为(A)。

A.18MHz B.50MHzC.36MHz D.72MHz4.当输出模式位MODE[1:0]=“10”时,最大输出速度为(B)。

A.10MHz B.2MHzC.50MHz D.72MHz三、简答题1.简述不同复用功能的重映射。

答:为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)来实现引脚的重新映射。

各个复用功能的重映射可以参阅正文的介绍,由于内容比较多,正文介绍非常详细,这里省略。

2.简述STM32的GPIO的一些主要特点(至少5个)。

答:主要特点如下:?通用I/O,可以作为输出、输入等功能。

?单独的位设置或位清除。

?外部中断/唤醒线。

?复用功能(AF)和重映射。

?GPIO锁定机制。

STM32的IO口设置方法实例

STM32的IO口设置方法实例

STM32的IO⼝设置⽅法实例STM32的IO⼝设置⽅法实例!通过本节的学习,你将了解到STM32的IO⼝作为输出使⽤的⽅法。

本节分为如下⼏个⼩节:3.1.1 STM32 IO⼝简介3.1.2 硬件设计3.1.3 软件设计3.1.4 仿真与下载3.1.1 STM32 IO简介作为所有开发板的经典⼊门实验,莫过于跑马灯了。

ALIENTEK MiniSTM32开发板板载了2个LED,DS0和DS1,本实验将通过教你如何控制这两个灯实现交替闪烁的类跑马灯效果。

该实验的关键在于如何控制STM32的IO⼝输出。

了解了STM32的IO⼝如何输出的,就可以实现跑马灯了。

通过这⼀节的学习,你将初步掌握STM32基本IO⼝的使⽤,⽽这是迈向STM32的第⼀步。

STM32的IO⼝可以由软件配置成8种模式:1、输⼊浮空2、输⼊上拉3、输⼊下拉4、模拟输⼊5、开漏输出6、推挽输出7、推挽式复⽤功能8、开漏复⽤功能每个IO⼝可以⾃由编程,单IO⼝寄存器必须要按32位字被访问。

STM32的很多IO⼝都是5V兼容的,这些IO⼝在与5V电平的外设连接的时候很有优势,具体哪些IO⼝是5V兼容的,可以从该芯⽚的数据⼿册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。

STM32的每个IO端⼝都有7个寄存器来控制。

他们分别是:配置模式的2个32位的端⼝配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;⼀个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这⾥我们仅介绍常⽤的⼏个寄存器,我们常⽤的IO端⼝寄存器只有4个:CRL、CRH、IDR、ODR。

CRL和CRH控制着每个IO⼝的模式及输出速率。

STM32的IO⼝位配置表如表3.1.1.1所⽰:表3.1.1.1 STM32的IO⼝位配置表STM32输出模式配置如表3.1.1.2所⽰:表3.1.1.2 STM32输出模式配置表接下来我们看看端⼝低配置寄存器CRL的描述,如下图所⽰:图3.1.1.1端⼝低配置寄存器CRL各位描述该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端⼝为浮空输⼊模式。

STM32的IO口读写

STM32的IO口读写

#define LCD_DATA_IN(((GPIOC->IDR & PINS_DATA) >> 0) & 0xFF) //端口输入寄存器/* Writing value to DA TA pins */ #define LCD_DATA_OUT(x)GPIOC->ODR = (GPIOC->ODR & ~PINS_DA TA) | (x << 0); //端口输出寄存器/* Setting all pins to output mode */#define LCD_ALL_DIR_OUTGPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x33333333; //配置寄存器低8位GPIOC->CRH = (GPIOC->CRH & 0xFFF00000) | 0x00033333; //配置寄存器高8位uchar value ;tValue = ~value;GPIOB->BSRR = (uint) value; //高16复位/低16置位寄存器GPIOB->BRR = (uint) tV alue; //低16复位寄存器GPIO_WriteBit(GPIOB, GPIO_Pin_2,Bit_RESET); //重置单个或多个位IO为0状态GPIO_WriteBit(GPIOB, GPIO_Pin_2,Bit_SET); //重置单个或多个位IO为1状态GPIO_WriteBit(GPIOB, GPIO_Pin_2,(BitAction)0x01); //写入单个或多个位IO为1状态GPIO_WriteBit(GPIOB, GPIO_Pin_2,(BitAction)0x00); //写入单个或多个位IO为0状态GPIO_Write(GPIOC,0xaa55); //写入整个PORT口的状态GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);//读入单个或多个输入寄存器的位IO状态//必须在输入模式GPIO_ReadInputData(GPIOA);//读入整个输入口寄存器的IO状态//必须在输入模式GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6);//读入单个或多个输出寄存器的位IO状态//必须在输出模式GPIO_ReadOutputData(GPIOA);//读入整个输出口寄存器的IO状态//必须在输出模式GPIO_SetBits(GPIOD,GPIO_Pin_2); //置1GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_4); //置1GPIO_ResetBits(GPIOD,GPIO_Pin_2); //清0GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_3); //清0。

高手带你解析STM32 BSRR BRR ODR 寄存器

高手带你解析STM32 BSRR BRR ODR 寄存器

出取反输出,当前输出为高则输出低,当前输出低则输出高),官方的库函数 就是直接对 ODR 寄存器进行操作的。代码如下: void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)[标签:内容]
一样的。也就是说,输出低电平的宏语句,可以有如下两种写法。 #define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_0 等价于 #define SET_BL_LOW() GPIOA->BSRR=GPIO_Pin_0 这幺来看的话,其实 BRR 寄存器是比较多余的。而实际上,在最新的 STM32F4 系列 MCU 的 GPIO 寄存器中,已经找不到 BRR 寄存器了,仅保留了 BSRR 寄存器用 于实现端口输出高低电平。因此,在 STM32F4 系列 MCU 的库函数中,对 GPIO 口输出高低电平的函数为如下形式: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); assert_param(IS_GPIO_PIN_ACTION(PinState)); if(PinState != GPIO_PIN_RESET)
高手带你解析 STM32 BSRR BRR ODR 寄存器
一、用法 经常会看到类似如下的宏定义语句,用于对已经初始化后的 IO 口输出 高、低电平。 #define SET_BL_HIGH() GPIOA->BSRR=GPIO_Pin_0 #define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_012 其作用类似于如下两个库函数, void GPIO_SetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin) void GPIO_ResetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin) 12 而且实际上这两个库函数就是通过修改 BSRR,BRR 寄存器的值来实现对 IO 口设置的。如下便是输出高电平的函数体: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_arameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx->BSRR = GPIO_Pin; }12345678 因此,使用宏或者库函数本质上都是一样的。区别在于使用宏更快,而使 用函数更灵活。 二、解释 BSRR 和 BRR 都是 STM32 系列 MCU 中 GPIO 的寄存器。 BSRR 称 为端口位设置/清楚寄存器,BRR 称为端口位清除寄存器。 BSRR 低 16 位用于设置 GPIO 口对应位输出高电平,高 16 位用于设置 GPIO 口对应位输出低电平。 BRR 低 16 位用于设置 GPIO 口对应位输出低电平。高 16 位为保留地 址,读写无效。 所以理论上来讲,BRR 寄存器的功能和 BSRR 寄存器高 16 位的功能是

bsrr用法

bsrr用法

bsrr用法
"BSRR"是ARM处理器中的一个寄存器,全称为Bit Set/Reset Register,用于进行位的设置和复位操作。

BSRR寄存器是一个32位的寄存器,每个寄存器位对应于处理器中的一个GPIO引脚。

它用于实现对GPIO引脚的状态控制,可以设置和
复位引脚的状态。

BSRR寄存器的使用方法如下:
-要设置引脚的状态,将对应的引脚位设置为1,其他位保持为0。

这将使得对应引脚被置位(设置为高电平)。

-要复位引脚的状态,将对应的引脚位设置为0,其他位保持为1。

这将使得对应引脚被复位(设置为低电平)。

BSRR寄存器的使用可以通过地址来直接访问,也可以通过使用基
本操作指令来进行访问。

具体使用方法取决于所使用的编程环境和指
令集。

补充拓展:
BSRR寄存器的使用在嵌入式编程中广泛应用于控制外部设备、模
块和接口。

通过对GPIO引脚的状态进行设置和复位,可以完成诸如数
据传输、信号控制、传感器读取等各种任务。

同时,BSRR寄存器的使用还可以实现比较高效的位操作,因为它
允许同时设置和复位多个引脚的状态。

而且,寄存器的宽度一般是固
定的,这使得代码在不同设备上的可移植性更高。

在使用BSRR寄存器时,需要非常小心,确保正确设置和复位引脚,防止产生错误的程序行为或硬件故障。

为了确保正确使用,建议参考
相关的芯片手册和编程指南。

STM32的IO端口高8位或低8位单独操作方法

STM32的IO端口高8位或低8位单独操作方法
位操作,都是在置1的时候对某位有影响.
举例说下怎幺对IO端口赋值:
1.对高8位/低8位/全部清零
很明显,这个只需要操作BRR寄存器即可:
对高8位清零:GPIOA->BRR=0xFF00
对低8位清零:GPIOA->BRR=0x00FF
全部清零:GPIOA->BRR=0xFFFF或GPIOA->ODR=0x0000
1,置0的位不影响原来的值
高16位应该置为0000000010101010,这个就等于~0x55(即取反)的结
果,置1使某位为ห้องสมุดไป่ตู้,置0不影响原来的值
这样,BSRR寄存器的值就是00000000101010100000000001010101,
两部分的高8位均为0,所以不会影响到IO口的高8位
总结,以下的宏实现对某端口的低8位置数,不影响高8位:
STM32的IO端口高8位或低8位单独操作方法
几天前刚接触stm32的时候,被单独操作IO口给弄糊涂了,现记录下,现
在发现其实蛮简单的,只是刚开始的时候~~~
stm32的IO端口都是16位的,如果要单独操作某高8位或低8位,则不
是那幺简单,先看两张BSRR/BRR寄存器的图:
据官方数据手册上面说,这两个寄存器用于专门对ODR进行原子操作的
#defineGPIO_WriteLow(GPIOx,a)GPIOx-
>BSRR=(((uint32_t)(uint8_t)~(a))BSRR=(((uint8_t)(uint8_t)~(a))BSRR=value的
形式,所以担心是多余的
当然了,使用下面2,3的两个宏也可以完全该清零操作~stm32固件库是不
是应该加上这两个宏/函数?

STM32的优越外设介绍 (2007年12月)

STM32的优越外设介绍 (2007年12月)

六个16位PWM 六个16位PWM 同步高级定时器 同步高级定时器 多达16个外部中断 多达16个外部中断 26/37/51/80 I/O端口 26/37/51/80 I/O端口 1 x SPI 1 x SPI 1 x USART/LIN 1 x USART/LIN 智能卡接口/IrDa 智能卡接口/IrDa 调制解调器控制 调制解调器控制
STM32 32位微控制器
/mcu
ST M3 LQ 2F1 F P 03x 10 0管 x 增 强 脚 图 型
GPIO重映射实例
USART2_CTS USART2_RTS USART2_TX USART2_RX USART2_CK USART1_TX USART1_RX
增强型 STM32F103
72MHz CPU 多达 20K字节 SRAM 2个12位 ADC(1s) 温度传感器 USB 2.0 全速 CAN 2.0B 专用 PWM 定时器
基本型 STM32F101
36MHz CPU 多达 16K字节 SRAM 1个12位 ADC (1s) 温度传感器
STM32 32位微控制器
RTC=实时时钟 AWU=RTC闹钟的自动唤醒功能 POR=上电复位,PDR=断电复位 PVD=可编程电压监测器
32kB-128kB 32kB-128kB 闪存控制器 闪存控制器
电源控制 电源控制 1.8V调压器 1.8V调压器 POR/PDR/PVD POR/PDR/PVD 晶体振荡器 晶体振荡器 32KHz + 4~16MHz 32KHz + 4~16MHz 内置阻容振荡器 内置阻容振荡器 32KHz + 8MHz 32KHz + 8MHz PLL PLL
STM32 32位微控制器

STM32开发板例程讲解之二:GPIO的描述和配置,GPIOIOTG例程精讲ch...

STM32开发板例程讲解之二:GPIO的描述和配置,GPIOIOTG例程精讲ch...
(二)专门的寄存器(GPIOx_BSRR 和GPIOx_BRR) 实现对GPIO 口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清 除I/O端口的操作不会被中断处理打断而造成误动作。 (三)每个GPIO 口都可以作为外部中断的输入,便于系统灵活设计。 (四)I/O口的输出模式下,有3种输出速度可选(2MHz 、10MHz 和50MHz) ,这有利于噪声控制。 (五)所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。 (六)大电流驱动能力:GPIO 口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD1.3V时,可以提供或吸收20mA电流。 (七)具有独立的唤醒I/O口。 (八)很多I/O口的复用功能可以重新映射。 (九)GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的 情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。
#if 0 // 配置所有未使用GPIO引脚为输入模式(浮空输入),这样可以降低功耗,并且提高器件的抗EMI/EMC 的性能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
//armfly :注释掉的原因是当代码在外部存储器运行时,GPIOD,E,F,G部分IO用于FSMC,因此对这些IO不能重置,否则导致取指异常 // GPIO_Init(GPIOD, &GPIO_InitStructure); // GPIO_Init(GPIOE, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

STM32GPIO相关寄存器

STM32GPIO相关寄存器

STM32 GPIO 相关寄存器每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR.数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。

另外,STM32的每个端口使用前都要将其时钟使能,STM32的GPIO的时钟统一挂接在APB2上,具体的使能寄存器为RCC_APB2ENR,该寄存器的第2位到第8位分别控制GPIOx(x=A,B,C,D,E,F,G)端口的时钟使能,当外设时钟没有启用时,程序不能读出外设寄存器的数值,如打开PORTA 时钟:RCC—>APB2ENR|=1〈<2; //使能PORTA时钟使能外设时钟后,GPIOA的十六位就可以按照设定的状态工作了,之后就是具体设置哪一位了以第八位为例即高位的首位,在GPIOx_CRH寄存器中进行设置,GPIOA的每一位都有该寄存器的四位来设定相应的参数,这四位中的高两位(CNF0,CNF1)设置GPIO的输入输出模式,低两位(MODE0,MODE1)是设置GPIO的输出频率,具体可以参考STM32参考手册。

GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原来的设置,同时屏蔽其它端口,不影响其它端口的设置GPIOA—〉CRH|=0X00000003;//PA8 推挽输出十六进制中的3 换成二进制 00 11 前两位00表示推挽输出,11代表输出频率50Mhz,若CRH|=0x4,表示模拟输入模式(ADC用),0x3表示推挽输出模式(作输出口用,50M速率),0x8表示上/下拉输入模式(做输入口用),0xB表示复用输出(使用IO口的第二功能,50M速率). 这是对一位的操作,当然也可以多位操作,因为STM32对GPIO操作必须是32位全字操作,设置完成后GPIOA的第8位就可以使用了之后给GPIOA—>ODR=0x xxxx xxxx送数据就行了。

STM32 GPIO教程

STM32 GPIO教程
通用输入输出端口 GPIO
系统外设
GPIO特性
最大封装(64引脚)上多达55个多功能双向GPIO(GPIO 引脚占有率相比STM32F1系列的80%更增加到86%) 几乎所有GPIO都是5V容忍(ADC引脚除外) GPIO分布在5个端口上:GPIOA[0~15]、GPIOB[0~15]、 GPIOC[0~15]、GPIOD[0~2]、GPIOF[4~7] 使用BSRR和BRR寄存器可以完成对引脚的原子置位和 复位操作 GPIO连在AHB总线,使得最高翻转速度高达12MHz 输出斜率可配置,高达50MHz 端口A和B上的引脚配置可通过LCKR寄存器锁定 55个引脚都可以配置成外部中断(可同时使能16个) 来把MCU从停止模式唤醒
I2C1端口支持1MHz超快速总线【FTf】
PB6/7 (I2C1_SCL/SDA) PB8/9 (I2C1_SCL/SDA)
其余端口都是5V容忍【FT】
10
Quiz
How many I/Os and ports there are in the STM32F0xx microcontroller ? ____________
可编程复用开关使得任意时刻只有一个外设连到 某个具体的GPIO。只有GPIOA和GPIOB有复用开关 某些外设功能还可以重映射到其他引脚,从而使 得能同时使用的外设数量更多
AF0 (SPI1_MISO) AF1 (TIM3_CH1) AF2 (TIM1_BKIN) Pin x (0…7)
AF7 (COMP1_OUT)
Output Driver
VSS
Push-Pull Open Drain
* In output mode, the I/O speed is configurable through OSPEEDR register: 2MHz, 10MHz or 50MHz

使用BSRR和BRR寄存器直接操作STM32的I-O端口

使用BSRR和BRR寄存器直接操作STM32的I-O端口

使用BSRR和BRR寄存器直接操作STM32的I/O端口STM32 的每个GPIO 端口都有两个特别的寄存器,GPIOx_BSRR 和GPIOx_BRR 寄存器,通过这两个寄存器可以直接对对应的GPIOx 端口置1 或置0。

GPIOx_BSRR 的高16 位中每一位对应端口x 的每个位,对高16 位中的某位置1 则端口x 的对应位被清0;寄存器中的位置0,则对它对应的位不起作用。

GPIOx_BSRR 的低16 位中每一位也对应端口x 的每个位,对低16 位中的某位置1 则它对应的端口位被置1;寄存器中的位置0,则对它对应的端口不起作用。

简单地说GPIOx_BSRR 的高16 位称作清除寄存器,而GPIOx_BSRR 的低16 位称作设置寄存器。

另一个寄存器GPIOx_BRR 只有低16 位有效,与GPIOx_BSRR 的高16 位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE 的16 个IO 都被设置成输出,而每次操作仅需要改变低8 位的数据而保持高8 位不变,假设新的8 位数据在变量Newdata 中,这个要求可以通过操作这两个寄存器实现,STM32 的固件库中有两个函数GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。

上述要求可以这样实现:GPIO_SetBits(GPIOE, Newdata & 0xff); GPIO_ResetBits(GPIOE, (~Newdata & 0xff));也可以直接操作这两个寄存器:GPIOE->BSRR = Newdata & 0xff;GPIOE->BRR = ~Newdata & 0xff;当然还可以一次完成对8 位的操作:GPIOE->BSRR = (Newdata & 0xff) | (~Newdata & 0xff) ODR = GPIOE->ODR & 0xff00 | Newdata;使用BRR 和BSRR 寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。

STM32单片机的知识点总结

STM32单片机的知识点总结

STM32系统结构STM32f10xxx系统结构内核IP从结构框图上看,Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:指令存储区总线(两条)、系统总线、私有外设总线。

有两条代码存储区总线负责对代码存储区(即 FLASH 外设)的访问,分别是 I-Code 总线和 D-Code 总线。

I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。

系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。

它们也在系统级存储区。

还有一个DMA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。

简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工。

处理器外设(内核之外的外设)从结构框图上看,STM32的外设有串口、定时器、IO口、FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。

寄存器什么是寄存器?寄存器是内置于各个IP外设中,是一种用于配置外设功能的存储器,并且有想对应的地址。

一切库的封装始于映射。

是不是看的眼都花了,如果进行寄存器开发,就需要怼地址以及对寄存器进行字节赋值,不仅效率低而且容易出错。

库的存在就是为了解决这类问题,将代码语义化。

语义化思想不仅仅是嵌入式有的,前端代码也在追求语义特性。

从点灯开始学习STM32内核库文件分析cor_cm3.h这个头文件实现了:1、内核结构体寄存器定义。

2、内核寄存器内存映射。

3、内存寄存器位定义。

跟处理器相关的头文件stm32f10x.h实现的功能一样,一个是针对内核的寄存器,一个是针对内核之外,即处理器的寄存器。

STM32的寄存器操作

STM32的寄存器操作

STM32的寄存器操作在STM32微控制器中,寄存器操作是一种直接访问硬件寄存器的方法,用于配置和控制微控制器的各个功能和模块。

首先,STM32微控制器的寄存器是内存中特定地址的单元。

每个寄存器都有特定的功能,如配置引脚、设置时钟、控制中断等。

寄存器通常是32位宽,但有些特殊功能的寄存器可能具有不同的宽度。

为了进行寄存器操作,首先需要包含相应的头文件,该头文件包含了寄存器的定义。

在STM32中,使用CMSIS(Cortex Microcontroller Software Interface Standard)作为中间件库,该库为开发人员提供了一组用于编程STM32的接口。

以下是使用寄存器操作的一些典型步骤:1. 引入头文件:根据所需的功能,引入相应的头文件。

例如,要访问GPIO(通用输入输出)模块的寄存器,需要包含"stm32f4xx_gpio.h"头文件。

3. 访问寄存器:使用指针访问寄存器。

通过将寄存器的基地址类型转换为指针类型,可以通过指针来访问寄存器的值。

例如,使用"(GPIO_TypeDef*)"类型转换将GPIOA_BASE转换为指向GPIO寄存器的指针。

4.配置寄存器:通过逐位或设置寄存器的相应位来配置寄存器。

寄存器的每个位都对应着不同的功能或配置选项。

可以使用逻辑或运算符(,)设置寄存器的位。

例如,要将GPIOA的第5位设置为输出模式,可以使用"(1<<5)"设置相应的位。

5.读取寄存器:通过读取寄存器的值来获取相应的状态或数据。

使用指针解引用寄存器指针来获取寄存器的当前值。

例如,可以使用"(GPIOA->IDR&(1<<5))"读取GPIOA的第5位。

6.写入寄存器:通过将要写入的值赋给寄存器来更改寄存器的状态或数据。

使用指针解引用寄存器指针并将新值赋给寄存器来写入新值。

STM32的GPIO的总结

STM32的GPIO的总结

CRL 端口配置低寄存器CRH 端口配置高寄存器IDR 端口输入数据寄存器ODR 端口输出数据寄存器BSRR 端口位设置/复位寄存器BRR 端口位复位寄存器LCKR端口配置锁定寄存器EVCR MAPR I/O EXTICR 事件控制寄存器复用重映射和调试配置寄存器外部中断路线0-15配置寄存器GPIO_DeInit将外设GPIOx寄存器重设为缺省值GPIO_AFIODeInit 将复用功能(重映射事件控制和EXTI设置)重设为缺省值 GPIO_Init 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 GPIO_StructInit把GPIO_InitStruct中的每一个参数按缺省值填入 GPIO_ReadInputDataBit 读取指定端口管脚的输入GPIO_ReadInputData GPIO_ReadOutputDataBit GPIO_ReadOutputData GPIO_SetBits GPIO_ResetBits GPIO_WriteBit GPIO_Write GPIO_PinLockConfig GPIO_EventOutputConfig GPIO_EventOutputCmd GPIO_PinRemapConfig读取指定的GPIO端口输入读取指定端口管脚的输出读取指定的GPIO端口输出设置指定的数据端口位清除指定的数据端口位设置或者清除指定的数据端口位向指定GPIO数据端口写入数据锁定GPIO管脚设置寄存器选择GPIO管脚用作事件输出使能或者失能事件输出改变指定管脚的映射GPIO_EXTILineConfig选择GPIO管脚用作外部中断路线函数8 种模式,可以通过编程选择:1. 浮空输入2. 带上拉输入3. 带下拉输入4. 摹拟输入5. 开漏输出——(此模式可实现 hotpower 说的真双向 IO)6. 推挽输出7. 复用功能的推挽输出8. 复用功能的开漏输出模式 7 和模式 8 需根据具体的复用功能决定。

STM32F习题与答案

STM32F习题与答案

这两种方式最好用(
)(填空 2,英文),这样程序更清晰,更容易维护。大体
上,你可以把extern 和 include 的区别当做是“零售”与“批发”的区别。include是批发,而
extern 则是零售。
答案:填空 1:头文件,填空 2:include
Led 选择题: 1. GPIO 的功能,简单说就是可以根据自己的需要去配置为输入或输出。但是在配置 GPIO
想要把 STM32 学透,光读 STM32 固件库是远远不够的。你还是要了解一下 STM32 的
原理,而这些原理了解了,你在进行固件库开发过程中才可能得心应手游刃有余。
答案:填空 1:固件库,填空 2:寄存器
2. ST 官方提供的 STM32 固件库包的结构中,Libraries 目录下面的 core_cm3.c 和 core_cm3.h
A. 1 B. 2 C. 3 D. 4
4. 不改变其他位的值的状况下,对某几个位进行设值。这个场景单片机开发中经常使用, 方法就是先对需要设置的位用( x )操作符进行清零操作,然后用( y )操作符设值。 正确的是( B )
A. x 是|,y 是& B. x 是&,y 是|
5. C 语言中( D )可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中, 提示编译器遇到此变量和函数时在其他模块中寻找其定义。
很多优点:当用到多个外部变量或函数的时候,extern:在每个用到的文件中需要用多个
extern 声明;include:只需要在在文件开始用include声明一次,其它使用这些变量的只需要包
含该头文件即可.include 后面跟的是( )(填空 1,中文),include头文件的变量在各自

stm32试题及答案

stm32试题及答案

STM32习题集一、选择题1.Cortex-M处理器采用的架构是( D )(A)v4T (B)v5TE (C)v6 (D)v7 2。

NVIC可用来表示优先权等级的位数可配置为是( D )(A)2 (B)4 (C)6 (D)83。

Cortex—M系列正式发布的版本是( A )(A)Cortex-M3 (B)Cortex-M4 (C)Cortex-M6 (D)Cortex—M8 4。

Cortex-M3的提供的流水线是( B )(A)2级(B)3级(C)5级(D)8级5.Cortex-M3的提供的单周期乘法位数是( C )(A)8 (B)16 (C)32 (D)646.STM32处理器的USB接口可达(B )(A)8Mbit/s (B)12Mbit/s (C)16Mbit/s (D)24Mbit/s 4.下面是Context-M3处理器代码执行方式的是( A )(A)特权方式(B)普通方式(C)Handle方式(D)Thread方式5。

下面是Context-M3处理器的工作模式的是( A )(A)Thread模式(B)Thumb模式(C)Thumb—2模式(D)Debug模式6.下列是Cortex – M3 处理器可以使用的堆栈的栈是( B )(A)线程栈(B)进程栈(C)多线程栈(D)空栈7。

Context – M3处理器的寄存器r14代表( B )(A)通用寄存器(B)链接寄存器(C)程序计数器(D)程序状态寄存器8.Handle模式一般使用( A )(A)Main_SP (B)Process_SP (C)Main_SP和Process_SP (D)Main_SP或Process_SP9。

Cortex – M3使用的存储器格式是( D )(A)小端格式(B)大端格式(C)小端或大端格式(D)没有正确答案10。

Cortex – M3的存储格式中专用外设总线区域可以使用( A )(A)小端格式(B)大端格式(C)小端或大端格式(D)没有正确答案11.每个通用I/O端口有()个32位的配置寄存器,()个32位的数据寄存器,()个32位的置位/复位寄存器,()个16位的复位寄存器,(B )个32位的锁定寄存器(A)2,1,2,1,1 (B)2,2,1,1,1 (C)2,2,2,1,1 (D)2,2,1,2,112。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。

GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。

GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。

简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。

另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata 中,
这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。

上述要求可以这样实现:
GPIO_SetBits(GPIOE, Newdata & 0xff);
GPIO_ResetBits(GPIOE, (~Newdata & 0xff));
也可以直接操作这两个寄存器:
GPIOE->BSRR = Newdata & 0xff;
GPIOE->BRR = ~Newdata & 0xff;
当然还可以一次完成对8位的操作:
GPIOE->BSRR = (Newdata & 0xff) | (~Newdata & 0xff)<<16;
从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

如果不是用BRR和BSRR寄存器,则上述要求就需要这样实现:
GPIOE->ODR = GPIOE->ODR & 0xff00 | Newdata;
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。

比如希望快速地对GPIOE的位7进行翻转,则可以:
GPIOE->BSRR = 0x80; // 置'1'
GPIOE->BRR = 0x80; // 置'0'
如果使用常规'读-改-写'的方法:
GPIOE->ODR = GPIOE->ODR | 0x80; // 置'1'
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置'0'
有人问是否BSRR的高16位是多余的,请看下面这个例子:
假如你想在一个操作中对GPIOE的位7置'1',位6置'0',则使用BSRR非常方便: GPIOE->BSRR = 0x4080;
如果没有BSRR的高16位,则要分2次操作,结果造成位7和位6的变化不同步! GPIOE->BSRR = 0x80;
GPIOE->BRR = 0x40;
分享 0
顶。

相关文档
最新文档