你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM8-SO8】07-秒表计时器

[复制链接]
slotg 发布时间:2019-2-17 18:08
本帖最后由 slotg 于 2019-2-18 00:39 编辑

整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。

先建立一个显示的函数,参数为 0 时显示 0.00:
  1. // Display TIMER data
  2. void DS_TIMER(uint32_t dta)
  3. {
  4.   uint8_t buf[8];
  5.   int8_t x,y;
  6.   bool fg;

  7.   for(x=0; x<8; x++)
  8.   {
  9.     buf[x] = dta%10;
  10.     dta /= 10;
  11.   }

  12.   fg = FALSE;
  13.   for(x=7; x>=0; x--)
  14.   {
  15.     if(buf[x] != 0 || fg==TRUE || x<=2)
  16.     {
  17.       y = buf[x];
  18.       if(x==2)
  19.       {
  20.         y |= 0x80;
  21.       }
  22.       TX_MAX7219(x+1,y);
  23.       fg = TRUE;
  24.     }
  25.     else
  26.       TX_MAX7219(x+1,0x0f);
  27.   }
  28. }
复制代码

按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。

TIM4 中断程序:
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
  2. {
  3.   static uint8_t x;
  4.   
  5.   // for TIMER count
  6.   if(fg_action)
  7.   {
  8.     if(++x >= 05)
  9.     {
  10.       x = 0;

  11.       tmr_cnt++;
  12.       fg_ref_tmr = TRUE;
  13.     }
  14.   }

  15.   // for key sw
  16.   if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
  17.   {
  18.     key1_cnt = 0;
  19.   }
  20.   else
  21.   {
  22.     if(key1_cnt != 0xff)
  23.       key1_cnt++;
  24.   }

  25.   if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))
  26.   {
  27.     key2_cnt = 0;
  28.   }
  29.   else
  30.   {
  31.     if(key2_cnt != 0xff)
  32.       key2_cnt++;
  33.   }

  34.   /* Clear Interrupt Pending bit */
  35.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  36. }
复制代码

main 回圈:
  1. void main(void)
  2. {
  3.   /* -------------STM8S001 startup-------------- */
  4.   /* delay for SWIM connection: ~5seconds */
  5.   STARTUP_SWIM_DELAY_5S;
  6.   
  7.   /* configure unbonded pins */
  8.   CONFIG_UNUSED_PINS_STM8S001;
  9.   
  10.   GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);     // NSS
  11.   GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
  12.   
  13.   GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin1
  14.   GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);     // pin6
  15.   /* ------------------------------------------- */

  16.   /*High speed internal clock prescaler: 1*/
  17.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

  18.   /* TIM4 configuration -----------------------------------------*/
  19.   TIM4_Config();

  20.   /* SPI configuration */
  21.   SPI_DeInit();

  22.   /* Initialize SPI in Slave mode  */
  23.   SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
  24.            SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);

  25.   /* Enable the SPI*/
  26.   SPI_Cmd(ENABLE);

  27.   MAX7219_Init();       // Init MAX7219
  28.   Blank_SEG();          // Blanking SEGMENT  

  29.   fg_action = FALSE;
  30.   fg_ref_tmr = TRUE;
  31.   tmr_cnt = 0;

  32.   while (1)
  33.   {
  34.     if(fg_ref_tmr)
  35.     {
  36.       fg_ref_tmr = FALSE;
  37.       DS_TIMER(tmr_cnt);
  38.     }
  39.    
  40.     if(key1_cnt == 10)          // pin1
  41.     {
  42.       key1_cnt++;

  43.       if(fg_action)
  44.         fg_action = FALSE;
  45.       else
  46.         fg_action = TRUE;
  47.     }

  48.     if(key2_cnt == 10)          // pin6
  49.     {
  50.       key2_cnt++;

  51.       fg_action = FALSE;
  52.       tmr_cnt = 0;
  53.       fg_ref_tmr = TRUE;
  54.     }
  55.   }
  56. }
复制代码

程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:

P01.jpg
wpu = weak pull-up

原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。

运行结果:
20190217180932 00_00_00-00_00_10.gif

源代码:
B09.rar (1.07 MB, 下载次数: 8)
收藏 评论4 发布时间:2019-2-17 18:08

举报

4个回答
STMCU 回答时间:2019-2-18 15:54:17
谢谢楼主分享
slotg 回答时间:2019-2-18 22:09:50

感谢关注
Kevin201707 回答时间:2019-2-19 11:41:47
支持一下
slotg 回答时间:2019-2-19 11:50:58

感谢关注

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版