- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
步骤二:声明一个结构变量,用于存储初始化值。
- GPIO_InitTypeDef GPIO_InitStructure;
步骤三:为结构变量的每个结构成员赋值
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
步骤三:调用初始化函数进行初始化:
- GPIO_Init(GPIOA,&GPIO_InitStructure);
然后就可以进行GPIO的操作。
2.SysTick
我对SysTick的理解就是利用它可以方便的编写一个延时函数,而且延时函数的延时长短不会随着系统时钟的改变而改变,比起使用循环延时方便多了。下面是延时函数的完整程序:
-
- volatile uint32_t Timer1;
- void SysTick_Configuration(void)
- {
- if(SysTick_Config((SystemCoreClock)/1000)==1)
- {
- while(1);
- }
- NVIC_SetPriority (SysTick_IRQn,0x00);
- }
- void SysTick_Handler(void)
- {
- if(Timer1) Timer1--;
- }
- void SysTickDelay(uint32_t delay_ms)
- {
- Timer1=delay_ms;
- while(Timer1);
- }
3.TIM3
使用定时器,首先也要按步骤进行初始化,和GPIO相似,不同的是最后要使用TIM_Cmd()进行使能,程序为:
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- TIM_TimeBaseStructure.TIM_Period=40000;
- TIM_TimeBaseStructure.TIM_Prescaler=11;
- TIM_TimeBaseStructure.TIM_ClockDivision=0;
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
-
- TIM_Cmd(TIM3,ENABLE);
4.NVIC
STM32有着复杂的中断系统,而NVIC的存在为高效的处理中断提供了保证。要使用中断,首先也要对NVIC进行初始化。本程序没有过多的中断,所以相应的初始化也比较简单,按步骤进行即可:
-
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- TIM_ITConfig(TIM3,TIM_IT_CC3,ENABLE);
在对外设进行初始化之后,就可以方便的使用它们了。本程序的思路是利用TIM3产生20ms的中断,每次中断改变一次显示数据,这样可以产生点阵的动态显示效果。每次的动态显示需要1s完成。然后进行进位判断等实现电子时钟。工程的结构为: