新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2016-3-24
- 在线时间
- 1 小时
|
#include <stm32f10x.h>
#include <stm32f10x_it.h>
#include <stm32f10x_conf.h>
#include <misc.h>
#include <Rcc.h>
#include <key.h>
#include <led.h>
#include <beep.h>
#include <usart.h>
#include <exti_gpio.h>
#include <delay.h>
#define LED_0 GPIO_Pin_5 //PB5
#define LED_1 GPIO_Pin_5 //PE5
#define BEEP GPIO_Pin_8
#define MCO GPIO_Pin_8
int main(void)
{
delay_init(); //延时初始化
KEY_Init(); //按键初始化
Led_Init_Configuration(); //初始化LED输出的GPIO
//初始化系统时钟 串口中断 外部中断 中断优先级
RCC_Init_Configuration();
USART1_Init_Configuration(115200);
EXTI_Interrupt_Init(); //外部中断初始化函数
while(1)
{
GPIO_SetBits(GPIOB,BEEP);
delay_ms(100);
GPIO_ResetBits(GPIOB,BEEP);
delay_ms(100);
GPIO_ResetBits(GPIOB,LED_0);
delay_ms(100);
GPIO_SetBits(GPIOB,LED_0);
delay_ms(100);
GPIO_ResetBits(GPIOE,LED_1);
delay_ms(100);
}
/*
while(1)
{
key=KEY_Scan(1);//按键键值送给key
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define KEY2_PRES 3 //KEY2按下
#define WKUP_PRES 4 //KEY_UP按下(即WK_UP/KEY_UP)
if (key)
{
switch(key)
{
case KEY0_PRES : GPIO_ResetBits(GPIOB,LED_0);break;
case KEY1_PRES : GPIO_SetBits(GPIOB,LED_0);break;
case KEY2_PRES : break;
case WKUP_PRES : break;
default : break;
}
}
else delay_ms(10);
}
*/
}
#include <exti_gpio.h>
/*******************************************************************************
* Function Name : GPIO EXTI NVIC配置
* Description :
* Function :
按下所接的按键 PC1 PC2 PC4 PA8 触发中断
中断服务函数中相应PB5 所接的LED灯状态改变
*******************************************************************************/
/* GPIO 配置 */
void GPIO_Exti_Interrupt_Configuration(void)
{
/***********************************************/
//PE2 PE3 PE4 PA8 为按键中断 设置正输入模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入模式
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/* EXTI 配置 */
void EXTI_Interrupt_Init_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
//清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line2);
EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearITPendingBit(EXTI_Line4);
//设置 PE2 PE3 PE4 PA8
//引脚作为触发外部中断线与引脚的 映射关系
/***********************************************/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //管脚0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //线0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);//初始化 中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2 ;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3 ;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4 ;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/* NVIC 配置 */
void NVIV_Init_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitSturcture;
/*
#define NVIC_VecTab_FLASH
设置中断向量表的起始地址是RAM 还是FLASH
#ifdef NVIC_VectTab_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x00);
#endif
*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置分组1
NVIC_InitSturcture.NVIC_IRQChannel = EXTI2_IRQn; //外部中断通道2
NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x03;
NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitSturcture);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置分组1
NVIC_InitSturcture.NVIC_IRQChannel = EXTI3_IRQn; //外部中断通道3
NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x02;
NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitSturcture);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置分组1
NVIC_InitSturcture.NVIC_IRQChannel = EXTI4_IRQn; //外部中断通道4
NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x01;
NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitSturcture);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置分组1
NVIC_InitSturcture.NVIC_IRQChannel = EXTI0_IRQn; //外部中断通道0
NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x00;
NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitSturcture);
}
void EXTI_Interrupt_Init(void)
{
GPIO_Exti_Interrupt_Configuration(); //初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启复用时钟功能
EXTI_Interrupt_Init_Configuration(); //初始化IO口与中断线的映射
NVIV_Init_Configuration(); //配置中断分组 与使能
}
#include <Rcc.h>
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : RCC配置(使用外部8MHz晶振)
*******************************************************************************/
void RCC_Init_Configuration(void)
{
/*
ErrorStatus HSEStartUpStatus;//定义变量//typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
//将外设RCC寄存器重设为缺省值 //
RCC_DeInit();
//设置外部高速晶振(HSE)//
RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON) 配置时钟开启HSE外部高速时钟
//等待HSE起振
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪
{
//设置PLL时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//选择HSE为PLL时钟源并且倍频9倍
//设置AHB时钟(HCLK)
RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟 = 系统时钟
// 设置高速APB2时钟(PCLK2)
RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟 = HCLK
//设置低速APB1时钟(PCLK1)
RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟 = HCLK / 2
//设置HSI为PA8 MCO 输出时钟(MCO)
RCC_MCOConfig(RCC_MCO_HSI);
//设置FLASH存储器延时时钟周期数
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期
//选择FLASH预取指缓存的模式
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能
//使能PLL
RCC_PLLCmd(ENABLE);
//检查指定的RCC标志位(PLL准备好标志)设置与否
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//设置系统时钟(SYSCLK)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL作为系统时钟
// PLL返回用作系统时钟的时钟源
while(RCC_GetSYSCLKSource() != 0x08) //0x08:判读PLL是否作为系统时钟
{
}
}
//使能APB2外设时钟
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOE | RCC_APB2Periph_USART1, ENABLE); //GPIO A B E时钟使能
RCC_ClockSecuritySystemCmd(ENABLE);
}
//系统时钟 system_stm32f10x.h
#include "stm32f10x.h"
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/*#define SYSCLK_FREQ_HSE HSE_VALUE */
/*#define SYSCLK_FREQ_24MHz 24000000 */
#else
/*#define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
/* #define DATA_IN_ExtSRAM */
#endif
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
|
|