[STM32]跑马灯实验

前言:根据正点原子战舰V3板上资源和光盘资源进行学习。(内容来自第13、14、15讲,前面的内容略过,会在以后的内容中体现)

代码逻辑流程:
使能IO口时钟
初始化IO口模式

//主要介绍寄存器版本的流程,最后附上库函数版本和位操作版本的代码

事先准备

1.复制A盘-4.程序源码-标准历程 寄存器版本

2.打开上述文件-USER-keil工程文件-右键文件夹名字-manage project items-Groups中添加“HARDWARE”

3.在‘1’中文件中新建文件夹“HARDWARE”

4.KEIL中新建两个文件为“LED.c”“LED.h”,保存至“HARDWARE”文件夹

5.通过manage将.c添加至HARDWARE,通过魔术棒 - C/C++ - “include path”- 将.h添加到路径中

初始化要用到的两个端口的计时器

B和E,通过“A盘” - “STM32参考资料” - “STM32中文参考手册” - 6.3.7查看外设时钟使能寄存器:

	RCC->APB2ENR |= 1 << 3;
	RCC->APB2ENR |= 1 << 6;

RCC为32的时钟控制器,APB2ENR为外设时钟使能寄存器

配置GPIO寄存器

	//GPIOB.5
	GPIOB->CRL &= 0xFF0FFFFF;	//AND
	GPIOB->CRL |= 0x00300000;	//OR
	GPIOB->ODR |= 1<<5;
	
	//GPIOE.5
	GPIOE->CRL &= 0xFF0FFFFF;	//AND
	GPIOE->CRL |= 0x00300000;	//OR	
	GPIOE->ODR |= 1<<5;

CRL为端口配置低寄存器,每一个hex表示一个寄存器,ODR为端口输出数据寄存器,将第五位置一为初始化,B5E5在硬件上连接了两个灯,低电平有效。

烧录,正常


附上寄存器版本全部代码

//led.c
#include "led.h"
#include "stm32f10x.h"

void LED_Init(void){

	RCC->APB2ENR |= 1 << 3;
	RCC->APB2ENR |= 1 << 6;
	
	//GPIOB.5
	GPIOB->CRL &= 0xFF0FFFFF;	//AND
	GPIOB->CRL |= 0x00300000;	//OR
	GPIOB->ODR |= 1<<5;
	
	//GPIOE.5
	GPIOE->CRL &= 0xFF0FFFFF;	//AND
	GPIOE->CRL |= 0x00300000;	//OR	
	GPIOE->ODR |= 1<<5;
}
//led.h
#ifndef __LED_H
#define __LED_H

void LED_Init(void);

#endif
//main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"


int main()
{
	delay_init();
	LED_Init();
	while(1){
		GPIOB->ODR |= 1<<5;
		GPIOE->ODR |= 1<<5;
		delay_ms(500);
		
		GPIOB->ODR = ~(1<<5);
		GPIOE->ODR = ~(1<<5);
		delay_ms(500);
	}
	
}

位操作实现main代码如下

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int main(void)
{
	delay_init();
	LED_Init();
	while(1){
		PBout(5) = 1;
		PEout(5) = 0;
		delay_ms(500);
		PBout(5) = 0;
		PEout(5) = 1;		
		delay_ms(500);
	}
}

库函数版本如下

//led.c
#include "led.h"
#include "stm32f10x.h"

void LED_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
//main.c
#include"stm32f10x.h"
#include"led.h"
#include"delay.h"
int main(void)
{
	delay_init();
	LED_Init();
	while(1){
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
		GPIO_SetBits(GPIOE, GPIO_Pin_5);
		delay_ms(500);
		
		
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
		GPIO_ResetBits(GPIOE, GPIO_Pin_5);
		delay_ms(500);

	}
	
	
}

我们看到库函数版本的初始化函数内容很多,每个口有六条语句,分别为:

0.初始化GPIO口结构体;1.设置时钟使能;2.设置输出模式;3.设置输出口;4.设置输出速度;5.将1~4中设置的参数初始化到GPIO口中;6.通过setbits函数,将指定的口置一。


发布了12 篇原创文章 · 获赞 4 · 访问量 2312

猜你喜欢

转载自blog.csdn.net/m0_37495408/article/details/79347611