stm32F103的LED亮灭

一、了解STM32F103C8T6

1、STM32F103C8T6的电路原理

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,广泛应用于各种嵌入式系统
中。其电路原理涉及多个关键部分,包括电源电路、时钟电路、复位电路、GPIO(通用输入输出)电路以及通信接口电路等。
STM32F103C8T6的电源电路负责为整个微控制器提供稳定的工作电压。一般来说,
STM32F103C8T6的工作电压范围是2V到3.6V。
时钟电路是STM32F103C8T6微控制器的核心部分之一,它负责为微控制器的各个部分提供精确的
时钟信号。STM32F103C8T6内置了多个振荡器,包括HSI、LSI和HSE等。
复位电路用于在微控制器出现错误或需要重启时将其恢复到初始状态。STM32F103C8T6的复位电
路通常包括一个复位按钮和一个上拉电阻。当复位按钮被按下时,微控制器会接收到一个低电平信号,从而触发复位操作。
GPIO电路是STM32F103C8T6与外部世界进行交互的重要接口。STM32F103C8T6提供了多个GPIO
端口,每个端口都可以配置为输入或输出模式。
STM32F103C8T6支持多种通信接口,如UART(通用异步收发传输器)、SPI(串行外设接口)、
I2C(两线式串行接口)等。这些通信接口电路用于实现微控制器与其他设备之间的数据交换。

2.电路原理图

![[e7d5ecfdd788d407d57a89895d2d8af.png]]

3.寄存器

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指
令、数据和地址。
简单来说,寄存器就是存放东西的东西。寄存器存放的是指令、数据或地址。
  存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来
问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的
寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
  指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机
器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。

4.最小系统板的引脚原理图

![[843e7e5ad6c6560b07b29609a24f8c0.png]]

二、LED流水灯实验

1.proteus仿真

![[4f8b954327f18b3eb4adb36be40b8df.png]]

2.代码

#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRH (*(unsigned int )0x40010C04)
#define GPIOC_CRH (
(unsigned int )0x40011004)
#define GPIOA_CRL (
(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int )0x40010C0C)
#define GPIOC_ODR (
(unsigned int )0x4001100C)
#define GPIOA_ODR (
(unsigned int *)0x4001080C)

void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t–)
for (i=0;i<800;i++);
}

void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<15; //PC15低电平
}

int main(){
int j=100;
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟

// 设置 GPIO 为推挽输出
GPIOB_CRH&= 0xffffff0f;	//设置位 清零		
GPIOB_CRH|=0x00000020;  //PB9推挽输出

GPIOC_CRH &= 0x0fffffff; //设置位 清零		
GPIOC_CRH|=0x30000000;  //PC15推挽输出


GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
GPIOA_CRL|=0x00010000; //PA4推挽输出

// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9); 
GPIOC_ODR |= (1<<15); 
GPIOA_ODR |= (1<<4);  

while(j){
	
	B_LED_LIGHT();
	Delay_ms(100);

	C_LED_LIGHT();
	Delay_ms(100);

	A_LED_LIGHT();
	Delay_ms(100);
}

}

void SystemInit(){

}

3.程序设计思路

地址定义(寄存器映射):使用#define指令定义了各个GPIO和RCC(Reset and Clock Control)
寄存器的基地址。通过这些基地址,进一步定义了各个控制寄存器(如GPIO的CRH/CRL和ODR)的指针。
函数声明:声明了Delay_ms(延时函数)、A_LED_LIGHT、B_LED_LIGHT和C_LED_LIGHT(控制三
个LED的亮灭)。
延时函数Delay_ms:使用一个嵌套的循环来实现毫秒级的延时。延时时间与CPU的时钟频率有
关。
LED控制函数:A_LED_LIGHT、B_LED_LIGHT和C_LED_LIGHT分别用于设置三个LED的状态。使用的
是直接操作GPIO的ODR(Output Data Register)寄存器的方法。
主函数main:首先,通过操作RCC寄存器,开启GPIOA、GPIOB和GPIOC的时钟。然后,配置这三
个GPIO的特定引脚(PA4、PB9和PC15)为推挽输出模式。初始状态下,三个LED都处于熄灭状态(高电平)。接下来,通过一个无限循环,不断改变三个LED的状态。每个LED状态保持100毫秒,然后切换到下一个LED。

4.实物演示

在这里插入图片描述

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103可以使用GPIO(通用引脚输入输出)来控制LED。具体步骤如下: 1. 在STM32CubeMX中配置GPIO,将按键的引脚连接到STM32的输入,将LED的引脚连接到STM32的输出。 2. 在代码中使用HAL库的GPIO API读取按键状态,如果按键被按下,就将LED的状态设置为,否则设置为。 3. 使用HAL库的GPIO API将LED设置为对应状态。 ### 回答2: 在stm32f103中,可以通过使用GPIO(通用输入/输出)来控制LED状态。GPIO可以被用作输入和输出,而按键则是一种输入设备,因此可以将GPIO配置为输入模式以便检测按键的状态。 为了控制LED,需要先将GPIO配置为输出模式,然后将LED连接到相应的IO管脚上,以便控制电流的流动,从而控制LED度。 在程序中,需要使用相关的库函数来初始化GPIO并设置IO管脚的状态,以便使LED与按键相应联动。具体操作步骤如下: 1. 初始化GPIO口为输入模式,设置相应的IO口: GPIO_InitTypeDef GPIO_InitStruct; //为GPIO初始化结构体赋初值 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//按键所连接的GPIO口 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//IO管脚输出速率 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//设置从机IO口模式为输入 GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化GPIO口 2. 初始化GPIO口为输出模式,使LED能够响应按键的控制: GPIO_InitTypeDef GPIO_InitStruct; //为GPIO初始化结构体赋初值 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//与LED连接的GPIO口 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//IO管脚输出速率 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//设置从机IO口模式为输出 GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化GPIO口 3. 通过轮询方式检测GPIO口的状态,以实现按键控制LED: if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)//检测按键是否按下 { GPIO_SetBits(GPIOA,GPIO_Pin_1);//设置LED为高电平,使其起 } else { GPIO_ResetBits(GPIOA,GPIO_Pin_1);//将LED设置为低电平,使其熄 } 以上就是在stm32f103中实现按键控制LED的具体方法。需要注意的是,GPIO的初始化和操作都是非常重要的,需要严格按照数据手册的要求来进行设置,否则会出现无法控制的情况。此外,对于GPIO的输入和输出,还需要配合中断响应和定时器等功能来实现更加复杂的操作和应用。 ### 回答3: 在控制stm32f103单片机按键控制led时,我们可以使用GPIO口来实现。首先,需要定义两个GPIO口,一个输出的led口和一个输入的按键口。接着,将led口设置为输出模式,按键口设置为输入模式。在程序中,需要进行轮询遍历,即检测按键输入状态,即检测按键口口的状态,如果状态为高电平,则led口输出低电平,即让led;如果状态为低电平,则led口输出高电平,即让led起。具体实现过程如下: 1.定义引脚 首先需要定义两个GPIO口。 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO及复用时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//设置LED引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//设置按键引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); 2.轮询遍历 在主函数中进行轮询遍历,即检测按键输入状态。如果是按下,那么LED起;如果是松开,那么LED则熄。 while(1) { if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)//检测按键口状态 { GPIO_SetBits(GPIOB, GPIO_Pin_5);//输出高电平LED } else { GPIO_ResetBits(GPIOB, GPIO_Pin_5);//输出低电平熄LED } } 3.完成 完成代码的编写即可实现按键控制LED的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值