打印
[技术问答]

M051最新bspCmsis的初步使用心得,自制GPIO简化设置宏函数.

[复制链接]
5771|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Harvard|  楼主 | 2013-10-26 22:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
近期因为开始真正的使用上新唐M051,开始领会到新唐M0尤其是M051的魅力所在.了解到官方的良苦用心. 体会了M0+51的独特魅力,没错,他就是为了搅局8位机市场而来,目标就是成为和8051媲美的单片机.他做到了.avr时代很多人, 觉得端口单独赋值不方便:举例-
两个液晶端口:
                      LCD_CLK  
                      LCD_DAT
要拉高高低,很多人用标C,PORTA|=(1<<LCD_CLK_BIT);这种方式, 后来我利用位域+宏函数,实现了很51下比较兼容的操作习惯.只要定义:
#define LCD_CLK    PORT(A,7)
#define LCD_DAT   PORT(A,6)
其中PORT(m,n) 为自己利用宏函数构造的宏,具体可以百度" 宏定义 avr io " 查看本人的实现办法.
这样,可以和51时代一样方便操作. LCD_CLK =1; 不同的是.51的端口定义方式是sbit LCD_CLK = Px.y; 在M0尤其是新唐M0可以实现这个目标吗:答案是YES
因为最新的M051系列bsp----M051SeriesBSP_CMSIS_v2.01.002,已经将这些定义都搞定了,如下图:



当然,使用这些GPIO,也就是普通io口钱,必须要把他们设定在GPIO模式,保证他们的其他功能,比如ad 串口,后者pwm 什么的 都没有开启.
这就要设置MFP寄存器:一般我们按照这样一个步骤来操作普通IO口,
void LED_Init(void)
{
        /* Configure P4.0 - P4.5 as GPIO mode */
        _SYS_P40_MFP(SYS_MFP_P40_GPIO);
        _SYS_P41_MFP(SYS_MFP_P41_GPIO);
        _SYS_P42_MFP(SYS_MFP_P42_GPIO);
        _SYS_P43_MFP(SYS_MFP_P43_GPIO);
        _SYS_P44_MFP(SYS_MFP_P44_GPIO);
        _SYS_P45_MFP(SYS_MFP_P45_GPIO);
       
        /* Configure P3.2 - P3.7 as GPIO mode */
        _SYS_P32_MFP(SYS_MFP_P32_GPIO);
        _SYS_P33_MFP(SYS_MFP_P33_GPIO);
        _SYS_P34_MFP(SYS_MFP_P34_GPIO);
        _SYS_P35_MFP(SYS_MFP_P35_GPIO);
        _SYS_P36_MFP(SYS_MFP_P36_GPIO);
        _SYS_P37_MFP(SYS_MFP_P37_GPIO);
       
        /* Configure P4.0 - P4.5 as Output mode */
    _GPIO_SET_PIN_MODE(P4, 0, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P4, 1, GPIO_PMD_OUTPUT);
        _GPIO_SET_PIN_MODE(P4, 2, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P4, 3, GPIO_PMD_OUTPUT);
        _GPIO_SET_PIN_MODE(P4, 4, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P4, 5, GPIO_PMD_OUTPUT);

        /* Configure P3.2 - P3.7 as Output mode */
        _GPIO_SET_PIN_MODE(P3, 2, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P3, 3, GPIO_PMD_OUTPUT);
        _GPIO_SET_PIN_MODE(P3, 4, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P3, 5, GPIO_PMD_OUTPUT);
        _GPIO_SET_PIN_MODE(P3, 6, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P3, 7, GPIO_PMD_OUTPUT);
       
        /* Configure P4.0 - P4.5 as HIGH */
        P40=P41=P42=P43=P44=P45=1;
        /* Configure P3.2 - P3.7 as HIGH */
        P32=P33=P34=P35=P36=P37=1;
}
1,首先,设置MFP为GPIO
2,其次,设定GPIO的PIN模式,是作为输出还是输入,还是双向,还是开漏;
3,最好就是可以对端口进行操作了.类似于51;
上面的三部曲,尤其是前2部曲,必须要要工具自己系统的原理图中的IO定义,不断地修改Pmn中的m和n ,比如这2个:
        _SYS_P40_MFP(SYS_MFP_P40_GPIO);
        _SYS_P41_MFP(SYS_MFP_P41_GPIO);
上面一句写完,下面的一句直接拷贝上面的,然后把语句中,所有的40改成41,除了这个MFP设置要改,后面的   
    _GPIO_SET_PIN_MODE(P4, 0, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P4, 1, GPIO_PMD_OUTPUT);

也要做响应改动. 如果IO多了 难免麻烦,枯燥,其实完全可以利用C的强大的宏来代替我们完成这些,如果如下这样,感觉就轻松多了.
        /* 1--Configure P0.1\P0.2\P0.3\P0.4\P0.5\ as GPIO mode
    *  meanwhile, set the PIN mode:
    */
    SET_MFP_GPIO(0,1,GPIO_PMD_QUASI);
    SET_MFP_GPIO(0,2,GPIO_PMD_QUASI );
    SET_MFP_GPIO(0,3,GPIO_PMD_QUASI);
    SET_MFP_GPIO(0,4,GPIO_PMD_INPUT);
    SET_MFP_GPIO(0,5,GPIO_PMD_INPUT);
,第一句写好,第二句,就是改1-2个数字的事情.非常方便,当然PIN的模式要改的时候,可以把后面的GPIO_PMD_QUASI,模式定义修改成其他的.这样操作几种很多了.SET_MFP_GPIO(m,n,mode) 这个函数帮了大忙. 这个函数本身还是借助于官方的Bsp ,只不过做了归纳总结.具体的技术细节如下:


/** 设置Pm.n的MFP为GPIO,且选择IO模式
*   1,Setting port_m的 pin_n引脚为GPIO
*   2,setting port_m的 pin_n引脚的输入输出模式pin mode
*/
#define SET_MFP_GPIO(port_m,pin_n,PINmode)                 _SYS_P##port_m##pin_n##_MFP(SYS_MFP_P##port_m##pin_n##_GPIO); \
                                                                                           _GPIO_SET_PIN_MODE(P##port_m, pin_n, PINmode)

主要是利用了宏链接符,##, 把原来的分散性的分布操作.集中起来.统一管理操作. 各位同学,觉得有用.可以 收藏一下.不增加代码,但是提高了便利性.






沙发
dong_abc| | 2013-10-27 06:00 | 只看该作者
非常好,前几天还在折腾##

使用特权

评论回复
板凳
Harvard|  楼主 | 2013-10-27 22:06 | 只看该作者
dong_abc 发表于 2013-10-27 06:00
非常好,前几天还在折腾##

##有时候很神奇 ,可以减少很多重复性劳动. 应对cortex里面,寄存器都是基于某个base 的 非常有用

使用特权

评论回复
地板
holts| | 2013-10-27 22:23 | 只看该作者
好阿,你改好了,打个包发上来,省得大家再去搞一次

使用特权

评论回复
5
Harvard|  楼主 | 2013-10-27 23:37 | 只看该作者
#define SET_MFP_GPIO(port_m,pin_n,PINmode)                 _SYS_P##port_m##pin_n##_MFP(SYS_MFP_P##port_m##pin_n##_GPIO); \
                                                                                           _GPIO_SET_PIN_MODE(P##port_m, pin_n, PINmode)

在总的头文件里面 添加这句就可以了.以后设定GPIO 就可以这样l
   _GPIO_SET_PIN_MODE(P4, 0, GPIO_PMD_OUTPUT);
    _GPIO_SET_PIN_MODE(P4, 1, GPIO_PMD_OUTPUT);

使用特权

评论回复
6
Harvard|  楼主 | 2013-10-27 23:39 | 只看该作者
如此. m051的IO操作就真的和51一样了.
你要判断P1.0口,只需 if( P10 ==1 ) { xxx ;} else { xxxx;}
如果要操作P1.0口拉高拉低,只需要 P10 =1 ; P10 = 0;

使用特权

评论回复
7
sdnumcu| | 2014-8-23 15:28 | 只看该作者
到手了,研究一下

使用特权

评论回复
8
Harvard|  楼主 | 2014-9-11 01:07 | 只看该作者
嘿嘿 恭喜 新唐玩了一下 还是非常好玩的  m051的bsp大多采用了 宏函数的形式,效率很高, 用起来方便, 比st的库简洁耐用些...

使用特权

评论回复
9
gaoyang9992006| | 2014-9-17 18:11 | 只看该作者
真不错,宏这个东西,用好了,方便很多,程序也看的明白。

使用特权

评论回复
10
mintspring| | 2014-9-17 18:12 | 只看该作者
复制到文本里,留着备用,谢谢。

使用特权

评论回复
11
598330983| | 2014-9-17 18:14 | 只看该作者
内容很好啊,楼主辛苦整理了,我复制到一个头文件里备用*.h

使用特权

评论回复
12
Harvard|  楼主 | 2014-9-17 22:04 | 只看该作者
感谢兄弟们. 希望能够带去一点便利. 能够用宏的地方,尽量去用,简化一下本来要重复书写的东东

使用特权

评论回复
13
niuyaliang| | 2014-9-17 23:03 | 只看该作者
新版的库,都是这个样子滴

使用特权

评论回复
14
Harvard|  楼主 | 2014-9-18 10:56 | 只看该作者
嘿嘿 我说的是这个宏.
   SET_MFP_GPIO(0,1,GPIO_PMD_QUASI);
    SET_MFP_GPIO(0,2,GPIO_PMD_QUASI );
    SET_MFP_GPIO(0,3,GPIO_PMD_QUASI);
    SET_MFP_GPIO(0,4,GPIO_PMD_INPUT);
    SET_MFP_GPIO(0,5,GPIO_PMD_INPUT);
,第一句写好,第二句,就是改1-2个数字的事情.非常方便,当然PIN的模式要改的时候,可以把后面的GPIO_PMD_QUASI,模式定义修改成其他的.这样操作几种很多了.SET_MFP_GPIO(m,n,mode) 这个函数帮了大忙. 这个函数本身还是借助于官方的Bsp ,只不过做了归纳总结.具体的技术细节如下:


/** 设置Pm.n的MFP为GPIO,且选择IO模式
*   1,Setting port_m的 pin_n引脚为GPIO
*   2,setting port_m的 pin_n引脚的输入输出模式pin mode
*/

自己做了这个组合之后, 代码更加简洁.


#define SET_MFP_GPIO(port_m,pin_n,PINmode)                 _SYS_P##port_m##pin_n##_MFP(SYS_MFP_P##port_m##pin_n##_GPIO); \
                                                                                           _GPIO_SET_PIN_MODE(P##port_m, pin_n, PINmode)

使用特权

评论回复
15
骗子的片子| | 2014-9-18 16:31 | 只看该作者
自己组合的库好简洁,一目了然

使用特权

评论回复
16
Harvard|  楼主 | 2014-9-18 17:50 | 只看该作者
哈哈 楼上识货. 感谢支持

使用特权

评论回复
17
HORSE7812| | 2014-11-6 09:48 | 只看该作者

使用特权

评论回复
18
astudent| | 2014-12-29 15:30 | 只看该作者
现在3.0的库出来了,风格又大变样了。

使用特权

评论回复
19
YingziSeek| | 2014-12-29 15:46 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:单片机工作者

74

主题

1729

帖子

21

粉丝