/*========================================================================================
*名 称: main.c
*功 能:
*入口 参数:
*说 明:
*范 例:
*编者 时 间:
*========================================================================================*/
#include "stm32f10x.h"
#include "12864.h"
ErrorStatus HSEStartUpStatus; //等待时钟的稳定
u8 count=0;
u8 d;
void SYS_Configuration(void);
/*
//ms延时函数
void delayms(unsigned int nValue) //delay 1ms at 8M
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1980;
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--)
Delay(1);
}
}
*/
//GPIO管脚初始化配置
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO状态恢复默认参数
/*GPIO口配置每四行一组,每组GPIO属性相同,默认情况:ALL,2MHZ,FLATING*/
/*PA-2-3配置为输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_7; //管脚位置定义
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZ
GPIO_Init(GPIOA,&GPIO_InitStructure); //A组GPIO初始化
/*PB-2配置为输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //管脚位置定义
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZ
GPIO_Init(GPIOB,&GPIO_InitStructure); //B组GPIO初始化
/*PA-0配置为输入--------------------------------------------------------外部中断引脚*/
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*========================================================================================
*名 称:NVIC_Configuration();
*功 能:外部中断嵌套控制
*入口 参数:
*说 明: 放入主函数里初始化
*范 例:
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void NVIC_Configuration(void) //嵌套中断向量控制配置
{
NVIC_InitTypeDefNVIC_InitStructure; //定义数据结构的变量
// 选择优先组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //选择中断通道,库P166页,
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //启动此通道的中断
NVIC_Init(&NVIC_InitStructure); //结构体初始化
}
/*========================================================================================
*名 称:EXTI_Configuration();
*功 能: 外部设备中断初始化
*入口 参数:
*说 明: 放入主函数里初始化
*范 例:
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void EXTI_Configuration(void) //中断初始化 (外部设备中断)
{
EXTI_InitTypeDefEXTI_InitStructure; //定义数据结构的变量
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //管脚选择
// GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line0; //将以上入口放在EXTI_Line0这条线上(stm32有18条这样的线路)
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //选择上升或下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //开中断
EXTI_Init(&EXTI_InitStructure); //将结构体初始化
}
/*========================================================================================
*名 称:Timer_Config();
*功 能: 定时器中断初始化
*入口 参数:
*说 明: 放入主函数里初始化
*范 例:
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void Timer_Config(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; //定义TIM结构体变量
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2外设
TIM_DeInit(TIM2); //复位时钟TIM2,恢复到初始状态
TIM_TimeBaseStructure.TIM_Period=17999; //35999和1999刚好1s
TIM_TimeBaseStructure.TIM_Prescaler=1999;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2时钟分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数方式
// 定时时间T计算公式:
// T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1s
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //初始化
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除标志
// 中断方式下,使能中断源
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中断源
TIM_Cmd(TIM2,ENABLE); //使能TIM2
}
/*========================================================================================
*名 称:NVIC_Config();
*功 能: 定时器嵌套控制
*入口 参数:
*说 明: 放入主函数里初始化
*范 例:
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void NVIC_Config(void) //定时器嵌套向量控制器
{
NVIC_InitTypeDefNVIC_InitStructure; //定义结构体变量
// 设置优先分级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //选择中断通道,库P166页,
// 选择中断通道。注意:固件库中为XXX_IRQChannel,但该程序预定义为XXX_IRQn,所以要特别注意
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //启动此通道的中断
NVIC_Init(&NVIC_InitStructure); //结构体初始化
}
int main(void)
{
SYS_Configuration(); //时钟配置(使用外部8MHz晶振)
GPIO_Configuration(); //GPIO管脚初始化配置
NVIC_Configuration(); //外部中断嵌套控制
EXTI_Configuration(); //外部设备中断初始化
Timer_Config(); //定时器中断初始化
NVIC_Config(); //定时器嵌套控制
// LCDPort_Init(); //PC10是CS//PC11是SCLK//PC12是SID
// LCD_Init(); //LCD12864初始化
// _int();
while (1)
{
//关LED
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
}
}
以下程序都在stm32f103x_it.c文件里
/*========================================================================================
*名 称: voidPPP_IRQHandler(void)
*功 能: 《中断服务函数》
*入口 参数:
*说 明: PPP可以再“startup_stm32f10xhd.S”文件里找
*范 例: void PPP_IRQHandler(void){}
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void EXTI0_IRQHandler(void) //EXTI0中断服务函数
{
int i;
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断中断发生线
{
// 翻转I/O口
GPIO_WriteBit(GPIOA, GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)));
for(i=0;i<=800000;i++) //延时一会,不然看不到灯亮,不信可以试试
EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志
}
}
/*========================================================================================
*名 称: voidPPP_IRQHandler(void)
*功 能: 《中断服务函数》
*入口 参数:
*说 明: PPP可以再“startup_stm32f10xhd.S”文件里找
*范 例: void PPP_IRQHandler(void){}
*编者 时 间: Ye.FuYao 2012-9-23
*========================================================================================*/
void TIM2_IRQHandler(void) //TIM2中断服务函数
{
int i;
if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)!=RESET)
{
//翻转I/O口
GPIO_WriteBit(GPIOA,GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)));
for(i=0;i<=800000;i++) //延时一会,不然看不到灯亮,不信可以试试
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清标志
}
}