STM32F103的LED亮灭

1、了解stm32f103c8t6最小核心板的主要引脚接口

了解STM32最小系统核心板(STM32F103C8T6,国际上称为 STM32 Blue Bill开发板) 的电路原理图

1 最小系统原理图

最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。

2 电源系统

由LDO(Low Dropout Regulator)低压差线性稳压器将5V转换为3.3V,为主控芯片供电。

3 时钟电路

晶振是由石英晶体组成的,石英晶体之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。

晶振电路为主控芯片提供系统时钟,所有的外设工作,CPU工作都要基于该时钟,类似于整个系统的“心跳节拍”。

晶振分为无源和有源,但是本质上都是皮尔斯震荡电路(反相放大器+电阻+电容+晶体+电源),只不过对于单片机而言,单片机内部集成了反相放大器和电阻以及电源,外接晶体和电容就可以了,这里的晶体就称之为无源晶振。

而有源晶振是将皮尔斯振荡器作成一个整体,直接加电源即可工作,当然,价格也会比无源的贵一些。

4 复位电路

主控芯片是低电平复位(引脚NRST),硬件按键复位属于系统复位之一(另外还有软件复位,看门狗计数终止复位等)。其中的电容C2的目的是按键消抖,防止在按键刚刚接触/松开时的电平抖动引发误动作(按键闭合/松开的接触过程大约有10ms的抖动,这对于主控芯片I/O控制来说已经是很长的时间,足以执行多次复位动作。由于电容电压不会突变,所以采用电容滤波,防止抖动复位误动作)。

5 调试接口

程序开发的过程中,需要下载bin/hex文件,以及在线仿真调试,可采用SWD或者JTAG的方式。SWD 模式比 JTAG 在高速模式下面更加可靠,且只需4引脚,实际开发中一般都采用SWD方式。其中的时钟线CLK是用于Jlink和芯片的时钟同步,一般频率设置为4MHz,可根据实际情况调整频率。

2、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

LED流水灯实验代码

#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(1000000);
 
		C_LED_LIGHT();
		Delay_ms(1000000);
 
		A_LED_LIGHT();
		Delay_ms(1000000);
	}
	
}
 
 
void SystemInit(){
	
}

LED流水灯实验原理图

仿真运行

3、使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭

以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

实验代码

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

#define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOA_ODR (*(unsigned int *)0x4001080C)

void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}


int main()
{
	   RCC_APB2ENR |=(1<<2);// 打开 GPIOA 时钟,(1<<2)意思是,将1左移两位,然后再与RCC或运算
	   GPIOA_CRL &=0xfffff000;//端口低配置寄存器
	   GPIOA_CRL |=0x00000111;
	
	   
	  GPIOA_ODR |=0xffffffff;//端口电平设置
	 while(1)
	 {  
		 GPIOA_ODR &=0xfffffffe;//将A0口置0,点亮LED
      Delay_ms(10000);       //延时函数
		 GPIOA_ODR |=0xffffffff;//又将输出端口全部变为高电平,灭灯
		 Delay_ms(10000);
		 
		 GPIOA_ODR &=0xfffffffd;//A1口
		   Delay_ms(10000);
		   GPIOA_ODR |=0xffffffff;
		 Delay_ms(10000);
		 
		  GPIOA_ODR &=0xfffffffb;//A2口
		  Delay_ms(10000);
		 GPIOA_ODR |=0xffffffff;
		 Delay_ms(10000);
	 }

	
}



实验结果

总结

通过这次实验,我了解了stm32f103c8t6最小核心板的主要引脚接口以及逐渐掌握了Keil 开发stm32程序的环境搭建和设置,还学会使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值