根据提供的信息,我们可以深入探讨STM32微控制器中的寄存器控制及GPIO配置的相关知识点。 ### STM32寄存器控制表 STM32微控制器是基于ARM Cortex-M内核的高性能、低功耗微控制器系列。在STM32中,通过访问特定的寄存器来实现对芯片硬件资源的控制。对于GPIO(General Purpose Input Output,通用输入输出)端口来说,主要涉及到的寄存器有:CRL、CRH、ODR等。 ### GPIO配置 #### 寄存器介绍 - **CRL(Configuration Register Low)** 和 **CRH(Configuration Register High)**: 这两个寄存器用于配置GPIO引脚的功能模式。每个GPIO端口都有一个CRL和一个CRH寄存器,它们分别控制端口的低8位和高8位引脚。 - **ODR(Output Data Register)**: 该寄存器用于设置GPIO引脚的输出状态。 #### 配置模式 - **输入模式** - **模拟输入**: 定义为模拟输入时,GPIO引脚作为模拟输入使用,此时数字输入功能不可用。 - **浮空输入**: 在这种模式下,当GPIO引脚未被外部连接时,其内部没有上拉或下拉电阻。因此,在没有外部信号驱动的情况下,读取该引脚的状态是不确定的。 - **带上下拉电阻的输入**: 选择这种模式后,可以配置内部上拉或下拉电阻。 - **输出模式** - **推挽输出**: 当配置为推挽输出时,GPIO引脚能够输出高电平或低电平。 - **开漏输出**: 开漏输出模式下,引脚只能输出低电平或高阻态,通常需要与外部上拉电阻配合使用才能输出高电平。 - **复用推挽输出**: 这种模式将GPIO引脚配置为复用功能,同时支持推挽输出。 - **复用开漏输出**: 同样地,这种模式将GPIO引脚配置为复用功能,但采用的是开漏输出方式。 #### 示例代码分析 ```c #defineinput_Analog 0x00 //模拟输入模式 #defineinput_floating0x04 //浮空输入模式 #defineinput_pull 0x08 //带上下拉电阻的输入模式 #defineoutput_push_pull 0x03 //推挽输出模式 #defineoutput_push_drain 0x07 //开漏输出模式 #defineoutput_function_push_pull0x0b //复用推挽输出模式 #defineoutput_function_push_drain0x0f //复用开漏输出模式 ``` 上面定义了一系列宏,用于简化GPIO配置模式的选择。例如,`input_Analog` 定义了模拟输入模式,而 `output_push_pull` 则定义了推挽输出模式。 接下来的代码片段展示了如何使用这些宏来配置GPIO引脚: ```c voidKEY_GPIO_Init(void) { u8DB,DBL; // 配置GPIOA端口的CRH寄存器 GPIOA->CRH&=0XFFFF0FFF; //GPIOA->CRH|=0X00008000;//PA11为浮空输入 GPIOA->CRH|=0X00003000;//PA11为浮空输入(无上拉下拉,4模式保留) // 设置GPIOA端口的其他引脚 for (DB = 0; DB <= 8; DB++) { if(DB > 7) DBL = 8; else DBL = 0; GPIOA->CRH&=(~(0x0f<<((DB-DBL)*4))); if (DB == 8) { GPIOA->CRH|=output_push_pull<<((DB-DBL)*4); // PA8配置为推挽输出 } else { GPIOA->CRH|=input_floating<<((DB-DBL)*4);// 其他引脚配置为浮空输入 } GPIOA->ODR|=1<<DB; // 设置对应引脚为输出高电平 } } ``` 在这段代码中,`KEY_GPIO_Init` 函数负责初始化GPIOA端口的配置。可以看到,除了PA8被配置为推挽输出模式外,其余引脚均被配置为浮空输入模式。 ### 综合应用实例 此外,还有一个简单的示例函数 `SPK(void)`,用于控制扬声器的开关。该函数通过改变变量 `BZ` 的值来控制扬声器的开启与关闭,并使用 `delay_ms` 函数实现延时操作。这里假设 `BZ` 已经被配置为控制扬声器的GPIO引脚,并且已经定义了 `SPK_ON` 和 `SPK_OFF` 宏。 通过以上分析可以看出,STM32寄存器控制和GPIO配置是实现微控制器功能的基础。通过对寄存器的合理设置,可以灵活地控制GPIO引脚的工作模式,从而满足各种应用场景的需求。
#define input_floating 0x04 //浮空输入模式(复位后的状态)
#define input_pull 0x08 //上拉/下拉输入模式
#define output_push_pull 0x03 //通用推挽输出模式
#define output_push_drain 0x07 //通用开漏输出模式
#define output_function_push_pull 0x0b //复用功能推挽输出模式
#define output_function_push_drain 0x0f //复用功能开漏输出模式
#define BZ PAout(8)//喇叭输出控制
#define SPK_ON 1
#define SPK_OFF 0
void KEY_GPIO_Init(void)
{
u8 DB,DBL;
/*
GPIOA->CRH&=0XFFFF0FFF;
//GPIOA->CRH|=0X00008000; //PA11设置成输入
GPIOA->CRH|=0X00003000; //PA11设置成输出 (内部上拉电阻,4种输出模式,都可以检测到按键输入)
GPIOA->ODR|=1<<11; //PA11上拉
*/
//设置成输出 (内部上拉电阻,4种输出模式,都可以检测到按键输入)
DB=0;
if(DB>7)DBL=8;else DBL=0;
GPIOA->CRH&=(~(0x0f<<((DB-DBL)*4)));
GPIOA->CRH|=input_floating<<((DB-DBL)*4); //设置成上拉/下拉输入模式
GPIOA->ODR|=1<<DB; //上拉
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助