STM32--定时器中断程序文档(2)
/***********************************************************************
火牛开发板基础实验 外部中断实验
分别按下S3、S4,在串口1打印出相关信息
************************************************************************/
#include "stm32f10x.h" #include "string.h"
/***********************************************************************
************************************************************************/ void RCC_Configuration(void) {
/* 使能外设时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | ENABLE);
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,
外设时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ENABLE); }
| RCC_APB1Periph_TIM3,
/*******************************************************************************
全部用到的引脚将在在配置
*******************************************************************************/
void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* 配置串口1引脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure);
/*外部中断引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输出 GPIO_Init(GPIOD, &GPIO_InitStructure); }
/*******************************************************************************
全部中断在此配置
*******************************************************************************/
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设
NVIC寄存器
}
/*******************************************************************************
外部中断在此配置
*******************************************************************************/
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource8); // S4中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource9); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource10); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource11); EXTI_ClearITPendingBit(EXTI_Line8); EXTI_ClearITPendingBit(EXTI_Line9); EXTI_ClearITPendingBit(EXTI_Line10);
EXTI_ClearITPendingBit(EXTI_Line11);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_Line=EXTI_Line8|EXTI_Line9|EXTI_Line10|EXTI_Line11; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
}
/*******************************************************************************
TIM3配置
*******************************************************************************/
void TIM3_Configuration(unsigned int x) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* --------------------------------------------------------------- TIM3CLK 即PCLK1=36MHz
TIM3CLK = 36 MHz, Prescaler = 7200, TIM3 counter clock = 5K,即改变一次为5K,周期就为10K
--------------------------------------------------------------- */
/* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = x; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
/* TIM IT enable */
TIM_ITConfig( //使能或者失能指定的TIM中断 TIM3, TIM_IT_Update | //TIM 中断源 TIM_IT_Trigger, //TIM 触发中断源
ENABLE //使能 );
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
/*******************************************************************************
初始化时钟晶振 72MHZ
*******************************************************************************/
void SysClock_Init(void) {
ErrorStatus HSEStartUpStatus; RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS){
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08){ ; }
}
}
/*****************************************************************
USART1 初始化 baud 波特率
*****************************************************************/ void USART1_Init(unsigned int baud)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); }
/*****************************************************************
从 USART1 发送一个字节
*****************************************************************/ void USART1_SendByte(unsigned char temp) {
USART_SendData(USART1, temp);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); }
/*****************************************************************
=
从 USART1 发送字符串
*****************************************************************/ void USART1_Printf(char *pch) {
while(*pch != '\0')
{
USART1_SendByte(*(unsigned char *)pch); pch++; } }
/****************************************** * * 延时程序 ms
*
****************************************/ void Delay(unsigned short time) {
unsigned short i, j; }
/*******************************************************
MAIN 函数
for(; time > 0; time--){ for(j = 0; j
}
*******************************************************/ int main(void) {
SysClock_Init();
// 初始化系统时钟 72MHZ
RCC_Configuration(); // 使能外设 GPIO_Configuration(); // 配置引脚 NVIC_Configuration(); // 配置中断
// // // //
USART1_Init(9600);
// 配置串口1,波特率9600
TIM3_Configuration();
TIM3_Configuration(10000); while(1){
Delay(500);
GPIO_SetBits(GPIOE, GPIO_Pin_0);
Delay(500);
// GPIO_ResetBits(GPIOE, GPIO_Pin_0);
}
// return(0); } /**
****************************************************************************** * @file Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c * @author MCD Application Team * @version V3.4.0
* @date 10/15/2010
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and * peripherals interrupt service routine.
****************************************************************************** * @copy *
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2010 STMicroelectronics
*/
/* Includes ------------------------------------------------------------------*/ #include "stm32f10x_it.h"
extern TIM3_Configuration(unsigned int x); //extern TIM4_Configuration(void) extern void USART1_Printf(char *pch);
/** @addtogroup STM32F10x_StdPeriph_Template * @{ */
/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */ /******************************************************************************/
/**
* @brief This function handles NMI exception. * @param None * @retval None */
void NMI_Handler(void) { }
/**
* @brief This function handles Hard Fault exception. * @param None * @retval None */
void HardFault_Handler(void) {
/* Go to infinite loop when Hard Fault exception occurs */ while (1) {
}
} /**
* @brief This function handles Memory Manage exception. * @param None * @retval None
*/
void MemManage_Handler(void) {
/* Go to infinite loop when Memory Manage exception occurs */ while (1) { } }
/**
* @brief This function handles Bus Fault exception. * @param None * @retval None */
void BusFault_Handler(void) {
/* Go to infinite loop when Bus Fault exception occurs */ while (1) { } } /**
* @brief This function handles Usage Fault exception. * @param None * @retval None */
void UsageFault_Handler(void) {
/* Go to infinite loop when Usage Fault exception occurs */ while (1) { } }
/**
* @brief This function handles SVCall exception.
* @param None * @retval None */
void SVC_Handler(void) { }
/**
* @brief This function handles Debug Monitor exception. * @param None * @retval None */
void DebugMon_Handler(void) { }
/**
* @brief This function handles PendSVC exception. * @param None * @retval None */
void PendSV_Handler(void) { }
/**
* @brief This function handles SysTick Handler. * @param None * @retval None */
void SysTick_Handler(void) { }
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request. * Input : None * Output : None
* Return : None
*******************************************************************************/
extern void USART1_SendByte(unsigned char temp); // 声明外部函数
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ // 如果是串口接收中断
USART1_SendByte(USART_ReceiveData(USART1));
去
}
}
void TIM3_IRQHandler(unsigned int x)
{
static unsigned char flag = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){ //检查指定的TIM中断发生与否:TIM 中断源
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
} if(flag == 0){ GPIO_ResetBits(GPIOE, GPIO_Pin_0); }else{ GPIO_SetBits(GPIOE, GPIO_Pin_0); } flag = !flag; // 将接收到的字节发送出
}
//void TIM4_IRQHandler(void)
//{
// static unsigned char flag = 0;
//
// if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){ //检查指定的TIM中断发生与否:TIM 中断源
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
//
//
//
//
//
//
//
if(flag == 0){ GPIO_ResetBits(GPIOE, GPIO_Pin_0); }else{ GPIO_SetBits(GPIOE, GPIO_Pin_0); } flag = !flag;
//}
/*******************************************************************************
* Function Name : EXTI9_5_IRQHandler
* Description : This function handles EXTI9_5 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI9_5_IRQHandler(void)
{ if(EXTI_GetITStatus(EXTI_Line8) != RESET) { EXTI_ClearITPendingBit(EXTI_Line8); TIM3_Configuration(10000); } if(EXTI_GetITStatus(EXTI_Line9) != RESET) { EXTI_ClearITPendingBit(EXTI_Line9); TIM3_Configuration(20000);
}
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line10) != RESET) { TIM3_Configuration(30000); EXTI_ClearITPendingBit(EXTI_Line10); } { EXTI_ClearITPendingBit(EXTI_Line11); TIM3_Configuration(40000); if(EXTI_GetITStatus(EXTI_Line11) != RESET)
} /******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/