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();
}
}