文档库 最新最全的文档下载
当前位置:文档库 › STM32——基本定时一秒闪烁LED

STM32——基本定时一秒闪烁LED

STM32——基本定时一秒闪烁LED
STM32——基本定时一秒闪烁LED

STM32通用定时器的基本定时器功能实现灯闪烁

/* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h"

ErrorStatus HSEStartUpStatus;

void RCC_Configuration(void);

//void USART_Configuration(void);

void GPIO_Configuration(void);

void TIM_Configuration(void);

void NVIC_Configuration(void);

void delay(void);

int main(void)

{

#ifdef DEBUG

debug();

#endif

RCC_Configuration();

GPIO_Configuration();

TIM_Configuration();

//USART_Configuration();

NVIC_Configuration();

/* Infinite loop */

while (1)

{

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

{

}

}

}

/****************************************************************************** *

* Function Name : assert_failed

* Description : Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* Input : - file: pointer to the source file name

* - line: assert_param error line source number

* Output : None

* Return : None

******************************************************************************* /

void RCC_Configuration(void)

{

/*将外设RCC寄存器重设为缺省值*/

RCC_DeInit();

/*设置外部高速晶振(HSE)*/

RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON) /*等待HSE起振*/

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪

{

/*设置AHB时钟(HCLK)*/

RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟= 系统时钟

/* 设置高速AHB时钟(PCLK2)*/

RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK

/*设置低速AHB时钟(PCLK1)*/

RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2

/*设置FLASH存储器延时时钟周期数*/

FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期

/*选择FLASH预取指缓存的模式*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9

/*使能PLL */

RCC_PLLCmd(ENABLE);

/*检查指定的RCC标志位(PLL准备好标志)设置与否*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

/*设置系统时钟(SYSCLK)*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟

/* PLL返回用作系统时钟的时钟源*/

while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟

{

}

}

/*使能TIM3的APB1外设时钟*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/*使能或者失能APB2外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOF , ENABLE);

//RCC_APB2Periph_GPIOA GPIOA时钟

//RCC_APB2Periph_GPIOB GPIOB时钟

//RCC_APB2Periph_GPIOC GPIOC时钟

//RCC_APB2Periph_GPIOD GPIOD时钟

}

/*void USART_Configuration(void) //串口初始化函数

{

USART_InitTypeDef USART_InitStructure; //串口设置恢复默认参数

USART_https://www.wendangku.net/doc/e114411737.html,ART_BaudRate = 9600; //设置波特率=9600

USART_https://www.wendangku.net/doc/e114411737.html,ART_WordLength = USART_WordLength_8b;//字长8位

USART_https://www.wendangku.net/doc/e114411737.html,ART_StopBits = USART_StopBits_1; // 1位停止字节

USART_https://www.wendangku.net/doc/e114411737.html,ART_Parity = USART_Parity_No ; //无奇偶校验

USART_https://www.wendangku.net/doc/e114411737.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None; //无流控制

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断使能

USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//发送中断使能

USART_https://www.wendangku.net/doc/e114411737.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 打开Rx接收和Tx发送功能

USART_Init(USART1, &USART_InitStructure); // 初始化串口

USART_Cmd(USART1, ENABLE); // 启动串口

} */

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void TIM_Configuration(void)

{

/*每1秒发生一次更新事件(进入中断服务程序)。

RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2

表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为

((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_DeInit( TIM2);

TIM_TimeBaseStructure.TIM_Period =9999; // 自动重装载寄存器周期的值(定时时间)

// 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)

TIM_TimeBaseStructure.TIM_Prescaler = 7199; //时钟预分频数例如:时钟频率=72/(时钟预分频+1)

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/*此函数的语句"TIMx->EGR = TIM_PSCReloadMode_Immediate;

"以软件方式产生更新事件(注:当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志

位(TIMx_SR寄存器中的UIF位)。*/

//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

//TIM_SetAutoreload(TIM2, 9999);

TIM_ClearFlag(TIM2, TIM_FLAG_Update); // Clear TIM2 update pending flag[清除TIM2溢出中断标志]

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // Enable TIM2 Update interrupt [TIM2溢出中断允许]

TIM_Cmd(TIM2, ENABLE);// TIM2 enable counter [允许tim2计数]

}

/*void EXTI_Configuration(void)

{

//连接EXTI Line0到PA.00

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

// 配置EXTI Line0产生一个下降沿中断

EXTI_InitStructure.EXTI_Line = EXTI_Line0;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

// 连接EXTI Line9到PB.09

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

// 配置EXTI Line9产生一个下降沿中断

EXTI_InitStructure.EXTI_Line = EXTI_Line9;

EXTI_Init(&EXTI_InitStructure);

}

*/

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000

矢量表设置在0x20000000基地位置*/

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000

矢量表设置在0x08000000基地位置*/

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* Enable the TIM2 global Interrupt

全局中断使能TIM2 */

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void delay(void)

{

u32 i,j;

for (i=0; i<0x0fffff; i++)

{

j ++;

}

}

#ifdef DEBUG

void assert_failed(u8* file, u32 line)

{

/* 用户可以添加自己的执行情况报告的文件名和行号,例如:printf(“请值错误的参数:文件%的行%d \的R \ N”的,文件,行)*/

/* Infinite loop */

while (1)

{

}

}

#endif

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

中断函数

#include "stm32f10x_it.h"

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

void TIM2_IRQHandler(void)

{

TIM_Cmd(TIM2, DISABLE);

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

{

//TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8))); //取反

GPIO_WriteBit(GPIOD, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2))); //取反

GPIO_SetBits(GPIOC, GPIO_Pin_2);

GPIO_SetBits(GPIOA, GPIO_Pin_7);

GPIO_SetBits(GPIOF, GPIO_Pin_6);

//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_Configuration();

}

}

相关文档