【STM32-野火】(三)使用寄存器点亮LED
(一).由于stm32比51要更加高级,所以配置时不仅有输入还有输出,此时由配置高低寄存器决定端口,要配合材料看。 对应上图写配置GPIO为输出的代码 (操作寄存器内存点亮LED)。 代码如下,操作流程: 1.首先打开相应GPIO口的复位时钟,只有在时钟工作的时候,配置的相应GPIO才会工作
2.其次配置GPIO,在手册中找到对应的真实地址,将其配置为1(意思是配置IO口为输出,由于既有输入也有输出,所以在用时一定要配置)
3.最后再将LED所在ODR配置为0,使其点亮 所以即使没有第三步也可点亮灯,因为复位时自动清零,也就是相当于置0了
(二)拓展: 置位(符号):|= 清除(符号):&= (三)GPIO功能框图讲解,IO口与芯片内部工作原理
- 推挽输出(P-Mos管负责)
由上图可知:如果ODR输入为0,反向为1,上面截止,下面会导通,输出为0V。(上通为推(灌电流),下通为挽(拉电流))
2.开漏输出**(不接上拉电阻时,只能输出低电平,N-MOS负责)**
- 输入
综上: 代码(寄存器控制): .h文件应为:(从大地址推小地址,一步步找到要控制的寄存器和GPIO外设)
main函数里应为: 把清零操作注释掉,灯亮。 补充:还可以使用BSRR寄存器控制LED灯 .c文件
#include "stm32f10x.h"
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
int main(void)
{
while(1)
{
RCC_APB2ENR |=((1)<<3);
GPIO_B_CRL |=((1)<<(4*1));
GPIO_B_BSRR &=~(1<<1);
GPIO_B_BSRR |=(1<<1);
}
}
.h文件
#define PERIPH_BASE ((unsigned int)0X40000000)
#define ABP1_BASE PERIPH_BASE
#define ABP2_BASE (PERIPH_BASE+0X10000)
#define AHB_BASE (PERIPH_BASE+0X20000)
#define RCC_BASE (AHB_BASE+0X1000)
#define GPIO_B_BASE (ABP2_BASE+0X0C00)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0X18)
#define GPIO_B_CRL *(unsigned int*)(GPIO_B_BASE+0X00)
#define GPIO_B_CRH *(unsigned int*)(GPIO_B_BASE+0X04)
#define GPIO_B_ODR *(unsigned int*)(GPIO_B_BASE+0X0C)
#define GPIO_B_BSRR *(unsigned int*)(GPIO_B_BASE+0X10)
|