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

[复制链接]
楼主: 周立功GD32
手机看帖
扫描二维码
随时随地手机跟帖
laserpic| | 2013-7-20 13:41 | 显示全部楼层
不错,有心了,等于是把自己的工作好的封装拿来开源了。其实要让程序可维护,大多数人都会选择封装一下的。
你的封装就成了别人自己打算封装时的示范,而且有些还可以直接用。
STM库则不一样,大多数是在之上进行开发。

使用特权

评论回复
zhxxi| | 2013-7-20 13:44 | 显示全部楼层
rainbow99 发表于 2013-7-13 23:31
ST的库做的很不错,为啥说使用起来不方便?那么多人都用的好好的,搞不懂,包装成TI的库形式有什么意义。 ...

支持楼上的。大家的习惯不同而已。

使用特权

评论回复
qui26| | 2013-7-20 17:59 | 显示全部楼层
顶一个

使用特权

评论回复
baiyunfei.k.f| | 2013-7-22 08:40 | 显示全部楼层
:victory:

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-22 10:22 | 显示全部楼层
今天新增:(09)USART通用同步异步收发器(初步)

仅包括串口通信本身,暂不包括红外收发、智能卡等功能(待以后添加)

支持3个USART端口:USART1、USART2、USART3

支持USART管脚重映射

USART硬件本身没有FIFO缓冲,于是做了一个软件的FIFO,效果相当于硬件FIFO,配置独立、使用灵活

USART驱动程序的还有很多好特性,下载下来慢慢看吧

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-22 10:24 | 显示全部楼层
【示例】

//  定义USART1的收发缓冲区(收发FIFO各用一半)
char USART1_buf[128];

void exam__usart(void)
{
    //  初始化并配置USART1:TX = PA9,RX = PA10;波特率115200,数据8位,无校验,1个停止位,无流控制
    usartPeriphInit(USART1, USART_PIN_DEFAULT);
    usartConfig(USART1, 115200, USART_WLEN_8, USART_PAR_NONE, USART_STOP_1, USART_FLOW_NONE);
    usartFifoInit(USART1, USART1_buf, sizeof(USART1_buf));
    usartEnable(USART1);

    //  发送字符串
    usartPuts(USART1, "hello\r\n");             //  hello<CR><LF>
}

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-22 10:28 | 显示全部楼层
【示例】采用USART2,管脚重映射

//  定义USART2的收发缓冲区(收发FIFO各用一半)
char USART2_buf[128];

void exam__usart(void)
{
    //  初始化并配置USART2:TX = PD5,RX = PD6;波特率115200,数据8位,无校验,1个停止位,无流控制
    usartPeriphInit(USART2, USART_PIN_REMAP);
    usartConfig(USART2, 115200, USART_WLEN_8, USART_PAR_NONE, USART_STOP_1, USART_FLOW_NONE);
    usartFifoInit(USART2, USART2_buf, sizeof(USART2_buf));
    usartEnable(USART2);

    //  发送字符串
    usartPuts(USART2, "hello\r\n");             //  hello<CR><LF>
}

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-22 10:35 | 显示全部楼层
本帖最后由 周立功GD32 于 2013-7-22 10:44 编辑

引入软件FIFO是个非常重要的发明!(另外的解决方法是DMA)
软件FIFO的效果等同于硬件FIFO,有效避免收发丢数据的问题,并有效提高收发效率
3个USART的FIFO可独立配置,互不影响
软件FIFO被尽量封装隐藏起来,所以在应用上非常简单
软件FIFO模块本身是独立通用的,其它应用程序也可利用这个资源!

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-22 10:49 | 显示全部楼层
支持“在USART运行中修改CPU主频”的特性:

    //  USART1已经处于运行状态

    //  在运行中突然修改CPU主频
    usartDisable(USART1);                   //  必须先暂停USART的运行
    sysClockSet(OSC_HSE, FREQ_8M, 9);       //  重新配置CPU主频
    usartClockUpdate(USART1);               //  更新USART时钟(恢复原有的波特率)
    usartEnable(USART1);                    //  重新使能USART

    //  主频修改后,USART1仍然正常运行!

关键是usartClockUpdate()这个函数!

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-30 10:09 | 显示全部楼层
今天新增:(10)BKP寄存器与RTC实时时钟

BKP = Backup Registers,后备/备份寄存器
RTC = Real-Time Clock,实时时钟

●BKP为后备寄存器
    20个16位非易失性数据寄存器
    要求VBAT管脚正常供电
    处理器复位不会影响其记录的内容
    BKP区域同时还涉及RTC功能(但在应用上已分开)
    已封装的BKP模块应用非常简单,仅3个接口函数:初始化、读、写

●RTC为实时时钟模块,在驱动上包含诸多功能,但用法简易:
    定义了多种常见的低速晶振频点
    rtcClockSet()函数可自由配置RTC时钟源
    rtcClockOutput()函数控制PC13/Tamper管脚输出测试信号
    rtcCounterSet()函数设定RTC计数器值
    rtcInt...()系列中断控制,支持Alarm闹铃中断、Period周期中断
    rtcCalibValSet()函数提供数值校准功能,能使RTC时钟精准运行

●提供大量实用例程供参考:
    (01)测试BKP读写
    (02)毫秒延时
    (03)RTC时钟输出
    (04)测量内部振荡器HSI频率
    (05)RTC闹铃中断
    (06)RTC周期中断
    (07)利用RTC驱动软件定时器
    (08)交流蜂鸣器演奏乐曲(包含3个子例程)
    (09)简易RTC时钟
    (10)RTC校准实验(包含2个子例程)

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-30 10:30 | 显示全部楼层
RTC时钟例程的调试现象:
调试现象.jpg

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-30 10:49 | 显示全部楼层
对RTC校准实验补充照片和视频:
DMM6000测量RTC时钟.jpg
RTC校准视频.rar (2.26 MB)

使用特权

评论回复
lynx| | 2013-7-30 14:07 | 显示全部楼层
学习了,GD 没有出自己的库吗。GD也正个官方的库嘛。

使用特权

评论回复
周立功GD32|  楼主 | 2013-8-13 11:49 | 显示全部楼层
本帖最后由 周立功GD32 于 2013-8-13 13:32 编辑

今天新增:(11)Stop和Standby模式

●wdxRTC驱动更新
    把该文件夹下的文件复制到:C:\Keil\ARM\wdxLib_for_GD32F103,
    覆盖原来的文件(为适应Stop和Standby模式编程需要,RTC驱动有所调整)

●wdxSysMode驱动
    把该文件夹下的文件复制到:C:\Keil\ARM\wdxLib_for_GD32F103

●关于Stop模式
    Stop模式是处理器的3种低功耗模式之一,能节省绝大部分功耗
        主要特性:
            在线程模式下调用sysModeStop()函数即进入Stop模式
            此时CPU和一般外设都停止工作,程序暂停执行
            但GPIO、LSE及RTC、LSI及IWDG仍可正常工作
        唤醒方式:
            当产生任意GPIO中断或事件时,处理器被唤醒
            唤醒事件主要有:GPIO边沿事件、PVD输出事件、RTC闹铃事件、USB唤醒事件
        被唤醒后:
            若当初是以SYS_WAKEUP_INT方式进入的Stop模式,则在唤醒后,首先以HSI作为系统时钟,接着执行ISR
            中断处理程序,执行完毕返回到线程模式,此后正常执行程序;
            若当初是以SYS_WAKEUP_EVENT方式进入的Stop模式,则在唤醒后,首先以HSI作为系统时钟,此后正常
            执行程序。
        注:因为从Stop模式唤醒后系统时钟变成了8MHz的HSI,所以应重新调用sysClockSet()才能恢复原先的配置

●关于Standby模式
    Standby模式是处理器的3种低功耗模式之一,能最大限度节省功耗
        主要特性:
            调用sysModeStandby()函数即进入Standby模式
            此时内部LDO稳压器关闭,故内核区域(处理器内核、SRAM、数字外设)因此断电,程序也不再执行
            PLL、HSI、HSE都关断,但LSE及RTC、LSI及IWDG仍可工作
            SRAM和寄存器内容都丢失,但BKP区域(含RTC)仍可保持
            所有I/O都处于高阻状态,但Tamper(PC13)、WKUP(PA0)可例外
        唤醒方式:
            从WKUP(PA0)管脚输入一个上升沿(参见sysWakeupPinEnable()函数)
            RTC闹铃定时唤醒
            外部复位,IWDG复位
        被唤醒后:
            整个程序重新开始执行(所以本函数绝不会返回),但BKP区域(含RTC)不受影响

●提供多个实用例程供参考:
    (0)Sleep模式RTC闹铃事件唤醒(补充)
    (1)Stop模式GPIO中断唤醒(含2个子例程)
    (2)Stop模式GPIO边沿事件唤醒
    (3)Stop模式RTC闹铃事件唤醒
    (4)Standby模式WUKP管脚唤醒
    (5)Standby模式RTC闹铃唤醒
    (6)应用:低功耗RTC简易日历(含2个子例程)

使用特权

评论回复
周立功GD32|  楼主 | 2013-8-13 13:48 | 显示全部楼层
在例程中,LED是很常用的资源,我对LED驱动也做了改进,引入“管脚注册”机制:
    //  Led初始化
    LedPinRegist(LED1, GPIOE, PIN7);
    LedPinRegist(LED2, GPIOE, PIN8);
    LedInit();
LED驱动程序包括“Led.h”和“Led.c”两个文件,支持对4只LED的操作(可扩充)
在应用中,如果LED管脚的位置改变了(不同板子规定不一样),也不需要去修改LED的底层驱动,而是在应用中重新注册LED管脚
用到几只LED就注册几只,未使用的LED不需要注册,未注册的LED不会起作用
移植性不错,很方便吧?
但此方法也有缺点:底层驱动较复杂、执行效率也低

使用特权

评论回复
jack888518| | 2013-8-14 14:47 | 显示全部楼层
被下载了数千次了啊

使用特权

评论回复
hong60104| | 2013-8-18 19:30 | 显示全部楼层
嗯,不错哦。只是不知道在价格方面与ST的比较有没有优势?

使用特权

评论回复
周立功GD32|  楼主 | 2013-8-20 20:10 | 显示全部楼层
价格你放心,国产的肯定有优势!具体请咨询销售人员

使用特权

评论回复
chenci2013| | 2013-8-27 13:25 | 显示全部楼层
楼主好强大。

使用特权

评论回复
chenci2013| | 2013-8-27 13:25 | 显示全部楼层
谢谢分享的。

使用特权

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

本版积分规则