STM32寄存器和标准库点流水灯

目录

一.使用寄存器方式点亮流水灯

1.实验器材

2.实验思路

3.1程序代码

3.2运行效果

4.1加入P13管脚

(1)程序代码

(2)运行效果

(3)实验图思考

(4)改进代码

(5)改进后运行效果

二.使用标准库方式点亮流水灯

1.复制相关库文件到文件夹中

(1)如同添加文件夹core,lib,obj

(2)下载库函数文件

2.添加文件到工程

(1)core中

(2)lib中

(3)obj中

3.配置工程

(1)添加文件到工程

(2)选择OutPut路径,选择自己的obj文件,生成hex文件

(3)配置全局宏量

4.程序代码

5.运行效果


一.使用寄存器方式点亮流水灯

1.实验器材

单片机:stm32f103C8T6
TTL转接口
三个红黄绿LED发光二极管
若干杜邦线
KeilMDK软件
单片机下载软件mcuisp
使用引脚:A1,B1,B10

2.实验思路

设置三个灯分别为A1,B1,B10

使用while循环给寄存器附不同的高低电平使三个灯达到下列状态

(1)A1亮,B1,B10熄灭

(2)B1亮,A1,A10熄灭

(3)B10亮,A1,B1熄灭

3.1程序代码

//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)	//GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器


//延时函数
void Delay_ms( volatile unsigned int t){
	unsigned int i,j;
	for(j = 0; j < t; j++){
		for(i = 0; i < 1000 ; i++);
	}
}

int main() {
	//使能a,b时钟
	RCC_APB2ENR|=1<<2;
	RCC_APB2ENR|=1<<3;
	//GPIOA1设置为推挽输出
	GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
	GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
	//GPIOB1设置为推挽输出
	GPIOB_CRL&=0xFFFFFF0F;
	GPIOB_CRL|=0x00000030;
	//GPIOB10设置为推挽输出
	GPIOB_CRH&=0xFFFFF0FF;
	GPIOB_CRH|=0x00000300;
	while(1){
		//位操作置B1,B10低电平,A1高电平
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<10);
		GPIOA_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B10低电平,B1高电平
		GPIOA_ODR=~(1<<1);
		GPIOB_ODR=~(1<<10);
		GPIOB_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B1低电平,B10高电平
		GPIOA_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR|=1<<10;
		Delay_ms(10000);
	}
}

3.2运行效果

LED1

4.1加入P13管脚

(1)程序代码
//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)	//GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOC_CRH *((unsigned volatile int*)0x40011004) //GPIOC配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C) //GPIOC输出数据寄存器

//延时函数
void Delay_ms( volatile unsigned int t){
	unsigned int i,j;
	for(j = 0; j < t; j++){
		for(i = 0; i < 1000 ; i++);
	}
}

int main() {
	//使能a,b时钟
	RCC_APB2ENR|=1<<2;
	RCC_APB2ENR|=1<<3;
	RCC_APB2ENR|=1<<4;
	//GPIOA1设置为推挽输出
	GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
	GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
	//GPIOB1设置为推挽输出
	GPIOB_CRL&=0xFFFFFF0F;
	GPIOB_CRL|=0x00000030;
	//GPIOB10设置为推挽输出
	GPIOB_CRH&=0xFFFFF0FF;
	GPIOB_CRH|=0x00000300;
	//GPIOC13设置为推挽输出
	GPIOC_CRH&=0xFF0FFFFF;
	GPIOC_CRH|=0x00300000;
	while(1){
		//位操作置B1,B10, C13低电平,A1高电平
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<10);
		GPIOC_ODR&=~(1<<13);
		GPIOA_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B10, C13低电平,B1高电平
		GPIOA_ODR=~(1<<1);
		GPIOB_ODR=~(1<<10);
		GPIOC_ODR&=~(1<<13);
		GPIOB_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B1, C13低电平,B10高电平
		GPIOA_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<1);
		GPIOC_ODR&=~(1<<13);
		GPIOB_ODR|=1<<10;
		Delay_ms(10000);
		//位操作置A1,B1, B10低电平,C13高电平
		GPIOA_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<10);
		GPIOC_ODR|=1<<13;
		//GPIOC_ODR&=~(1<<13);
		Delay_ms(10000);
	}
}
(2)运行效果

LED2

(3)实验图思考

此时,将1置为高电平,将0置为低电平,根据上面实验图我们可看到此时发光二极管是不导通的,我们将P13的置位状态相反(0为高电平,1为低电平)

(4)改进代码
//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)	//GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOC_CRH *((unsigned volatile int*)0x40011004) //GPIOC配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C) //GPIOC输出数据寄存器

//延时函数
void Delay_ms( volatile unsigned int t){
	unsigned int i,j;
	for(j = 0; j < t; j++){
		for(i = 0; i < 1000 ; i++);
	}
}

int main() {
	//使能a,b时钟
	RCC_APB2ENR|=1<<2;
	RCC_APB2ENR|=1<<3;
	RCC_APB2ENR|=1<<4;
	//GPIOA1设置为推挽输出
	GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
	GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
	//GPIOB1设置为推挽输出
	GPIOB_CRL&=0xFFFFFF0F;
	GPIOB_CRL|=0x00000030;
	//GPIOB10设置为推挽输出
	GPIOB_CRH&=0xFFFFF0FF;
	GPIOB_CRH|=0x00000300;
	//GPIOC13设置为推挽输出
	GPIOC_CRH&=0xFF0FFFFF;
	GPIOC_CRH|=0x00300000;
	while(1){
		//位操作置B1,B10, C13低电平,A1高电平
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<10);
		GPIOC_ODR|=1<<13;
		GPIOA_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B10, C13低电平,B1高电平
		GPIOA_ODR=~(1<<1);
		GPIOB_ODR=~(1<<10);
		GPIOC_ODR|=1<<13;
		GPIOB_ODR|=1<<1;
		Delay_ms(10000);
		//位操作置A1,B1, C13低电平,B10高电平
		GPIOA_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<1);
		GPIOC_ODR|=1<<13;
		GPIOB_ODR|=1<<10;
		Delay_ms(10000);
		//位操作置A1,B1, B10低电平,C13高电平
		GPIOA_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<1);
		GPIOB_ODR&=~(1<<10);
		//GPIOC_ODR|=1<<13;
		GPIOC_ODR&=~(1<<13);
		Delay_ms(10000);
	}
}
(5)改进后运行效果

LED

二.使用标准库方式点亮流水灯

1.复制相关库文件到文件夹中

(1)如同添加文件夹core,lib,obj

(2)下载库函数文件

下载地址:STSW-STM32054 - STM32F10x标准外设库 - 意法半导体STMicroelectronics

2.添加文件到工程

(1)core中

(2)lib中

(3)obj中

3.配置工程

(1)添加文件到工程

(2)选择OutPut路径,选择自己的obj文件,生成hex文件

(3)配置全局宏量

STM32F10X_MD,USE_STDPERIPH_DRIVER赋值到对应位置

4.程序代码

#include "stm32f10x.h"

void delay_ms(uint16_t time)
{
	uint16_t i = 0;
	while(time--)
	{
		i = 10000;
		while(i--);
	}
}

int main(void)
{
	//时钟使能A,B
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//配置
	GPIO_InitTypeDef led_initA1;
	led_initA1.GPIO_Pin = GPIO_Pin_1;
	led_initA1.GPIO_Mode = GPIO_Mode_Out_PP;
	led_initA1.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_InitTypeDef led_initB1;
	led_initB1.GPIO_Pin = GPIO_Pin_1;
	led_initB1.GPIO_Mode = GPIO_Mode_Out_PP;
	led_initB1.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_InitTypeDef led_initB10;
	led_initB10.GPIO_Pin = GPIO_Pin_10;
	led_initB10.GPIO_Mode = GPIO_Mode_Out_PP;
	led_initB10.GPIO_Speed = GPIO_Speed_10MHz;
	
	//初始化
	GPIO_Init(GPIOA, &led_initA1);
	GPIO_Init(GPIOB, &led_initB1);
	GPIO_Init(GPIOB, &led_initB10);
	while(1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_10);
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
		delay_ms(1000);
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_10);
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		delay_ms(1000);
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_10);
		delay_ms(1000);
	}
}

5.运行效果

LED

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值