stm32F103的LED亮灭之版本1(寄存器地址版)

一、stm32f103c8t6主要引脚接口

在这里插入图片描述

STM32F103C8T6的最小核心板通常包括STM32F103C8T6微控制器芯片及其基本外围电路。以下是一些主要引脚接口的介绍:

  1. 电源引脚

    VDD:供电电压,通常为3.3V。

    VDDA:模拟电源,为ADC和DAC等模拟外设提供电源。

    VSSA:模拟地,为模拟外设提供参考地。

    VBAT:备份电源,可以在主电源断电时为RTC和备份寄存器供电。

  2. 晶振和时钟引脚:用于提供稳定的时钟信号

    OSC_IN:晶振输入引脚。

    OSC_OUT:晶振输出引脚。

    OSC32_IN:32.768kHz低速晶振输入,通常用于RTC。

    OSC32_OUT:32.768kHz低速晶振输出。

  3. NRST(复位)引脚:用于手动复位微控制器。

    NRST:复位输入引脚,可以用来手动复位微控制器或通过软件编程复位。

  4. SWD/JTAG (调试接口)接口:用于程序的调试和测试。

    SWDIO:SWD数据输入/输出引脚。

    SWCLK:SWD时钟引脚。

    SWO/TRACESWO:SWO或Trace调试数据输出引脚。

    JTMS/SWDIO:JTAG模式下的TMS和SWD模式下的数据I/O引脚。

    JTCK/SWCLK:JTAG模式下的TCK和SWD模式下的时钟引脚。

  5. GPIO(通用输入输出)引脚:该微控制器有多个 GPIO 引脚,可以配置为输入模式、输出模式或复用功能模式。

    PA0-PA15、PB0-PB15、PC0-PC15、PD0-PD2:这些GPIO引脚可以配置为输入、输出或具有特定功能的复用模式。例如,PA9和PA10可以复用为USART1的TX和RX。

  6. ADC(模数转换器)通道:用于模拟信号的采集。

    PA0-PA7、PB0-PB1:这些引脚可以配置为模拟输入,用于ADC(模数转换器)。

  7. DAC(数模转换器)通道:用于产生模拟信号。

    PA4、PA5:这些引脚可以用作DAC(数模转换器)的输出。

  8. USART(通用同步/异步接收/发送器)接口:通常用于与外部设备进行全双工的异步通信。

    USART1:TX(PA9),RX(PA10)。

    USART2:TX(PA2),RX(PA3)。

    USART3:TX(PB10),RX(PB11)。

  9. SPI(串行外设接口)接口:用于与外部设备进行高速同步数据通信。

    SPI1:SCK(PA5),MISO(PA6),MOSI(PA7)。

    SPI2:SCK(PB13),MISO(PB14),MOSI(PB15)。

  10. I2C(集成电路间总线)接口:用于连接低速外围设备。

    I2C1:SCL(PB6),SDA(PB7)。

    I2C2:SCL(PB10),SDA(PB11)。

  11. TIM(定时器)接口:提供定时、计数、PWM(脉冲宽度调制)等功能

    TIM1:多个通道可用,如CH1(PA8)。

    TIM2:多个通道可用,如CH1(PA0),CH2(PA1)。

    TIM3:多个通道可用,如CH1(PA6),CH2(PA7)。

  12. CAN(控制器局域网络)接口:用于实现高可靠性的网络通信。

    CAN1:TX(PB9),RX(PB8)。

二、proteus仿真LED流水灯

Proteus原理图:

在这里插入图片描述

仿真结果:

在这里插入图片描述

三、LED流水灯

关于GPIOx端口的各寄存器地址和详细参数

STM32F103C8T6微控制器的每个GPIO端口(如GPIOA、GPIOB、GPIOC等)都有一组寄存器用于控制和配置端口的状态。以下是一些主要的寄存器及其地址:

  1. 端口模式寄存器(GPIOx_CRL, GPIOx_CRH)

    地址:GPIOx_BASE + 0x00(对于低寄存器CRL)和GPIOx_BASE + 0x04(对于高寄存器CRH)。

    功能:配置每个GPIO引脚的工作模式(输入、输出、复用功能等)和输出类型(推挽或开漏)。

  2. 端口输出数据寄存器(GPIOx_ODR)

    地址:GPIOx_BASE + 0x0C。

    功能:存储GPIO端口的输出数据(每个位对应一个引脚)。

  3. 端口输入数据寄存器(GPIOx_IDR)

    地址:GPIOx_BASE + 0x08。

    功能:读取GPIO端口的输入数据(每个位对应一个引脚)。

  4. 端口置位/复位寄存器(GPIOx_BSRR)

    地址:GPIOx_BASE + 0x10。

    功能:用于原子性地对输出引脚进行置位(置1)或复位(置0)操作。

  5. 端口配置锁寄存器(GPIOx_LCKR)

    地址:GPIOx_BASE + 0x18。

    功能:用于锁定GPIO端口的配置,以防止意外更改。

  6. 备用功能寄存器(GPIOx_AFRL, GPIOx_AFRH)

    地址:GPIOx_BASE + 0x20(对于低寄存器AFRL)和GPIOx_BASE + 0x24(对于高寄存器AFRH)。

    功能:配置每个GPIO引脚的备用功能(用于复用功能)。

(1)点亮流水灯

程序:

 
#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);//这个函数在代码中是空的,通常用于系统初始化,包括配置系统时钟、Flash等。
void Delay_ms(volatile  unsigned  int);//延时函数
//分别用于控制连接到GPIOA、GPIOB、GPIOC的LED灯的亮灭。
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低电平	
}
//主函数:
//开启GPIOB、GPIOC、GPIOA的时钟。
//配置GPIOB、GPIOC、GPIOA的相关引脚为推挽输出模式。
//初始化LED灯为不亮状态。
//在一个无限循环中,依次点亮B_LED、C_LED、A_LED,并延时一段时间。
 
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(1000);
 
		C_LED_LIGHT();
		Delay_ms(1000);
 
		A_LED_LIGHT();
		Delay_ms(1000);
	}
	
}
 
 
void SystemInit(){
	
}

实验效果:

在这里插入图片描述

(2)在流水灯点亮PC13LED

程序:

 
#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);//这个函数在代码中是空的,通常用于系统初始化,包括配置系统时钟、Flash等。
void Delay_ms(volatile  unsigned  int);//延时函数
//分别用于控制连接到GPIOA、GPIOB、GPIOC的LED灯的亮灭。
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<<13;		//PC13高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<13;		//PC13低电平	
}
//主函数:
//开启GPIOB、GPIOC、GPIOA的时钟。
//配置GPIOB、GPIOC、GPIOA的相关引脚为推挽输出模式。
//初始化LED灯为不亮状态。
//在一个无限循环中,依次点亮B_LED、C_LED、A_LED,并延时一段时间。
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 &= 0xff0fffff; //设置位 清零		
	GPIOC_CRH|=0x00300000;  //PC15推挽输出
 
 
	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA4推挽输出
 
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<13); 
	GPIOA_ODR |= (1<<4);  
	
	while(j){
		
		B_LED_LIGHT();
		Delay_ms(2000);//单片机上2000    100
 
		C_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
 
		A_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
	}
	
}
 
 
void SystemInit(){
	
}

实验效果:

在这里插入图片描述

四、总结

经过这次学习我对stm32f103c8t6的相关知识有了更多了解。

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值