一个例子---直接操作地址控制GPIOB5输出低电平

用一个直接操作内存地址的方式控制GPIOB5为低电平,需要以下3个步骤:

*(unsigned int *)0x40021018 |= ( (1) << 3 );

*(unsigned int *)0x40010c00 |= ( (1) << (4*5 ) );

*(unsigned int *)0x40010c0c &= ~( (1) << 5 );

 

1.使能外设时钟。通过查询说明文档,复位和时钟控制(RCC)挂载在AHB总线上,起始地址为0x40021000, APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址0x18,则 APB2外设时钟地址0x40021018,通过查表发现RCC_APB2ENR位3为1时IO端口B时钟开启。编程中通过如下语句*(unsigned int *)0x40021018 |= ( (1) << 3 );实现。|=又叫置位运算,将特定的位设置为1,例如这条语句即是将1左移三位,然后与RCC_APB2ENR运算,即将RCC_APB2ENR寄存器的第三位置1.

一个例子---直接操作地址控制GPIOB5输出低电平

一个例子---直接操作地址控制GPIOB5输出低电平

一个例子---直接操作地址控制GPIOB5输出低电平

 

 

 

2.配置端口配置低寄存器GPIOB_CRL,查表知GPIO端口B的起始地址是0x40010c00,GPIOB_CRL偏移地址为0x00,则GPIOB_CRL地址为0x40010c00,此处设置为推挽输出,最大速度10MHz.则相应的位设置为00_01,此处我们设置的是5号端口,编程时使用*(unsigned int *)0x40010c00 |= ( (1) << (4*5 ) );来实现,此处的(4*5)如何理解?因为GPIO_CRL寄存器中每四位控制一个端口,这里控制5号端口,则......

一个例子---直接操作地址控制GPIOB5输出低电平

一个例子---直接操作地址控制GPIOB5输出低电平

一个例子---直接操作地址控制GPIOB5输出低电平

 

 

 

3.配置端口输出数据寄存器GPIOB_ODR,查表知GPIO端口B的起始地址是0x40010c00,偏移地址0ch,则GPIOB_ODR地址为0x40010c00 +och=0x40010c0c,编程时通过*(unsigned int *)0x40010c0c &= ~( (1) << 5 );实现。将ODR寄存器位5清0.

一个例子---直接操作地址控制GPIOB5输出低电平

一个例子---直接操作地址控制GPIOB5输出低电平

 

 

 

 

 

 

一个例子---直接操作地址控制GPIOB5输出低电平