拿到STM32F0板子好久了,参考官方例程和论坛上的资料,对STM32有了一定的了解。在学习了GPIO和定时器等相关外设后,开始着手做了个电子时钟。
这个小作品主要采用STM32F051串行控制16*16点阵和四位数码管显示时分秒,其中数码管显示时分,点阵显示秒钟。之间通过74HC595实现串行数据到并行数据的转换。秒钟的个位能动态显示,主要是数据的移位操作。实际的效果如下图所示:
电路图如下:
在程序设计方面,主要涉及GPIO、SysTick、TIM3及NVIC。下面对这些外设简要介绍,也算是我对STM32F的学习总结.。
1.GPIO
从管脚图可以看出,除了电源等管脚外,几乎所有的管脚都可以用作GPIO,可以说是相当的丰富。每个GPIO还可以配置成多种模式以适应不同的应用。
对GPIO的简单操作无非是置位和复位,这时可以使用GPIO_SetBits()和GPIO_ResetBits()函数,也可以直接操作寄存器BSRR和BRR。
在操作GPIO之前,需要进行相应的初始化操作,操作步骤为:
步骤一:使能相应的时钟
可以通过查阅系统框图找到外设所在的总线。GPIO位于AHB2总线上,使能时钟语句可以写作:
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完成。然后进行进位判断等实现电子时钟。工程的结构为:
|