for(j=10000;j>0;j--);}
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
/*------使用外部RC晶振----------*/
RCC_DeInit(); //时钟默认初始化
RCC_HSEConfig(RCC_HSE_ON);//使能外部的高速时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待外部的高速时钟就绪
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预存取
FLASH_SetLatency(FLASH_Latency_2); //等待两个周期
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟为AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟为AHB/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //设置PLL时钟为外部高速时钟的9倍频
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL时钟使能就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置PLL时钟为系统时钟
while(RCC_GetSYSCLKSource()!=0x08); //等待PLL时钟作为系统时钟
}
/*******************************************************************************
* Function Name : void NVIC_Configuration(void)
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); //向量表存放在RAM中
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //向量表存放在FLASH中
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择向量优先级组
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //选择中断向量通道为定时器2的通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //亚优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //完成初始化
}
timer.c
/********************************************************************
* 文件 :timer.c
* 说明 :通过配置定时器相关寄存器的配置,实现定时器2每1S中断一次通过数码管将时间实时的显示出来
********************************************************************/
#include"stm32f10x_lib.h"
/******************************************************
* 函数名称 :void TIM_Configuration(void)
* 函数功能 :定时器的相关配置
* 入口参数 : 无
* 出口参数 :无
* 返回值 :无
******************************************************/
void TIM_Configuration(void)
{
/*-----------定义结构体变量----------------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
/*-----------Configures TIM2 -------------*/
TIM_TimeBaseStructure.TIM_Period = 2000; //下个更新事件发生时自动装载的周期值
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //时钟的分频值为35999,则时钟分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //输出比较时间模式
// TIM_OCInitStructure.TIM_Pulse = 0x0; //脉冲值 设置待转入捕获寄存器的脉冲值(定时器模式配置为输出比较模式)
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);//使能TIM2
TIM_PrescalerConfig(TIM2,35999,TIM_PSCReloadMode_Immediate);//让定时器预分频值立即装入
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能定时器中断
}
SMG_Display.c
#include"stm32f10x_lib.h"
/*---数码管从左至右为SMG1,SMG2,SMG3,SMG4,分别对应的GPIO引脚为PC8,PB15,PC9,PE8 --*/
/*-----------------数码管显示的数据(0~9)的段码-------------------*/
u8 const Display_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*-----------------外部函数的声明----------------------*/
extern void SPI_74HC595_Init(void);
extern void SPI_74HC595_SendData(u8 data);
/*******************************************************************************
* Function Name : void SMG_Init(void))
* Description : 对数码管的初始化
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SMG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
SPI_74HC595_Init(); //初始化595
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : void SMG_Bit(u8 data)
* Description : 选择数码管的位选
* Input : u8 data --------0x01:选择左边第一个数码管
0x02:第二个数码管
0x04:第三个数码管
0x08:第四个数码管
* Output : None
* Return : None
*******************************************************************************/
void SMG_Bit(u8 data)
{
if((data & 0x01)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_8);
else GPIO_SetBits(GPIOC,GPIO_Pin_8);
if((data & 0x02)!= 0) GPIO_ResetBits(GPIOB,GPIO_Pin_15);
else GPIO_SetBits(GPIOB,GPIO_Pin_15);
if((data & 0x04)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_9);
else GPIO_SetBits(GPIOC,GPIO_Pin_9);
if((data & 0x08)!= 0) GPIO_ResetBits(GPIOE,GPIO_Pin_8);
else GPIO_ResetBits(GPIOE,GPIO_Pin_8);
}
/*******************************************************************************
* Function Name : void SMG_Display(u32 data,u8 dot)
* Description :
* Input : data:
要显示的数据
dot:
显示小数点的位置
* Output : None
* Return : None
*******************************************************************************/
void SMG_Display(u32 data,u8 dot)
{
u32 one,ten,hundred,thousand; //个,十,百,千
u32 j,n;
thousand = data / 1000;
hundred = (data % 1000) / 100;
ten = (data % 100) / 10;
one = data % 10;
//----------------显示数据-------------------------
for(n=0;n<20;n++)
{
if(4==dot) SPI_74HC595_SendData(Display_TAB[thousand]&0x7f);
else SPI_74HC595_SendData(Display_TAB[thousand]);
SMG_Bit(0x01);
for(j=0;j<1500;j++);
SMG_Bit(0x00);
if(3==dot) SPI_74HC595_SendData(Display_TAB[hundred]&0x7f);
else SPI_74HC595_SendData(Display_TAB[hundred]);
SMG_Bit(0x02);
for(j=0;j<1500;j++);
SMG_Bit(0x00);
if(2==dot) SPI_74HC595_SendData(Display_TAB[ten]&0x7f);
else SPI_74HC595_SendData(Display_TAB[ten]);
SMG_Bit(0x04);
for(j=0;j<1500;j++);
SMG_Bit(0x00);
SPI_74HC595_SendData(Display_TAB[one]);
SMG_Bit(0x08);
for(j=0;j<1500;j++);
SMG_Bit(0x00);
}
}
/**************************************************************************
* 名称:NumbTube_Bit(uint8 data)
* 功能:选择数码管的位选。
* 入口参数: data 选择码