作业:利用寄存器方式,点亮led3小灯


1.通过观察原理图, led3, 是PA8, 一段接3.3v, 一端接io口, 所以PA8端口输出低电平, 就可以让小灯点亮了
2.利用keil创建最小工程
3.按照库函数的配置方式

#include "stdint.h"
#include "stm32f10x.h" // Device header
int main()
{
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置端口输出低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_8, RESET);
GPIO_InitTypeDef GPIOinit_struct;
//配置io口为推挽输出模式
GPIOinit_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOinit_struct.GPIO_Pin = GPIO_Pin_8;
GPIOinit_struct.GPIO_Speed = GPIO_Speed_50MHz;
//结构体内写入配置
GPIO_Init(GPIOA, &GPIOinit_struct);
//死循环卡住led状态
while(1)
{
}
}
4.烧录代码, 直接可以点亮led3
5.下面我们采用查看手册, 然后寄存器的方式, 点亮PA8
(1)先打开GPIOA 时钟

(2)电脑开始界面搜索计算器, 打开程序员模式,得到, 时钟控制位
(3)打开对应的时钟
RCC->APB2ENR = 0x04;

也可以使用移位操作
RCC->APB2ENR |= 1 << 2;
代表, 从低到高的第3个数, 置成1, 其他位置不变, 所以我们进行并,
第三个数, 1 | 上 任何数, 都是1, 所以就可以把第3位置1, 并且其他位都是0, 0|上其他任何数,都是其本身,不影响其他位置.
(4)下面配置PA8端口为, 通用推挽输出寄存器
(5)我们打开程序员计算器, 进行计算
GPIOA->CRH = 0x03;
同样也可以通过异或运算
GPIOA->CRH &= ~(1 << 3);
GPIOA->CRH &= ~(1 << 2);
GPIOA->CRH |= (1 << 1);
GPIOA->CRH |= (1 << 0);
分别是0011
所以低四位, 置0, 我们就用& , 1 左移 3位, 锁定第四位, 然后我们要与上0, 其他位不变, 所以要进行取反, GPIOA->CRH &= ~(1 << 3)
同理低三位也是,
低两位, 我们要变成1, 所以要 | , 我们先锁定低2位, 1左移1位, 然后 对应的位 | 上1 , 强制变成 1
最后一位同理
(6)配置端口为低电平
GPIOA->ODR = 0x00;
同理也可以
GPIOA->ODR &= ~(1 << 8);
低八位, 强制变成0, 所以1先左移8位, 锁定了PA8的第八位, 然后我们要让这一位变成0, 低电平, 其他位不影响, 所以要 与& 上 0 ,
我们就对 这个数进行取反, 取反后, 第八位对应的是 0,其他位对应的是1, 然后我们就可以进行 & , 其他位不影响, 第八位变成 0
main.c完整代码
#include "stdint.h"
#include "stm32f10x.h" // Device header
int main()
{
/*版本1 库函数 操作*/
//(1)打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_WriteBit(GPIOA, GPIO_Pin_8, RESET);
//配置io口
GPIO_InitTypeDef GPIOinit_struct;
//配置io口为推挽输出模式
GPIOinit_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOinit_struct.GPIO_Pin = GPIO_Pin_8;
GPIOinit_struct.GPIO_Speed = GPIO_Speed_50MHz;
//结构体内写入配置
GPIO_Init(GPIOA, &GPIOinit_struct);
/*版本2 寄存器操作 */
//(1)打开时钟
RCC->APB2ENR = 0x04; //直接赋值方式
//RCC->APB2ENR |= 1 << 2; //执行移位操作 (二者取1)
//(2)配置io口为推挽输出模式
RCC->APB2ENR = 0x04; //直接赋值方式
GPIOA->CRH &= ~(1 << 3); //执行移位操作 (二者取1)
GPIOA->CRH &= ~(1 << 2);
GPIOA->CRH |= (1 << 1);
GPIOA->CRH |= (1 << 0);
//(3)配置端口位低电平
//GPIOA->ODR = 0x100; //直接赋值方式
GPIOA->ODR &= ~(1 << 8); //建议使用移位操作,不影响其他位置
//死循环卡住led状态
while(1)
{
}
}
(7)烧录下载, 观察现象, 小灯点亮

(8)本工程源文件
https://wwyz.lanzoul.com/iRkY92fjwqyj