记跑马灯实验(寄存器版本)

话不多说直接开始:

先编译一遍

老规矩led.h:

#ifndef __LED_H//这里是if no define,就是看有没有被定义,如果没有就往下。作用是避免头文件被重复的定义。
#define __LED_H//这里就定义一下。

void _LED_Init(void);//初始化这个函数


#endif//这里下面再加两个回车可以消去警告

然后led.c:

1.两个函数:

GPIOx_CRL    是用来设置端口配置低寄存器,即0-7位

GPIOx_CRH   是用来设置端口配置高寄存器,即8-15位

本例需要设置PB5和PE5,所以使用GPIOx_CRL函数。

2.每个IO口用4个位(高位和低位)来控制,并且均为16进制。高低位的不同数值对应着不同的功能,一共有32个位来控制8个IO口。原理图如下(图来自正点原子教学视频,侵删):

故本例中,把第五位设置成0011(在16进制中是3)代表:把第五个IO口用通用推挽输出模式,50MHz的速度输出。

这里的“->”是结构体指针

#include"led.h"//引入头文件
#include"stm32f10x.h"//引入库函数的头文件(不然人家不认识RCC)
void LED_Init(void){

RCC->APB2ENR|=1<<3;//这里的“|=”是或运算的意思,“1<<3”是指第三位(0123)进行运算,其他位不变。
RCC->APB2ENR|=1<<6;//以上两行代码是使能时钟

	
GPIOB->CRL&=0xFF0FFFFF;//这里是把第五位进行和0的与运算,即把第五个IO口的四个位清0,其他不变就用F
GPIOB->CRL|=0x00300000;//这里清0之后的或运算,0011在16进制中是3,故第五位和3进行或运算
GPIOB->ODR|=1<<5;//这里是把第五位IO口设置为高电平,让灯熄灭
	
	
  GPIOE->CRL&=0xFF0FFFFF;
  GPIOE->CRL|=0x00300000;
  GPIOE->ODR|=1<<5;//这两行就是设置PE5,原理同上咯
	

}

1.别忘了要设置路径

2.把文本文档.c和.h加到工程里面

主函数main:

#include "stm32f10x.h"//先包含顶层头文件
#include "delay.h"//引用delay文件
#include "led.h"
int main(void)
{
    delay_init();
    LED_Init();//调用函数
	while(1){  //while(1)就是死循环
    GPIOB->ODR|=1<<5;
	GPIOE->ODR|=1<<5;//这两行设置IO口高电平,就是让他灭
	delay_ms(500);//延时500ms
		
	GPIOB->ODR=~(1<<5);//上面两行代码,使得第五位现在是1,所以这里使用非运算,使其变为0。再和寄存器进行与运算,第五位变成了0,而其他位不变。
	GPIOE->ODR=~(1<<5);
	delay_ms(500);
	
	}

}

本文中作为小白感觉比较难理解的就是最后那个非运算的地方。

以上代码全部来自正点原子教学视频。

读者们要是有发现错误的地方欢迎斧正,期待有大佬带带本菜狗。(虽然应该不会有什么读者哈哈哈)

最后感谢假发和好靓指导我写博客要用代码段。路漫漫其修远兮,大家如果有看到错误的和可以改进的地方一定要多多指点我~

感谢阅读,掰掰!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值