STM32F103_study52_The punctual atoms(STM32 The running light experiment )

一. Experiment Name:The running light experiment

二. Development steps:

在这里插入图片描述
1.我们做的是跑马灯实验。所以首先确定与灯连接的GPIO引脚是那一个,是那组GPIO引脚。
2.这次跑马灯,灯会一亮一灭,所以的设置定时器(这里不用delay()函数,感觉这函数用的不专业)。
3.设置定时器,定时器就会溢出,所以还需要设置与定时器相关的中断,以及中断服务函数。
三. Software and hardware used:
1.keil
2.Development board
3.The emulator
4.Two USB data cables
5.The simulation line
四. Functions and registers related to serial port operation:

五, logical analysis:

1.因为我们主要是初始化ARR,PSC。所以我们就把初始化函数的参数设置为他们两个。
为什么定义为u16呢?
(老师说这儿的定时器是16位的,所以这样设置)
ARR,PSC这两个是定时器的寄存器。

在这里插入图片描述
在这里插入图片描述
2.
无论什么代码都要记住使能和初始化函数。

void TIM3_Int_Init(u16 arr, u16 psc)
	{
		NVIC_InitTypeDef NVIC_InitStruce;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSture;
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
		
		//初始化定时器
		TIM_TimeBaseInitSture.TIM_ClockDivision=TIM_CKD_DIV1;//这个与本实验无关,随便选一个
		TIM_TimeBaseInitSture.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
		TIM_TimeBaseInitSture.TIM_Period=arr;//自动装载值
		TIM_TimeBaseInitSture.TIM_Prescaler=psc;//预分频值
	
		TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitSture);
		
		
		//使能定时器中断,使能定时器那种中断(TIM_IT_Update)
		TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
		
		
		//,设置中断,中断优先级分组
		
		NVIC_InitStruce.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断
		NVIC_InitStruce.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
		NVIC_InitStruce.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
		NVIC_InitStruce.NVIC_IRQChannelSubPriority=3;//从优先级3级
	
	
		NVIC_Init(&NVIC_InitStruce);

		
		//使能定时器
		TIM_Cmd(TIM3,ENABLE);
		
		

	}



	
	void TIM3_IRQHandler(void)
	{
		
		if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
		{
			LED1 = !LED1 ;
			
			TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
		}
		
	}

六. Code display:

main

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
 
 
/************************************************
 ALIENTEK战舰STM32开发板实验1
 跑马灯实验 
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/


 int main(void)
 {	
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	 
	 delay_Init();//固定操作,没有任何理由
	 
	 TIM3_Int_Init(4999,7199);
	 while(1);
	 
 }


 /**
 *****************下面注视的代码是通过调用库函数来实现IO控制的方法*****************************************
int main(void)
{ 
 
	delay_init();		  //初始化延时函数
	LED_Init();		        //初始化LED端口
	while(1)
	{
			GPIO_ResetBits(GPIOB,GPIO_Pin_5);  //LED0对应引脚GPIOB.5拉低,亮  等同LED0=0;
			GPIO_SetBits(GPIOE,GPIO_Pin_5);   //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
			delay_ms(300);  		   //延时300ms
			GPIO_SetBits(GPIOB,GPIO_Pin_5);	   //LED0对应引脚GPIOB.5拉高,灭  等同LED0=1;
			GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
			delay_ms(300);                     //延时300ms
	}
} 
 
 ****************************************************************************************************
 ***/
 

	
/**
*******************下面注释掉的代码是通过 直接操作寄存器 方式实现IO口控制**************************************
int main(void)
{ 
 
	delay_init();		  //初始化延时函数
	LED_Init();		        //初始化LED端口
	while(1)
	{
     GPIOB->BRR=GPIO_Pin_5;//LED0亮
	   GPIOE->BSRR=GPIO_Pin_5;//LED1灭
		 delay_ms(300);
     GPIOB->BSRR=GPIO_Pin_5;//LED0灭
	   GPIOE->BRR=GPIO_Pin_5;//LED1亮
		 delay_ms(300);

	 }
 }
**************************************************************************************************
**/


timer.h

#ifndef __TIMER_H
#define __TIMER_H

#include"sys.h"

void TIM3_Int_Init(u16 arr, u16 psc);



#endif



timer.c

#include "timer.h"
#include "led.h"



void TIM3_Int_Init(u16 arr, u16 psc)
	{
		NVIC_InitTypeDef NVIC_InitStruce;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSture;
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
		
		//初始化定时器
		TIM_TimeBaseInitSture.TIM_ClockDivision=TIM_CKD_DIV1;//这个与本实验无关,随便选一个
		TIM_TimeBaseInitSture.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
		TIM_TimeBaseInitSture.TIM_Period=arr;//自动装载值
		TIM_TimeBaseInitSture.TIM_Prescaler=psc;//预分频值
	
		TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitSture);
		
		
		//使能定时器中断,使能定时器那种中断(TIM_IT_Update)
		TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
		
		
		//,设置中断,中断优先级分组
		
		NVIC_InitStruce.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断
		NVIC_InitStruce.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
		NVIC_InitStruce.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
		NVIC_InitStruce.NVIC_IRQChannelSubPriority=3;//从优先级3级
	
	
		NVIC_Init(&NVIC_InitStruce);

		
		//使能定时器
		TIM_Cmd(TIM3,ENABLE);
		
		

	}



	
	void TIM3_IRQHandler(void)
	{
		
		if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
		{
			LED1 = !LED1 ;
			
			TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
		}
		
	}




七.Other ideas
1…h文件里面一般只存放,函数的声明,和一些宏定义。以及导入一些头文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值