查看: 6979|回复: 2

[原创] 新唐使用笔记 - 使用 M051 设计一个计时器

[复制链接]
  • TA的每日心情
    开心
    2021-12-10 15:56
  • 签到天数: 2675 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-4-6 09:52:21 | 显示全部楼层 |阅读模式
    分享到:
    这个方案是使用新唐的 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.     flg1 = flg2 = FALSE;

    2.     while(1)
    3.     {
    4.         if(!P32)            // START/STOP KEY
    5.         {
    6.             if(!flg1)
    7.             {
    8.                 fg_action = !fg_action;
    9.                 flg1 = 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.             flg1 = FALSE;
    21.         }

    22.         if(!P33)            // RESET KEY
    23.         {
    24.             if(!fg_action && !flg2)
    25.             {
    26.                 u32Counter = 0;
    27.                 Ds_Data(u32Counter);
    28.             }
    29.         }
    30.         else
    31.         {
    32.             flg2 =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, 下载次数: 11)
    回复

    使用道具 举报

  • TA的每日心情

    2021-12-7 12:35
  • 签到天数: 1354 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-4-6 11:35:25 | 显示全部楼层
    设计的好,参考和学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-4-6 15:37:52 | 显示全部楼层
    谢谢分享学习一下
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-11 22:45 , Processed in 0.118014 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.