【STM32F0实验】电子时钟

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

步骤二:声明一个结构变量,用于存储初始化值。
  1. GPIO_InitTypeDef GPIO_InitStructure;

步骤三:为结构变量的每个结构成员赋值
  1. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
  2. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
  3. GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  4. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  5. GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;

步骤三:调用初始化函数进行初始化:
  1. GPIO_Init(GPIOA,&GPIO_InitStructure);

然后就可以进行GPIO的操作。

2.SysTick
我对SysTick的理解就是利用它可以方便的编写一个延时函数,而且延时函数的延时长短不会随着系统时钟的改变而改变,比起使用循环延时方便多了。下面是延时函数的完整程序:

  1. volatile uint32_t Timer1;
  2. void SysTick_Configuration(void)
  3. {
  4. if(SysTick_Config((SystemCoreClock)/1000)==1)
  5. {
  6.   while(1);
  7. }
  8. NVIC_SetPriority (SysTick_IRQn,0x00);
  9. }

  10. void SysTick_Handler(void)
  11. {
  12. if(Timer1) Timer1--;
  13. }

  14. void SysTickDelay(uint32_t delay_ms)
  15. {
  16. Timer1=delay_ms;
  17. while(Timer1);
  18. }

3.TIM3
使用定时器,首先也要按步骤进行初始化,和GPIO相似,不同的是最后要使用TIM_Cmd()进行使能,程序为:

  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  2. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  3. TIM_TimeBaseStructure.TIM_Period=40000;
  4. TIM_TimeBaseStructure.TIM_Prescaler=11;
  5.   TIM_TimeBaseStructure.TIM_ClockDivision=0;
  6.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

  7. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  8. TIM_Cmd(TIM3,ENABLE);

4.NVIC
STM32有着复杂的中断系统,而NVIC的存在为高效的处理中断提供了保证。要使用中断,首先也要对NVIC进行初始化。本程序没有过多的中断,所以相应的初始化也比较简单,按步骤进行即可:

  1. NVIC_InitTypeDef NVIC_InitStructure;

  2. NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  3.   NVIC_InitStructure.NVIC_IRQChannelPriority=0;
  4.   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  5.   NVIC_Init(&NVIC_InitStructure);

  6. TIM_ITConfig(TIM3,TIM_IT_CC3,ENABLE);


在对外设进行初始化之后,就可以方便的使用它们了。本程序的思路是利用TIM3产生20ms的中断,每次中断改变一次显示数据,这样可以产生点阵的动态显示效果。每次的动态显示需要1s完成。然后进行进位判断等实现电子时钟。工程的结构为:
p.JPG


 楼主| 357482894 发表于 2012-8-23 15:28 | 显示全部楼层
Timer.rar (1.46 MB, 下载次数: 880)

工程文件,欢迎批评建议。。。:P
香水城 发表于 2012-8-23 17:05 | 显示全部楼层
帮顶;P
gxgclg 发表于 2012-8-23 18:01 | 显示全部楼层
还不错,很有参考价值
sinadz 发表于 2012-8-23 18:08 | 显示全部楼层
很好的学习资料,鼓励共享
神韵1206 发表于 2015-11-24 14:06 | 显示全部楼层
多谢你的资料  参考一下
jndisheng 发表于 2017-6-16 15:18 | 显示全部楼层
不错,很有参考价值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:加油!

1

主题

756

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部