利用寄存器操作实现一个LED的点亮
首先对于操作一个i/o口有三个要点:
①使能I/O口时钟;
②初始化I/O口模式;
③操作I/O口输出高低电平;
1.首先建立LED的 .C 和 .H文件, .C文件在项目下利用manage project item 添加至项目中;.h文件点击魔术棒(options for target)中C/C++ 中 include paths 添加进去。
2.其中.h头文件为
#ifndef __LEDR_H #define __LEDR_H void ledresiger_Init (void); #endif3. .C文件为
#include "stm32f10x.h" #include "ledresiger.h" void ledresiger_Init (void) { RCC->APB2ENR |= 1<<3; //时钟使能 //设置io口模式 GPIOB->CRH &= 0xFFF0FFFF; //先把1个位清零 GPIOB->CRH |= 0x00030000; //把四个位变成0011 就是3 //先输出高电平 GPIOB->ODR |= 1<<12; //GPIO.12 }
其中注意要include 之前的头文件;
①时钟使能
RCC->APB2ENR 这里是引用RCC中的成员变量 怎么对寄存器操作呢?
首先在中文技术参考手册中找到: 6.3.7 APB2 外设时钟使能寄存器(RCC_APB2ENR)
由板子的电路图可以知道其控制LED 的I/O口是 PB12,即 GPI0B类型
由手册可知 端口B的I/O口使能是位3;于是就是将RCC->APB2ENR 的第三位变为1其它位不动,
那么就可用位运算, 1<<3 表示将1向左移3位 就是 ....000000100
再与RCC->APB2ENR中的进行或运算,就使得第三位变为1;
②设置IO口模式
在技术手册中找到 GPIO寄存器描述。其中有两项
低寄存器表示 1-7 的IO口 高寄存器表示 8-15的I/O口 如我们的IO是 PB12 ,就要选择高寄存器配置
其中一个I/O口控制4个位那么下图中表示就是8-15 I/O的配置
在手册中写明了 通用推挽输出模式为00 ,最大速度50MHZ 为11 那么 第12个口的四位应该是0011 也就是3;
GPIOB->CRH &= 0xFFF0FFFF;
以上是将12口的4位清0 ; 我们所需的IO口是12 前面有3个:15 14 13 所以 OxFFF 有三个F 后面0便是我们要清0意思,再后面4个F就是代表 11 10 9 8 4个口;
GPIOB->CRH |= 0x00030000;
这时候12口的4位是0 0 0 0 要变成 0 0 1 1 只需要跟 0 0 1 1 或运算就行了;也就是12口位置那是3;
③ 要设置LED先关闭就是给予其高电平
GPIOB->ODR |= 1<<12;
也就是要I/O口输出一个高电平;在手册中找到端口输出寄存器
也就是将12口输出高电平就是 1<<12;
④之后就是在主函数中调用这个LED初始化函数即可。