OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2792|回复: 11

关于systick和systick-type

[复制链接]

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
发表于 2018-10-3 10:01:58 | 显示全部楼层 |阅读模式
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;                                         //时间加载                           
        SysTick->VAL=0x00;                                                //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数          
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        SysTick->VAL =0X00;                                               //清空计数器         
}
#define SysTick             ((SysTick_Type *)       SysTick_BASE)  将systick宏定义成结构体指针
CTRL是systick-tick的成员变量,为什么我将上面代码红色的systick改为systick-type会报错,显示类型名不被允许。请大佬解释下,感谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-10-3 10:07:09 | 显示全部楼层
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器,应该是将第零位清零
#define SysTick_CTRL_ENABLE_Pos             0                                            
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)     
顺便帮忙解释下后面两句,没明白1ul,也找不到它的定义。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 11:59:22 | 显示全部楼层
SysTick是指向结构体的指针,不是结构体,本质上是一个32位的地址,
SysTick_Type才是结构体,二者完全不同类型。
补一下C语言课程吧!
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 12:07:28 | 显示全部楼层
本帖最后由 warship 于 2018-10-3 12:13 编辑
wgb123 发表于 2018-10-3 10:07
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器,应该是将第零位清零
#define SysTick_CTRL_ENAB ...

1ul 就是无符号长整数1,你简单把它看成数值1就行了。
#define SysTick_CTRL_ENABLE_Pos             0
定义CTRL_ENABLE的比特位置:第0位

#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)
定义CTRL_ENABLE的掩码:0x00000001左移0位,还是0x00000001
~SysTick_CTRL_ENABLE_Msk反码后变成0xFFFFFFFE
它与SysTick->CTRL做&运算,使SysTick->CTRL其它位不变,第0位清零

请点击我底下签名的链接,关注一下。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-10-3 18:09:44 | 显示全部楼层
warship 发表于 2018-10-3 11:59
SysTick是指向结构体的指针,不是结构体,本质上是一个32位的地址,
SysTick_Type才是结构体,二者完全不 ...

  temp=SysTick->CTRL;
那这里怎么是systick,而不是systick-type
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 18:49:11 | 显示全部楼层
wgb123 发表于 2018-10-3 18:09
temp=SysTick->CTRL;
那这里怎么是systick,而不是systick-type

结构体的成员访问的主要方式有:
结构体地址->成员名
结构体变量 . 成员名
你所见到的就是标准的指针访问方式哦。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 18:56:42 | 显示全部楼层
本帖最后由 warship 于 2018-10-3 19:17 编辑

另外,无论如何,绝对不能用SysTick_Type来访问,因为它屁也没有!!!
SysTick_Type是数据类型,就像int一样。
你会写: int=5;这种语句吗?
正确方法是:必须先声明一个这种类型的实体变量, 比如:int a;  然后再用a=5;
结构体也一样,先声明一个实体结构,比如:SysTick_Type MySystick;  然后才能用:MySystick . CTRL=5;
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 19:07:41 | 显示全部楼层
本帖最后由 warship 于 2018-10-3 19:19 编辑

(接上楼)
具体到你楼上的代码,
你可以这样写:
SysTick_Type MySystick;
MySystick . CTRL=5;
或者:
SysTick_Type *pMySystick;
pMySystick->CTRL=5;
从语法上讲就没有错误了。
但是同样也是达不到目的的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 19:10:41 | 显示全部楼层
为什么呢?
因为这里是要对MCU的寄存器进行操作,
你申明一个SysTick_Type MySystick,
可以对成员进行正常读写,但访问的是内存中的一个结构体变量,影响不到寄存器。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 19:14:46 | 显示全部楼层
而原代码的定义是:
#define SysTick             ((SysTick_Type *)       SysTick_BASE)
这里的SysTick_BASE是一个具体的地址值,从这个地址开始就是 SysTick的各个寄存器。
所以对结构体指针所指向的成员的读写,才能达到读写具体寄存器的目的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-10-3 19:21:41 | 显示全部楼层
warship 发表于 2018-10-3 19:14
而原代码的定义是:
#define SysTick             ((SysTick_Type *)       SysTick_BASE)
这里的SysTic ...

谢谢了,我自己再看下。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-10-3 19:23:53 | 显示全部楼层
本帖最后由 warship 于 2018-10-3 19:31 编辑

改写成这样的话,就可以工作:
void delay_us(u32 nus)
{               
        u32 temp;
        SysTick_Type *pMySystick;
        pMySystick=SysTick_BASE;                    
        pMySystick->LOAD=nus*fac_us;                                         //时间加载                           
        pMySystick->VAL=0x00;                                                //清空计数器
        pMySystick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数         
        do
        {
                temp=pMySystick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        pMySystick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        pMySystick->VAL =0X00;                                               //清空计数器         
}

#define SysTick             ((SysTick_Type *)       SysTick_BASE)  这句就可以不要了,这句与 SysTick_Type *pMySystick;   pMySystick=SysTick_BASE;这两句等效
所以这么改基本相当于脱裤子放屁     
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 02:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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