内容纲要
1.先查看原理图,找到想要实现亮灯的引脚。此处PC 代表GPIOC ; PF 代表 GPIOF 。约定俗成,包括RA RB 都代表GPIOA GPIOB等等等等。。。
根据需要打开的引脚,找到GPIOF 的寄存器映射地址,通过控制地址保存的参数来实现对GPIO的电平控制
- 由于需要控制GPIO口,所以我们应该查找芯片 datasheet 的 GPIO 的 ODR (端口输出寄存器)部分,
Reset value:0x0000 0000
代表默认值,当时钟使能时,端口会使 0x0000 0000 ,
此图片拿ODR6 来做例子,因为控制的红色的灯是PF6
//1.先修改GPIOI的对应的寄存器为高电平。
*(unsigned int *)(0x40021400 + 0x14) |= (1<<6);
//2.将GPIOI设置为想要的电平。
*(unsigned int *)(0x40021400 + 0x14) &= ~(1<<6);
2.设置该GPIO 的端口模式寄存器使能。
//GPIO的寄存器模式需要打开
*(unsigned int *)(0x40021400 + 0x00) &= ~(0x03 << 2*6);
*(unsigned int *)(0x40021400 + 0x00) |= (1<<2*6);
上方代码位偏移为 6 是因为以PF6 为例,GPIO为GPIOF 位偏移为6
RCC时钟控制。
//时钟设置。RCC
*(unsigned int *)(0x40023800 + 0x30) |= (1<<5);
//////////////////////////////////////////////////////////练习代码//////////////////////////////////////////////
//leg_reg.h
//reg.c的头文件,用来存放寄存器的地址
#define GPIO_AHB1 *(unsigned int *)(0x40023800 +0x30)
#define GPIOC_MODE *(unsigned int *)(0x40020800)
#define GPIO_ODR3 *(unsigned int*)(0x40020800 + 0x3)
//leg_reg.c
#include "led_reg.h"
int main(){
//点亮蓝色的灯 PC3
#if 1
//2.需要开启AHB1的时钟
GPIO_AHB1 |= (1<<2);
//1.需要使能GPIOC的端口模式 这里注意:我在这里踩过坑了。
GPIOC_MODE |= (0x03<<2*3);
GPIOC_MODE &= ~ (2<<2*3);
//3.GPIOC_ODR3
//将需要设置的寄存器地址通过 按位或 置为1,方便后面用 按位与 进行设置为想要的。
GPIO_ODR3 |= (1<<3);
while(1)
{
//设置为要放置的值
GPIO_ODR3 |= (1<<3);
Delay(0x0fffff);
GPIO_ODR3 &=~ (1<<3);
Delay(0x0fffff);
}
}
void SystemInit(){
/* 重写汇编语言文件中的SystemInit 初始化函数 */
//不过函数体不用写
}