OpenEdv-开源电子网

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

STM32学了一个星期了,这是我对操作单片机的个人一点理解,请大神看一下这个理解对吗?

[复制链接]

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-3-1 16:56:29 | 显示全部楼层 |阅读模式
1金钱
目前C语言基础还比较差,对结构体、指针什么的内容只是停留在知道的层面,却还不会用。
比如下面这些:
#define TIM2                ((TIM_TypeDef *) TIM2_BASE)
#define TIM3                ((TIM_TypeDef *) TIM3_BASE)
#define TIM4                ((TIM_TypeDef *) TIM4_BASE)
#define TIM5                ((TIM_TypeDef *) TIM5_BASE)
#define TIM6                ((TIM_TypeDef *) TIM6_BASE)
#define TIM7                ((TIM_TypeDef *) TIM7_BASE)
#define TIM12               ((TIM_TypeDef *) TIM12_BASE)
#define TIM13               ((TIM_TypeDef *) TIM13_BASE)
#define TIM14               ((TIM_TypeDef *) TIM14_BASE)



是结构体指针?求个大神来讲解下
QQ截图20160301165633.jpg

最佳答案

查看完整内容[请看2#楼]

举例: 根据3.3 Memory map, GPIO Port A的基地址是0x40010800 而GPIOx_ODR的地址偏移是0x0C, 所以如果想将GPIOA的16个引脚都输出为1可以立即得如下代码: [mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFFFF;[/mw_shl_code] 高八位置1,低八位置0,则是: [mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFF00;[/mw_shl_code] 由上可以看出,想要操作寄存器 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-1 16:56:30 | 显示全部楼层
举例:

根据3.3 Memory map,
GPIO Port A的基地址是0x40010800

a.png

而GPIOx_ODR的地址偏移是0x0C,

c.png


所以如果想将GPIOA的16个引脚都输出为1可以立即得如下代码:

[mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFFFF;[/mw_shl_code]
高八位置1,低八位置0,则是:
[mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFF00;[/mw_shl_code]

由上可以看出,想要操作寄存器还得找基地址,找偏移地址,作地址转换等等,非常麻烦
而STM32提供的头文件可以将上述过程大大简化:

[mw_shl_code=c,true]GPIOA->ODR = 0xFFFF;[/mw_shl_code]

[mw_shl_code=c,true]GPIOA->ODR = 0xFF00;[/mw_shl_code]



------分割线--------

你可以对GPIOA跟踪,找到它最终的定义所在:

[mw_shl_code=c,true]#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)


#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)


#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)


#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */


typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;[/mw_shl_code]


------分割线-------

如果依然看不明白结构体与GPIO寄存器的关系,
就得回去重新学习一下指针和结构体。



坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-3-1 21:29:49 | 显示全部楼层
..........
回复

使用道具 举报

2

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2015-11-2
在线时间
58 小时
发表于 2016-3-1 21:43:40 | 显示全部楼层
我个人的理解就是,TIM2_BASE对应的地址强制转化为TIM_TypeDef的结构体指针。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-2-6
在线时间
13 小时
发表于 2016-3-1 21:50:46 | 显示全部楼层
同楼上, 将TIM2_BASE对应的地址强制转化为TIM_TypeDef的结构体指针,并将其名字定为TIM2, 然后你可以通过 TIM2->Cnt(假设)访问各个寄存器了。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-1 22:29:41 | 显示全部楼层
xkwy 发表于 2016-3-1 22:27
举例:

根据3.3 Memory map,

至于库函数,则是进一步再加工,连寄存器都不用去找了,几乎是直接用英语编程
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-3-1 22:37:23 | 显示全部楼层
xkwy 发表于 2016-3-1 22:29
至于库函数,则是进一步再加工,连寄存器都不用去找了,几乎是直接用英语编程

讲的好详细,谢谢!!!    (volatile uint32_t *) iIPCGRInfo[iNextCore]的意思是把指针转换为volatile uint32_t类型的指针?是这个意思吗?
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-1 23:32:41 | 显示全部楼层
xkwy 发表于 2016-3-1 22:27
举例:

根据3.3 Memory map,

我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2016-3-1
在线时间
17 小时
发表于 2016-3-2 07:57:03 | 显示全部楼层
欧来看看
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2016-3-2 08:31:02 | 显示全部楼层
。。。C基础而已
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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