【原创】《wdxLib_for_GD32F103》驱动开发(V0.1提供高质量源代码)

[复制链接]
楼主: 周立功GD32
手机看帖
扫描二维码
随时随地手机跟帖
周立功GD32|  楼主 | 2013-7-15 08:59 | 显示全部楼层
今天新增:(06)GPIO中断
原先的GPIO驱动已经指明不包括“中断与事件控制(EXTI)”部分,现在补上
应用方法很简单,重点看wdxGPIO.h里的注释

【示例】
void PA2_ISR(void)
{
    LedToggle();
}
void exam__GpioIntConfig(void)
{
    //  使能并配置PA2为弱上拉输入
    gpioPeriphInit(GPIOA);
    gpioPinConfig(GPIOA, PIN2, GPIO_MODE_IN_PU);
    //  中断注册、使能
    gpioIntRegist(GPIOA, PIN2, PA2_ISR);
    gpioIntEnable(GPIOA, PIN2, 3);
    //  EXTI使能:中断模式、负边沿有效
    gpioExtiEnable(GPIOA, PIN2, GPIO_EXTI_INT, GPIO_EDGE_NEG);
}

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-15 09:00 | 显示全部楼层
这里的 gpioExtiEnable() 函数相当于中断配置(gpioIntConfig)

使用特权

评论回复
rainbow99| | 2013-7-15 09:44 | 显示全部楼层
周立功GD32 发表于 2013-7-15 08:38
应用工程师想用好STM固件库必须要探究底层硬件才行,因为它不是面向上层应用的驱动库。
现在我做的这个库是 ...

好像不是这样的吧,TI M3和STM32的库,只是不同的风格而已,用起来都很方便,上手都很容易。。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-15 09:49 | 显示全部楼层
我这又不是TI M3的库(顶多有些类似),先不要忙着下结论,到楼顶下载附件,好好看看上层应用部分的代码就知道这个库的简易性了

使用特权

评论回复
rainbow99| | 2013-7-15 09:53 | 显示全部楼层
周立功GD32 发表于 2013-7-15 09:49
我这又不是TI M3的库(顶多有些类似),先不要忙着下结论,到楼顶下载附件,好好看看上层应用部分的代码就 ...

我看了就像是封装成TI M3库的样子,TI M3我之前用的很熟。
TI M3的确入手比较简单,但ST的库也不差吧,不然怎么能火起来,那么多同学都用的很溜。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-15 09:55 | 显示全部楼层
ST火起来的原因根本不是技术问题,而是价格、销售策略,这个才是致命性的!
现在GD32出来了,根本杀伤性因素还是低廉的价格(如果技术非常先进,但是死贵,你说谁会用?)

使用特权

评论回复
rainbow99| | 2013-7-15 09:59 | 显示全部楼层
周立功GD32 发表于 2013-7-11 10:53
系统时钟配置示例:

    //  设置系统时钟(48MHz主频)

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ |
                   SYSCTL_OSC_MAIN);

    ulClockMS = SysCtlClockGet() / (3 * 1000);
看看TI M3的函数,包括sysClockGet()不就是SysCtlClockGet()吗?
您在ST库上在封装一层,意义大吗?ST的库用起来也别有味道的。

使用特权

评论回复
rainbow99| | 2013-7-15 10:03 | 显示全部楼层
周立功GD32 发表于 2013-7-15 09:55
ST火起来的原因根本不是技术问题,而是价格、销售策略,这个才是致命性的!
现在GD32出来了,根本杀伤性因 ...

您说的我不完全认可,TI M3真的比STM32贵吗?Atmel、NXP、FSL、富士通的M3比STM32贵吗?
这个是综合因素,技术和质量、第三方资源、全面的产品线布局,再加上价格等等众多因素合力的结果。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-15 10:19 | 显示全部楼层
跑题了,以后只讨论《wdxLib_for_GD32F103》本身的问题,对于此库用还是不用,由大家自己决定

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-17 09:01 | 显示全部楼层
本帖最后由 周立功GD32 于 2013-7-17 09:04 编辑

今天新增:(07)Sleep模式与唤醒

SysMode模块负责管理系统的低功耗,目前仅实现Sleep模式(睡眠),Stop和Standby模式待以后添加(涉及RTC等功能)。

一旦调用sysModeSleep()函数,处理器即进入Sleep模式,CPU时钟停止,节省大部分功耗。但片内外设(包括NVIC及SysTick)仍可正常工作。通过任意中断或GPIO外部边沿事件均能唤醒处理器(所以在进入之前必须先要配置好相关中断或事件)。Sleep模式在应用当中是很常见的。

【示例】
void myISR(void)
{
    LedToggle();
}
void exam__sysModeSleep(void)
{
    sysTickInit();
    sysTickIntRegist(myISR);
    sysTickLoadRun(sysTickClockGet() / 10);     //  每秒钟中断10次
    for (;;) {
        sysModeSleep(SYS_WAKEUP_INT);           //  进入Sleep模式,SysTick中断唤醒
    }
}
程序运行的结果是:LED每秒钟闪烁5次

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-17 09:25 | 显示全部楼层
郑重声明:我的这个《wdxLib_for_GD32F103》是潜心研究原创的东西,完全跟所谓的TI M3驱动库毫无关系!

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-17 09:30 | 显示全部楼层
rainbow99 发表于 2013-7-15 09:59
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ |
                   SYSCT ...

为了免得初学者被误导,在此要说明一下:我的《wdxLib_for_GD32F103》是原创的,跟其它公司的驱动库毫无关系。
就说sysClockSet()和sysClockGet()函数,是我自己发明的函数名称及参数接口,与TI M3库的函数其实差异挺大的,函数名、参数接口、内部处理均不相同,所以没有什么可比性。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 09:21 | 显示全部楼层
今天新增:(08)SoftTMR软件定时器

●这是利用硬件定时器扩展出的多个简易软件定时器,有以下主要特性:
    ·接口友好,用法简易
    ·时基规定为1ms
    ·默认8个定时器(可定义成更多)
    ·32位,倒计时
    ·溢出自动重装,并产生软件中断
    ·各定时器独立运作
    ·以毫秒为单位的延时函数
    ·用途广泛:大范围延时,动态数码管,键盘扫描,无需OS的多任务软件架构,等等
由于软件定时器本身无法产生1ms时基信号,所以必须由另外的硬件定时器提供支持,详见tmrTick()函数

【示例】毫秒级延时
{
    //  初始化
    sysTickInit();                              //  SysTick(系统节拍定时器)初始化
    tmrInit();                                  //  软件定时器初始化(基于SysTick)
    sysTickIntRegist(tmrTick);                  //  用SysTick毫秒中断来驱动软件定时器节拍
    sysTickLoadRun(sysTickClockGet() / 1000);   //  设定为每1ms溢出一次,并产生中断
    LedInit();

    //  循环:控制LED闪烁
    for (;;) {
        LedOn();    tmrDelay(100);              //  tmrDelay()为毫秒级延时函数,在等待期间自动节省功耗
        LedOff();   tmrDelay(900);
    }
}

【示例】控制2只LED独立闪烁
{
    int8_t  Ta, Tb;

    //  初始化
    sysTickInit();                              //  SysTick(系统节拍定时器)初始化
    tmrInit();                                  //  软件定时器初始化(基于SysTick)
    sysTickIntRegist(tmrTick);                  //  用SysTick毫秒中断来驱动软件定时器节拍
    sysTickLoadRun(sysTickClockGet() / 1000);   //  设定为每1ms溢出一次,并产生中断
    LedInit();

    //  申请软件定时器
    Ta = tmrAlloc();                            //  申请一个软件定时器(将控制LED1)
    Tb = tmrAlloc();                            //  再申请一个软件定时器(Tb不会等于Ta)

    //  启动软件定时器
    tmrLoadRun(Ta, 470);
    tmrLoadRun(Tb, 1070);

    //  循环:控制2只LED独立闪烁
    for (;;) {
        if (tmrFlagGet(Ta)) {                   //  获取溢出标志
            tmrFlagClear(Ta);                   //  清除溢出标志
            LedToggle(LED1);                    //  反转LED亮灭状态
        }

        if (tmrFlagGet(Tb)) {
            tmrFlagClear(Tb);
            LedToggle(LED2);
        }

        sysModeSleep(SYS_WAKEUP_INT);           //  进入睡眠模式,以节省功耗
    }
}

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 09:23 | 显示全部楼层
SoftTMR软件定时器模块,用到了上一个模块“(07)Sleep模式与唤醒”当中的sysModeSleep()函数,很精典!

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 09:34 | 显示全部楼层
“(07)Sleep模式与唤醒”的下载次数一夜之间暴涨到455次!
昨天还是个位数,好奇怪
其它模块的下载次数也有明显增长

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 09:56 | 显示全部楼层
可能编程思维有差异吧
很多人喜欢用修改源代码里面的参数定义的方法来实现某种功能,但这样做显得不够规范,而且也很不灵活
而我不喜欢这样做,而是尽量做成以函数调用的方式来处理,在应用当中可随时更改配置,很灵活,同时避免手工修改人家的原始代码
比如中断注册,在我的驱动库里,基本上都是通过调用某个注册函数来注册用户的中断处理函数,而不是以修改底层代码的方式进行注册

使用特权

评论回复
rainbow99| | 2013-7-19 10:25 | 显示全部楼层
周立功GD32 发表于 2013-7-19 09:56
可能编程思维有差异吧
很多人喜欢用修改源代码里面的参数定义的方法来实现某种功能,但这样做显得不够规范 ...

相对来说还是STM32官方的库更可靠些,毕竟那么多人验证过了;ST的库的结构也很优美的,整体性更强,不知道楼主为啥觉得这个不规范;我觉得楼主最好不要太武断了的说别的人怎么怎么不好,存在即是合理的,还是谦虚一点比较好。
另外,对于学习来说,还是对底层熟悉一些比较好,这样在出现问题时,才能游刃有余。

使用特权

评论回复
rainbow99| | 2013-7-19 10:31 | 显示全部楼层
周立功GD32 发表于 2013-7-17 09:30
为了免得初学者被误导,在此要说明一下:我的《wdxLib_for_GD32F103》是原创的,跟其它公司的驱动库毫无 ...

我也是怕楼主误导初学者,不明白楼主为啥觉得ST官方的库不好用,我觉得很不错。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 11:33 | 显示全部楼层
我的库不是独立的,依据的正是《STM固件库》,是在它上面再封装一层而成,接口更简单、入门更容易而已,并非完全重写
所以《STM固件库》如果有bug,则我的库也可能会跟着出现bug。幸好,在调试过程中,已发现多处STM固件库的bug,在重新封装时都解决了

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-19 11:35 | 显示全部楼层
我看不必再争论了,各位全当我的库是“一家之言”,采用也好、参考也好、不用也罢,自主决定。

使用特权

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

本版积分规则