一个例子让你学会如何用STM32寄存器配置IO口

#define PA8_Out_PP { GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=(u32)0x01<<(0*4); }帮你解释如何用寄存器配置IO口!

首先来看一下了解一下IO口
stm32共七组IO口(A—G),每组16个IO口(0—15)
stm32的IO口有8种模式:
1、 输入浮空
2、 输入上拉
3、 输入下拉
4、 模拟输入
5、 开漏输出
6、 推挽输出
7、 推挽式复用功能
8、 开漏复用功能

常用的 IO 端口寄存器只有 4 个: CRL、 CRH、 IDR、 ODR
CRL :低8位(7~0)
在这里插入图片描述
CRH: 高八位(8~15)
在这里插入图片描述
ODR : ODR 是一个端口输出数据寄存器也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。(配置电平输出的时候用)

IDR : 只用了低 16 位。该寄存器为只读寄存器,并且只能以
16 位的形式读出。

来通过一个例子来学习 例如 我要将 PC11 配置为上拉输入;PC12配置为推挽输出且输出速度为50MHZ
首先通过查下表
在这里插入图片描述
在这里插入图片描述
PC11上拉输入–>>CNF1,CNF0分别为1,0;MODE1,MODE0为0,0
即1000化为十进制为8
PC12推挽输出速度为50MHZ–>>CNF1,CNF0分别为0,0;MODE1,MODE2为1,1即0011化为十进制为3
配置代码如下
11,12属于高8位所以用CRH(15~8)

GPIOC->CRH&=0XFFF00FFF; //(从右到左第11位和12位)清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOC->CRH|=0X00038000; //PC11 输入(8), PC12 输出(3)
GPIOC->ODR=1<<11; //PC11 1-上拉   0-下拉  这儿就要用上ODR了

有时在头文件中可以这样

//定义PC12_OUT_PP为推挽输出
#define PC12_OUT_PP {GPIOC->CRH&=0XFFF0FFFF;GPIOC->CRH|=u(32)0x3<<(4*4)}
//0x3表示十进制数3即推挽输出{0011(**二进制**)}
//<<(4*4)表示向左移4个F得出0011(0右边的有几个F就移几个),一个F代表4位即4*4=16位
//定义PC8_up_in为上拉输入
#define PC8_up_in {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=u(32)0x8<<(0*4)}
//0x8表示十进制数8即推挽输出{1000(**二进制**)}
//<<(0*4)表示向左移0个F得出1000(0右边的有几个F就移几个),一个F代表4位即0*4=0位

就OK啦!!!

如有错,请指正!

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32微控制器上,可以使用寄存器操作来控制IO引脚。 首先,需要了解GPIO寄存器的基本结构。在STM32系列中,每个GPIO都有一组寄存器来控制对应的引脚。其中包括GPIOx_MODER(模式寄存器)、GPIOx_OTYPER(输出类型寄存器)、GPIOx_OSPEEDR(输出速度寄存器)、GPIOx_PUPDR(上拉/下拉寄存器)以及GPIOx_ODR(数据寄存器)等。 下面是一个简单的例子,展示如何使用寄存器操作来设置一个引脚为输出并设置输出高电平: ```c #include "stm32f4xx.h" // 定义要操作的引脚 #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOA int main(void) { // 使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置引脚为输出模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = LED_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(LED_PORT, &GPIO_InitStruct); // 设置引脚输出高电平 GPIO_SetBits(LED_PORT, LED_PIN); while (1) { // 在这里可以进行其他操作 } } ``` 上述示例中,使用了STM32的HAL库函数来进行寄存器配置和操作。首先使用`RCC_AHB1PeriphClockCmd()`函数使能GPIOA时钟,然后使用`GPIO_Init()`函数配置引脚为输出模式,并使用`GPIO_SetBits()`函数将引脚输出高电平。 需要注意的是,具体的寄存器和操作方式可能会因不同的STM32系列而有所不同,请根据自己使用的具体型号和参考相关技术资料来进行寄存器操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值