野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16864|回复: 5

请教关于SysTick例程的问题

[复制链接]
发表于 2018-1-18 22:42:27 | 显示全部楼层 |阅读模式
8火花
嘀嗒定时器的例程里面,在bsp_SysTick.c这个文件有个地方不是很明白。
源程序是这样写的:
  1. /**
  2.   ******************************************************************************
  3.   * @file    bsp_SysTick.c
  4.   * @author  fire
  5.   * @version V1.0
  6.   * @date    2015-xx-xx
  7.   * @brief   SysTick 系统滴答时钟10us中断函数库,中断时间可自由配置,
  8.   *          常用的有 1us 10us 1ms 中断。     
  9.   ******************************************************************************
  10.   * @attention
  11.   *
  12.   * 实验平台:秉火  STM32 F429 开发板
  13.   * 论坛    :http://www.firebbs.cn
  14.   * 淘宝    :https://fire-stm32.taobao.com
  15.   *
  16.   ******************************************************************************
  17.   */
  18.   
  19. #include "./systick/bsp_SysTick.h"

  20. static __IO u32 TimingDelay;

  21. /**
  22.   * @brief  启动系统滴答定时器 SysTick
  23.   * @param  无
  24.   * @retval 无
  25.   */
  26. void SysTick_Init(void)
  27. {
  28.         /* SystemFrequency / 1000    1ms中断一次
  29.          * SystemFrequency / 100000         10us中断一次
  30.          * SystemFrequency / 1000000 1us中断一次
  31.          */
  32.         if (SysTick_Config(SystemCoreClock / 100000))
  33.         {
  34.                 /* Capture error */
  35.                 while (1);
  36.         }
  37. }

  38. /**
  39.   * @brief   us延时程序,10us为一个单位
  40.   * @param  
  41.   *                @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
  42.   * @retval  无
  43.   */
  44. void Delay_us(__IO u32 nTime)
  45. {
  46.         TimingDelay = nTime;       

  47.         while(TimingDelay != 0);
  48. }

  49. /**
  50.   * @brief  获取节拍程序
  51.   * @param  无
  52.   * @retval 无
  53.   * @attention  在 SysTick 中断函数 SysTick_Handler()调用
  54.   */
  55. void TimingDelay_Decrement(void)
  56. {
  57.         if (TimingDelay != 0x00)
  58.         {
  59.                 TimingDelay--;
  60.         }
  61. }
  62. /*********************************************END OF FILE**********************/
复制代码
其中在定义TimingDelay的时候,为什么用了"static __IO u32 TimingDelay"的形式才能实现定时器的计数,不能直接写"static unsigned int TimingDelay"?
在网上查过u32等同于unsigned int,但是当我把TimingDelay的定义改成了"static unsigned int TimingDelay"之后,就不能计数了。
所以想请教一下,
1. "static __IO u32 TimingDelay"具体是什么含义?
2. "__IO"是否是STM32独有的命令,而不是C语言通用的命令?
3. 为什么改成"static unsigned int TimingDelay"之后,SysTick就不能正常计数了?

最佳答案

查看完整内容

"static __IO u32 TimingDelay"定义一个全局变量且只在本文件内有效,具有“volatile”属性,“volatile”自行百度,关键就是理解“volatile”的作用,希望能帮助你。。
回复

使用道具 举报

发表于 2018-1-18 22:42:28 | 显示全部楼层
"static __IO u32 TimingDelay"定义一个全局变量且只在本文件内有效,具有“volatile”属性,“volatile”自行百度,关键就是理解“volatile”的作用,希望能帮助你。。
005.PNG
回复

使用道具 举报

发表于 2018-1-19 08:26:00 | 显示全部楼层
知行天下 发表于 2018-1-19 08:24
"static __IO u32 TimingDelay"定义一个全局变量且只在本文件内有效,具有“volatile”属性,“volatile” ...

“__IO”在文件中有定义
回复

使用道具 举报

 楼主| 发表于 2018-1-21 00:12:50 来自手机 | 显示全部楼层
知行天下 发表于 2018-1-19 08:24
"static __IO u32 TimingDelay"定义一个全局变量且只在本文件内有效,具有“volatile”属性,“volatile” ...

受教了,非常感谢!话说,定义了IO的文件在哪里?
回复

使用道具 举报

 楼主| 发表于 2018-1-21 17:04:01 | 显示全部楼层
知行天下 发表于 2018-1-19 08:26
“__IO”在文件中有定义

关于volatile的内容已经懂了,非常感谢,另外请问这个__IO的定义在哪个文件里面?
回复

使用道具 举报

发表于 2018-1-22 08:11:10 | 显示全部楼层
如花 发表于 2018-1-21 17:04
关于volatile的内容已经懂了,非常感谢,另外请问这个__IO的定义在哪个文件里面?

在core_cm3.h文件中,你选中_IO这个变量,右键点击GO To Definition Of '_IO'会自动跳到变量定义处
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 12:11 , Processed in 0.033623 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表