话不多说直接开始:
先编译一遍
老规矩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);
}
}
本文中作为小白感觉比较难理解的就是最后那个非运算的地方。
以上代码全部来自正点原子教学视频。
读者们要是有发现错误的地方欢迎斧正,期待有大佬带带本菜狗。(虽然应该不会有什么读者哈哈哈)
最后感谢假发和好靓指导我写博客要用代码段。路漫漫其修远兮,大家如果有看到错误的和可以改进的地方一定要多多指点我~
感谢阅读,掰掰!