[牛人杂谈] 新唐使用笔记 - 使用 M051 设计一个计时器

[复制链接]
5531|20
 楼主| slotg 发表于 2015-4-6 09:33 | 显示全部楼层 |阅读模式
本帖最后由 slotg 于 2015-4-6 09:38 编辑

这个方案是使用新唐的 NuTiny-SDK-M051 开发板外接 MAX7219 显示模块做一个计时器,每10ms计数一次,并安排2个按键用来 开始/停止计时 与 归零计时 ,编写这个程序的目的是想熟悉 M051 的串行外设接口(SPI)与定时器 TIMER 中断的使用。

P01.JPG


M051 与 MAX7219 显示模块的连接:

P1.4 (SPISS0)    -> CS
P1.5 (MOSI_0)   -> DIN
P1.7 (SPICLK0)  -> CLK

MAX7219 规格书上写着最高时钟频率为10MHz,因此我们在程序中对于 SPI 的时钟频率也就设定为 10MHz。

  1. void SPI_Init(void)
  2. {
  3.     /* Configure as a master, clock idle low, 16-bit transaction, drive output on falling clock edge and latch input on rising edge. */
  4.     /* Set IP clock divider. SPI clock rate = 10MHz */
  5.     SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 16, 10000000);

  6.     /* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
  7.     SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);
  8. }

虽然我们设定了时钟频率是10MHz,不过 SPI_Open 函数会返回一个实际上运行的频率数据,为了查看这个返回值我们在程式调试时安排了一个全局变量 u32Test 来存放这个数据,并且在主回路中显示出来。在程序运行之后显示器上显示了 6000000,这表示实际运行的频率是 6MHz,由于手上没有量测工具因此也无法确定这个频率是否正确!

u32Test = SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 16, 10000000);

Ds_Data(u32Test);

P02.JPG

程序中使用了定时器 TIMER0 并设定每 10ms 中断一次,计时器的计数动作就放在 TIMER0 中断回路里面处理

  1. //  TIMER0 interrupt
  2. void TMR0_IRQHandler(void)
  3. {
  4.     /* Clear Timer0 time-out interrupt flag */
  5.     TIMER_ClearIntFlag(TIMER0);

  6.     if(fg_action)
  7.     {
  8.         Ds_Data(++u32Counter);
  9.     }
  10. }

规画2个按键,功能分别是:

开始/停止键     按一下开始计时再按一下停止计时,安排在 P3.2 管脚。
清零键             计时值清零,安排在 P3.3 管脚。

设定一个全局变量 fg_action 来指示计时器是否要计时,我们在主回路里面处理按键的判断与相应的动作。

  1.     ffg1 = ffg2 = FALSE;

  2.     while(1)
  3.     {
  4.         if(!P32)            // START/STOP KEY
  5.         {
  6.             if(!ffg1)
  7.             {
  8.                 fg_action = !fg_action;
  9.                 ffg1 = TRUE;
  10.             }
  11.             
  12.             CLK_SysTickDelay(20000);
  13.             while(!P32)     // wait KEY un_press
  14.             {
  15.                 CLK_SysTickDelay(20000);
  16.             }
  17.         }
  18.         else
  19.         {
  20.             ffg1 = FALSE;
  21.         }

  22.         if(!P33)            // RESET KEY
  23.         {
  24.             if(!fg_action && !ffg2)
  25.             {
  26.                 u32Counter = 0;
  27.                 Ds_Data(u32Counter);
  28.             }
  29.         }
  30.         else
  31.         {
  32.             ffg2 =FALSE;
  33.         }
  34.             
  35.     }

視頻演示:
http://v.youku.com/v_show/id_XOTI3OTIyOTY0.html

NuTiny-SDK-M051 開發板使用手冊
NuTiny-SDK-M051 User Manual EN V1.0.pdf (1 MB, 下载次数: 49)

工程文件,使用 KEIL 4.72 與 M051_Series_BSP_CMSIS_Rev3.00.002 庫
D004.rar (1.26 MB, 下载次数: 62)



稳稳の幸福 发表于 2015-4-6 14:06 | 显示全部楼层
原来这个东西Proteus里面有,不用买了,我仿真玩玩。
稳稳の幸福 发表于 2015-4-6 14:10 | 显示全部楼层
MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
稳稳の幸福 发表于 2015-4-6 14:10 | 显示全部楼层
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。 只有一个外部寄存器用来设置各个LED的段电流。 MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。
稳稳の幸福 发表于 2015-4-6 14:11 | 显示全部楼层
一个方便的四线串行接口可以联接所有通用的微处理器。 每个数据可以寻址在更新时不需要改写所有的显示。MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。 整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
稳稳の幸福 发表于 2015-4-6 14:11 | 显示全部楼层
功能特点

1 10MHz连续串行口
2 独立的LED段控制
3 数字的译码与非译码选择
4 150μA的低功耗关闭模式
5 亮度的数字和模拟控制
6 高电压中断显示
7 共阴极LED显示驱动
8 限制回转电流的段驱动来减少EMI(MAX7221)
9 SPI, QSPI, MICROWIRE串行接口(MAX7221)
10 24脚的 DIP和 SO 封装
稳稳の幸福 发表于 2015-4-6 14:11 | 显示全部楼层
芯片 工作温度范围 管脚封装
MAX7219CNG 0°C to +70°C 24 Narrow Plastic DIP
MAX7219CWG 0°C to +70°C 24 Wide SO
MAX7219C/D 0°C to +70°C Dice*
MAX7219ENG -40°C to +85°C 24 Narrow Plastic DIP
MAX7219EWG -40°C to +85°C 24 Wide SO
MAX7219ERG -40°C to +85°C 24 Narrow CERDIP
稳稳の幸福 发表于 2015-4-6 14:12 | 显示全部楼层
管脚 名称 功能
1 DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。 2,3,5-8,10,11 DIG 0–DIG7 八个数据驱动线路置显示器共阴极为低电平。关闭时7219此管脚输
出高电平,7221呈现高阻抗。
4,9 GND 地线 (4脚和9脚必须同时接地)
12 LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。
CS (MAX7221) 片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后
16位在cs端的上升沿时被锁定。
13 CLK 时钟序列输入端。最大速率为 10MHz.在时钟的上升沿, 数据移入内
部移位寄存器。 下降沿时, 数据从DOUT端输出。对MAX7221来
说,只有当cs端为低电平时时钟输入才有效。
14-17,20-23 SEG 7 段和小数点驱动,为显示器提供电流。当一个段驱
A–SEG G, 动关闭时,7219的此端呈低电平,7221呈现高阻抗。
DP
18 SET 通过一个电阻连接到VDD 来提高段电流。
19 V+ 正极电压输入,+5V
24 DOUT 串行数据输出端口,从DIN输入的数据在16.5个时钟周期后在此端有
效。当使用多个MAX7219/MAX7221时用此端方便扩展。
稳稳の幸福 发表于 2015-4-6 14:12 | 显示全部楼层
这个芯片很贵的,不过效果真的不错
 楼主| slotg 发表于 2015-4-6 14:47 | 显示全部楼层
稳稳の幸福 发表于 2015-4-6 14:12
这个芯片很贵的,不过效果真的不错

感谢资料补充
gaoyang9992006 发表于 2015-4-6 22:25 来自手机 | 显示全部楼层
这个东西是spi口呀
gaoyang9992006 发表于 2015-4-6 22:26 来自手机 | 显示全部楼层
去申请两个免费样片玩玩
lvyunhua 发表于 2015-4-7 09:13 | 显示全部楼层
:lol,不错,谢谢楼主分享!
 楼主| slotg 发表于 2015-4-7 09:35 | 显示全部楼层
lvyunhua 发表于 2015-4-7 09:13
,不错,谢谢楼主分享!

感谢支持
wejoncy 发表于 2015-4-7 10:45 | 显示全部楼层
感谢分享
稳稳の幸福 发表于 2015-4-9 14:47 | 显示全部楼层
gaoyang9992006 发表于 2015-4-6 22:26
去申请两个免费样片玩玩

这个学生比较好申请的,工作了不好办。
quray1985 发表于 2015-4-19 20:24 | 显示全部楼层
给的资料很详细
这样学习起来很方便呢
 楼主| slotg 发表于 2015-4-19 20:58 | 显示全部楼层
quray1985 发表于 2015-4-19 20:24
给的资料很详细
这样学习起来很方便呢

感谢支持 :handshake
玛尼玛尼哄 发表于 2016-1-31 10:41 | 显示全部楼层
MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。
yiyigirl2014 发表于 2016-1-31 13:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1177

帖子

6

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