打印

【STM32F0实验】电子时钟

[复制链接]
5455|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
357482894|  楼主 | 2012-8-23 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
拿到STM32F0板子好久了,参考官方例程和论坛上的资料,对STM32有了一定的了解。在学习了GPIO和定时器等相关外设后,开始着手做了个电子时钟。
这个小作品主要采用STM32F051串行控制16*16点阵和四位数码管显示时分秒,其中数码管显示时分,点阵显示秒钟。之间通过74HC595实现串行数据到并行数据的转换。秒钟的个位能动态显示,主要是数据的移位操作。实际的效果如下图所示:

电路图如下:

在程序设计方面,主要涉及GPIOSysTickTIM3NVIC。下面对这些外设简要介绍,也算是我对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完成。然后进行进位判断等实现电子时钟。工程的结构为:



沙发
357482894|  楼主 | 2012-8-23 15:28 | 只看该作者
Timer.rar (1.46 MB)

工程文件,欢迎批评建议。。。:P

使用特权

评论回复
板凳
香水城| | 2012-8-23 17:05 | 只看该作者
帮顶;P

使用特权

评论回复
地板
gxgclg| | 2012-8-23 18:01 | 只看该作者
还不错,很有参考价值

使用特权

评论回复
5
sinadz| | 2012-8-23 18:08 | 只看该作者
很好的学习资料,鼓励共享

使用特权

评论回复
6
神韵1206| | 2015-11-24 14:06 | 只看该作者
多谢你的资料  参考一下

使用特权

评论回复
7
jndisheng| | 2017-6-16 15:18 | 只看该作者
不错,很有参考价值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:加油!

1

主题

756

帖子

1

粉丝