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