0、从GPIO_TypeDef结构体的定义中STM32F103C8T6的GPIO有7个寄存器:
typedef struct
{
_IO uint32_t CRL; //低8位端口配置寄存器(配置工作模式,输出速度)
_IO uint32_t CRH; //高8位端口配置寄存器(配置工作模式,输出速度)
_IO uint32_t IDR; //端口输入数据寄存器(用于判断IO引脚的电平)
_IO uint32_t ODR; //端口输出数据寄存器(用于设置IO引脚输出的电平)
_IO uint32_t BSRR;//端口位设置,清除寄存器(设置ODR寄存器的值)
_IO uint32_t BRR; //F4之后没有这个寄存器,考虑代码兼容性的话不建议使用
_IO uint32_t LCKR;//配置锁定,用的不多
}GPIO_TypeDef;
1、CRL(Configuration Register Low)
用于配置GPIO端口的低8位(即引脚0到7)的模式和特性,每个引脚占用4个位,配置8个引脚。
CRL寄存器的结构
- 示例:用配置寄存器的方法配置PA0为输出模式(通用推挽输出)
#include"stm32f10x.h"
int main(void)
{
//开启GPIOA的时钟
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
//直接修改CRL寄存器来配置PA0
//每个引脚占4位,所以PA0的配置位于CRL的低4位
//设置为输出模式(01:10MHz General Purpose Output Push-Pull
GPIOA->CRL&=~(0x0F<<(0*4));/*清除PA0原来的配置,~相当于把00001111倒写为11110000。
<<为左移操作符,0*4=0,表示左移0位,如果是配置的是PA1,则要改为1*4=4,左移4位*/
GPIOA->CRL|=(0x03<<(0*4));//设置PA0为输出模式(0x03表示10MHz General Purpose Output push-pull)
/*详细说明1
结合CRL寄存器结构表来看,每4位分2组2位,分别为CNF和MODE。
其中CNF取值:
1、当MODE=00时:
00 模拟输入模式
01 浮空输入模式
10 上拉/下拉输入模式
11 保留
2、当MODE>00时:
00 通用推挽输出模式
01 通用开漏输出模式
10 复用功能推挽输出模式
11 复用功能开漏输出模式
其中MODE取值:
00 输入模式(复位后的状态)
01 输出模式,最大速度10MHz
10 输出模式,最大速度2MHz
11 输出模式,最大速度50MHz
*/
/*详细说明2
与操作&=:只有两个相应的二进制位都为1时,结果才为1
11111111(reg)
& 11110000(mask)
----------11110000(result)
或操作|=:只有两个相应的二进制位中有一个为1,结果就为1
11110000(reg)
| 00001111(mask)
----------11111111(result)
*/
//设置PA0为高电平
GPIO

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



