一. 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文件里面一般只存放,函数的声明,和一些宏定义。以及导入一些头文件