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

一、STM32F103C8T6

(一)stm32f103c8t6简介

1.介绍stm32f103c8t6 

STM32F103C8T6是一款由STMicroelectronics开发的基于ARM Cortex-M3内核的32位微控制器。让我逐步介绍一下它的原理:

(1)架构:
a.STM32F103C8T6采用了ARM Cortex-M3内核,这是一种高性能、低功耗的32位处理器。Cortex-M3内核具有较高的运算性能和低功耗特性,适合于嵌入式应用。
b.此微控制器还集成了丰富的外设,包括通用串行总线(USART)、SPI(串行外设接口)、I2C(I²C总线)、定时器、模拟至数字转换器(ADC)等,以满足各种应用的需求。
(2)存储器:
a.STM32F103C8T6拥有闪存和静态随机存取存储器(SRAM)。
b.闪存用于存储程序代码和只读数据,而SRAM用于存储变量和堆栈。
(3)外设:
a.USART用于串行通信,如串口通信。
b.SPI和I2C用于外设间的串行通信。
c.定时器可用于生成精确的时间延迟或进行周期性的定时任务。
d.ADC用于模拟信号的采集和转换,可以将模拟信号转换为数字信号供处理。
(4)时钟和电源管理:
a.STM32F103C8T6具有复杂的时钟系统,可以提供多种时钟源,并支持动态时钟切换。
b.它还包含电源管理单元,用于有效管理和监控芯片的电源消耗。
(5)开发工具和编程:
a.开发STM32F103C8T6应用程序通常需要使用专门的集成开发环境,如Keil µVision。
b.通常使用C或C++等编程语言进行编程,并使用供应商提供的软件库来访问芯片的功能和外设。

2. stm32f103c8t6寄存器映射

STM32F103C8T6的寄存器映射是指将各个外设的寄存器地址映射到微控制器的地址空间中。这些寄存器控制着外设的功能和行为。以下是STM32F103C8T6常见外设的寄存器映射,每个外设都有一组寄存器用于配置和控制其功能:

(1)GPIO(通用输入输出):
a.控制微控制器的引脚,包括输入、输出、模式设置等。
b.每个GPIO端口(如GPIOA、GPIOB等)都有对应的寄存器用于配置和控制,如GPIOxCRH(高字寄存器)、GPIOxCRL(低字寄存器)、GPIOx_ODR(输出数据寄存器)等。
(2)定时器(TIM):
a.控制定时器的计数、定时器模式、PWM输出等功能。
b.包括多个定时器,如TIM1、TIM2等,每个定时器都有一组寄存器用于配置和控制其功能。
(3)串口(USART):
a.控制串口通信的参数,如波特率、数据位数、停止位数等。
b.包括多个USART,如USART1、USART2等,每个USART都有一组寄存器用于配置和控制通信。
(4)SPI(串行外设接口):
a.控制SPI通信的参数和数据传输。
b.包括多个SPI接口,如SPI1、SPI2等,每个SPI接口都有一组寄存器用于配置和控制通信。
(5)I2C(I²C总线):
a.控制I2C总线通信的参数和数据传输。
b.包括多个I2C接口,如I2C1、I2C2等,每个I2C接口都有一组寄存器用于配置和控制通信。
(6)ADC(模拟至数字转换器):
a.控制模拟信号的采集和转换参数。
b.包括ADC1、ADC2等,每个ADC都有一组寄存器用于配置和控制转换。

3.电路原理图

  

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

本次使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。 

 (二)GPIO(通用输入输出)端口功能描述

1.GPIO原理

GPIO端口是微控制器上用于控制外部设备和与外部设备进行通信的接口。在STM32F103C8T6微控制器中,每个GPIO端口都有多个引脚,每个引脚都可以配置为输入或输出,并且可以通过寄存器进行配置和控制。 

2.打开GPIO端口时钟 

(1)GPIO地址

  

(2)复位和时钟控制寄存器地址 

0x40000000是STM32系列微控制器外设基地址的起始地址,对于STM32微控制器中的外设基地址,通常采用以下格式表示:

0x4000 0000 + 偏移量

而复位和时钟控制寄存器起始地址0x40021000,所以APB2外设时钟使能寄存器实际地址则为0x40021000+0x18(偏移量)= 0x40021018。

打开三个IO口的时钟需要将三个位都置1: 

代码如下:

#define RCC_APB2ENR (*(unsigned int *)0x40021018)
 
// 打开时钟
RCC_APB2ENR |= (1<<3);  // 打开 GPIOB 时钟
RCC_APB2ENR |= (1<<4);  // 打开 GPIOC 时钟
RCC_APB2ENR |= (1<<2);  // 打开 GPIOA 时钟
 
3.GPIO端口配置寄存器 

GPIO 端口的每个位可以由软件分别配置成八种模式: 

(1)输入浮空

(2)输入上拉

(3)输入下拉

(4)模拟输入

(5)开漏输出

(6)推挽式输出

(7)推挽式复用功能

(8)开漏复用功能 

 本次实现LED灯亮灭,采用了第六种配置模式,即推挽式输出。

 

 4.设置高电平

 对于GPIOA的A5、GPIOB的B5、GPIOC的C13(要求将板子上的LED灯加入流水灯中,这里直接用),配置代码如下:

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
 
GPIOB_ODR &= ~(1<<5);  
GPIOC_ODR &= ~(1<<13); 
GPIOA_ODR &= ~(1<<5);  

二、STM32(keil)点亮LED流水灯

(一)keil创建项目 

点击创建新项目 

输入项目名称,创建项目 

输入代码,点击生成,再点击魔法棒,勾选hex file 

 

代码如下:

 
#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<<5;		//PA5低电平
	GPIOB_ODR=0x1<<5;		//PB5高电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<5;		//PA5高电平
	GPIOB_ODR=0x0<<5;		//PB5低电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<5;		//PA5高电平
	GPIOB_ODR=0x1<<5;		//PB5高电平
	GPIOC_ODR=0x0<<13;		//PC13低电平	
}
 
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;  //PB5推挽输出
 
	GPIOC_CRH &= 0xff0fffff; //设置位 清零		
	GPIOC_CRH|=0x00300000;  //PC15推挽输出
 
 
	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA5推挽输出
 
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<5); 
	GPIOC_ODR |= (1<<13); 
	GPIOA_ODR |= (1<<5);  
	
	while(j){
		
		B_LED_LIGHT();
		Delay_ms(1000);//单片机上1000   
 
		C_LED_LIGHT();
		Delay_ms(1000);//单片机上1000    
 
		A_LED_LIGHT();
		Delay_ms(1000);//单片机上1000    
	}
	
}
 
 
void SystemInit(){
	
}

(二)proteus仿真

1.LED流水灯电路仿真图 

我利用的这三个接口:GPIOA的A5、GPIOB的B5、GPIOC的C13

2. STM32(keil)效果图展示

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值