论坛风格切换切换到宽版
  • 5511阅读
  • 16回复

准备改用stm32 [复制链接]

上一主题 下一主题
离线XLDZZ
 
发帖
443
只看楼主 倒序阅读 0楼 发表于: 2011-02-14
最近做些东西 本来用pic16不够用了(速度达不到)
后来使用dsp 现在感觉dsp好贵(60元一片,还16位的)

后来和坛内的朋友聊天,说stm便宜(而且32位 性能也不差)
所以准备改用stm32

只是在以前的编程中 没有碰到一些比较复杂的宏定义,现在遇到些
看不懂的宏定义 特来请教坛内的弟兄们

#define      led4      3      //pe3 ------这个我理解
是把3用 led4代替

#define get_sw2() ((gpiob->idr >> sw2) & 0x01)
这个我就不理解了 看上去像个函数的定义 但后面那个不知道 是什么东西
而且有个->是什么意思 还有为什么前面是(( 后面是)

extern void       stm32_init   (void);
这个是指引用外部函数 void stm32_init(void)是void型的

extern unsigned int stm32_getpclk1 (void);
这个是指实参是unsigned的 但形参是void型的吗????
离线xiongjunfeng
发帖
1220
只看该作者 1楼 发表于: 2011-02-14
周立功现在主推m0系列arm,c51的价格。
离线BD7QX
发帖
299
只看该作者 2楼 发表于: 2011-02-14
#define get_sw2() ((gpiob->idr >> sw2) & 0x01)
这个定义的本意是指读取pb口的sw2开关所指定的某个io口的电平,得到的结果是0或1,但是写法上可能还有欠缺,sw2不知有定义了没?正确的写法最好是:
#define get_sw2(x) ((gpiob->idr >> x) & 0x01)
其中gpiob->idr 是指pb口的输入口的地址,x=0--15之间。
离线XLDZZ
发帖
443
只看该作者 3楼 发表于: 2011-02-14
'
#define get_sw2() ((gpiob->idr >> sw2) & 0x01)
这个定义的本意是指读取pb口的sw2开关所指定的某个io口的电平,得到的结果是0或1,但是写法上可能还有欠缺,sw2不知有定义了没?正确的写法最好是:
#define get_sw2(x) ((gpiob->idr >> x) & 0x01)
其中gpiob->idr 是指pb口的输入口的地址,x=0--15之间。
'

那是不是可以这么理解
1.这是个宏定义
2.#define get_sw2() 相当于一个函数
而这个函数的功能就是后面的((gpiob->idr >> x) & 0x01)

3.((gpiob->idr >> x) & 0x01) 这个就是对2的说明 是指gpiob的输入
数据寄存器(idr)的某位和1相与运算 得到某位的1个bit的值

前面是两个((   而后面只有一个)是什么意思呢 是否说可以省略一个)
离线BD7QX
发帖
299
只看该作者 4楼 发表于: 2011-02-14
'
那是不是可以这么理解
1.这是个宏定义
2.#define get_sw2() 相当于一个函数
而这个函数的功能就是后面的((gpiob->idr >> x) & 0x01)
3.((gpiob->idr >> x) & 0x01) 这个就是对2的说明 是指gpiob的输入
数据寄存器(idr)的某位和1相与运算 得到某位的1个bit的值
前面是两个((   而后面只有一个)是什么意思呢 是否说可以省略一个)
'

1、2的表示是对的。
(gpiob->idr >> x)的功能是把pb口右移x位,就是把想读取的第x位移到最低位d0,然后&0x01把d1-d31位全清0,只留下d0是有效的,这样得到的结果就是0或1了。
而(( 是和后面的))是配对的,不能省略一个),这也是算术运算优先级的一种表示方式。
离线ba6iv
发帖
1286
只看该作者 5楼 发表于: 2011-02-15
'

#define get_sw2() ((gpiob->idr >> sw2) & 0x01)
这个我就不理解了 看上去像个函数的定义 但后面那个不知道 是什么东西
而且有个->是什么意思 还有为什么前面是(( 后面是)
extern void       stm32_init   (void);
这个是指引用外部函数 void stm32_init(void)是void型的
extern unsigned int stm32_getpclk1 (void);
这个是指实参是unsigned的 但形参是void型的吗????
'

#define get_sw2() ((gpiob->idr >> sw2) & 0x01)
re:带参数的宏定义,注意这不是函数,它会在预编译时替换。

extern void       stm32_init   (void);
re:函数被外部模块引用时的声明。

extern unsigned int stm32_getpclk1 (void);
re:声明一个返回值为无符号整型的函数。
离线XLDZZ
发帖
443
只看该作者 6楼 发表于: 2011-02-15
gpioa->crl |= (value << (gpio * 4));
是这样理解吗?

1.先做gpio*4运算
2.然后移位 vaule位
3gpio下的crl寄存器(分量运算)先或上第二步得到得值 然后再等于该值

#define rcc_csr_lsion       ((unsigned long)0x00000001)
这个是定义rcc_csr_lsion等于无符号长整数16进制数1吗?
离线BD7QX
发帖
299
只看该作者 7楼 发表于: 2011-02-15
'
gpioa->crl |= (value << (gpio * 4));
是这样理解吗?
1.先做gpio*4运算
2.然后移位 vaule位
3gpio下的crl寄存器(分量运算)先或上第二步得到得值 然后再等于该值
#define rcc_csr_lsion       ((unsigned long)0x00000001)
这个是定义rcc_csr_lsion等于无符号长整数16进制数1吗?
'
正确
离线BH7OJ
发帖
3093
只看该作者 8楼 发表于: 2011-02-15
stm32配置比较好的,一样贵,
我们用的一种,忘记后缀了,一片48rmb
离线XLDZZ
发帖
443
只看该作者 9楼 发表于: 2011-02-16
define get_sw2() ((gpiob->idr >> sw2) & 0x01)
re:带参数的宏定义,注意这不是函数,它会在预编译时替换。

那它和函数有什么区别呢 函数可以带参数 带返回值
这儿不能带返回值吗 在预编译时就直接用汇编代码代替吗???
离线BD7QX
发帖
299
只看该作者 10楼 发表于: 2011-02-17
'
define get_sw2() ((gpiob->idr >> sw2) & 0x01)
re:带参数的宏定义,注意这不是函数,它会在预编译时替换。
那它和函数有什么区别呢 函数可以带参数 带返回值
这儿不能带返回值吗 在预编译时就直接用汇编代码代替吗???
'
get_sw2()这个宏定义在你程序里就是((gpiob->idr >> sw2) & 0x01)了,宏定义其实只是表达式在程序书写上的缩写而以,方便程序员偷懒。当编译的时候,编译器还是会把get_sw2()替换为((gpiob->idr >> sw2) & 0x01);而函数则是为完成某个功能而写的代码,和宏定义是不一样的。
离线XLDZZ
发帖
443
只看该作者 11楼 发表于: 2011-02-19
/* register rcc_cfgr -------*/
#define rcc_cr_hsion       ((unsigned long)0x00000001)
#define rcc_cr_hsirdy       ((unsigned long)0x00000002)
#define rcc_cr_hseon       ((unsigned long)0x00010000)
#define rcc_cr_hserdy       ((unsigned long)0x00020000)
#define rcc_cr_pllon       ((unsigned long)0x01000000)
#define rcc_cr_pllrdy       ((unsigned long)0x02000000)

1:这里是直接给寄存器赋值吗?
我使用的是keil uv3但我没有在相关h头文件里找到
上面相关的寄存器的地址定义 这些是keil自己定义
好的直接引用吗???

define __gpio_used           ((1 << 0) | (1 << 1) | (1 << 4))//0x07
2:这里不明白什么意思
#define __gpioa_crl           0x00000000
这里的寄存器赋值怎么和上面的不一样
3:上面的没有__ 这里有是什么作用
离线BD7QX
发帖
299
只看该作者 12楼 发表于: 2011-02-19
'
/* register rcc_cfgr -------*/
#define rcc_cr_hsion       ((unsigned long)0x00000001)
#define rcc_cr_hsirdy       ((unsigned long)0x00000002)
#define rcc_cr_hseon       ((unsigned long)0x00010000)
#define rcc_cr_hserdy       ((unsigned long)0x00020000)
#define rcc_cr_pllon       ((unsigned long)0x01000000)
#define rcc_cr_pllrdy       ((unsigned long)0x02000000)
1:这里是直接给寄存器赋值吗?
我使用的是keil uv3但我没有在相关h头文件里找到
上面相关的寄存器的地址定义 这些是keil自己定义
好的直接引用吗???
define __gpio_used           ((1 << 0) | (1 << 1) | (1 << 4))//0x07
2:这里不明白什么意思
#define __gpioa_crl           0x00000000
这里的寄存器赋值怎么和上面的不一样
3:上面的没有__ 这里有是什么作用
'
唉,摊到你这样的一个学生,真是吐血啊。上面所有的宏定义都不表示“赋值”,而是表示为一个常数。看来你得要找一本c语言的书好好看一看了。
离线XLDZZ
发帖
443
只看该作者 13楼 发表于: 2011-02-19
是啊 我要找本c的书好好看看

基础有差了点
离线shl
发帖
561
只看该作者 14楼 发表于: 2011-02-20
#define a b 表示用a代替b
离线ba6iv
发帖
1286
只看该作者 15楼 发表于: 2011-02-21
宏定义就是缩写,你就把它理解成cw通联时为了方便的缩语就行了,比如说tks = thanks,实际我们读的时候还是读“三克斯”,you know?
离线代洪波
发帖
4809
只看该作者 16楼 发表于: 2011-02-28
学习的态度还是很不错的。不过我也是入门级的理解。看见等号的东西,直接拿来用就完事,理解那么多干嘛,吧程序主体的思路写出来就好了。