打印

【原创】《wdxLib_for_GD32F103》驱动开发(V0.2)

[复制链接]
13417|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周立功GD32|  楼主 | 2013-11-17 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 周立功GD32 于 2013-11-17 16:39 编辑

《wdxLib_for_GD32F103》(V0.2)新鲜出炉,继续贯彻V0.1版“面向应用”的精神,方便开发。

下载附件吧:
(01)STM固件库及安装.rar (540.72 KB)
(02)新建工程模板.rar (36.46 KB)
(03)系统时钟与GPIO.rar (959.08 KB)
(04)SysTick定时器.rar (107.34 KB)
(05)GPIO中断.rar (238.32 KB)
(06)Sleep模式与唤醒.rar (387.59 KB)
(07)USART通用同步异步收发器(初步).rar (1.34 MB)
(08)swTimer软件定时器.rar (90.03 KB)
(09)BKP寄存器与RTC实时时钟.rar (3.3 MB)

(以后会逐步添加其它功能模块)


沙发
周立功GD32|  楼主 | 2013-11-17 15:33 | 只看该作者

使用特权

评论回复
板凳
周立功GD32|  楼主 | 2013-11-17 16:16 | 只看该作者
本帖最后由 周立功GD32 于 2013-11-17 16:29 编辑

【wdx_sysClock接口函数概览】
    sysClockSet()       设置系统时钟
    sysClockGet()       获取系统时钟频率

【wdx_GPIO接口函数概览】
    gpioPeriphEnable()          GPIO外设使能
    gpioPeriphDisable()         GPIO外设禁止
    gpioModeConfig()            GPIO模式配置(通用)
    gpioModeConfigSlow()        GPIO模式配置(慢速,但节省功耗)
    gpioModeConfigQuick()       GPIO模式配置(快速,但功耗大、噪声干扰大)
    gpioPortWrite()             数据写入整个GPIO端口
    gpioPinWrite()              数据写入指定的GPIO管脚
    gpioPortRead()              读取整个GPIO端口
    gpioPinRead()               读取指定的GPIO管脚
    gpioPinSet()                置位指定的GPIO管脚
    gpioPinClear()              清零指定的GPIO管脚
    gpioPinToggle()             反转指定的GPIO管脚
    gpioPinSetQuick()           GPIO快速置位
    gpioPinClearQuick()         GPIO快速清零
    gpioIntRegist()             GPIO中断注册
    gpioIntUnregist()           GPIO中断注销
    gpioIntEnable()             GPIO中断使能
    gpioIntDisable()            GPIO中断禁止
    gpioExtiEnable()            GPIO的EXTI使能
    gpioExtiDisable()           GPIO的EXTI禁止

【sysClock和GPIO用法示例】
#include  "wdxLib_GD32F103.h"
#define  LED_PORT   GPIOC
#define  LED_PIN    PIN3
int main(void)
{
    //  设置系统时钟(72MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 9) == 0)              //  采用外部8MHz晶振,9倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 8);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  LED初始化
    gpioPeriphEnable(LED_PORT);
    gpioModeConfig(LED_PORT, LED_PIN, GPIO_MODE_OUT_L);     //  配置为推挽输出模式,初始为低电平

    //  点亮LED
    gpioPinSet(LED_PORT, LED_PIN);

    //  无限循环(不可从main()函数返回)
    for (;;)
    {
    }
}

使用特权

评论回复
地板
周立功GD32|  楼主 | 2013-11-17 16:33 | 只看该作者
本帖最后由 周立功GD32 于 2013-11-17 16:40 编辑

bool_t sysClockSet(uint8_t OscSrc, uint32_t OscFreq, uint8_t MulNum);
/*********************************************************************************************************
【功能】设置系统时钟
【参数】OscSrc      振荡源,取下列值之一:
                        OSC_HSI     //  内部高速振荡器(标称8MHz)
                        OSC_HSE     //  外部高速振荡器(无源4~16MHz,有源1~25MHz)
        OscFreq     振荡频率,单位:Hz,必须与实际采用的时钟源标称频率保持一致
        MulNum      倍频数,若选择HSI则取值1~8,若选择HSE则取值1~16
                    要注意:(OscFreq×MulNum)不应超过处理器额定最高工作频率
【返回】0   失败(若HSE失效则会导致配置失败,此时应当改用HSI)
        1   正常
【示例】sysClockSet(OSC_HSI, FREQ_8M, 1);       //  时钟源选择8MHz的HSI,主频8MHz
        sysClockSet(OSC_HSI, FREQ_8M, 8);       //  时钟源选择8MHz的HSI,主频64MHz(采用HSI时主频最大值)
        sysClockSet(OSC_HSE, FREQ_8M, 9);       //  时钟源选择8MHz的HSE,主频72MHz(STM32F10x最高主频)
        sysClockSet(OSC_HSE, FREQ_12M, 9);      //  时钟源选择12MHz的HSE,主频108MHz(GD32F10x最高主频)
*********************************************************************************************************/

使用特权

评论回复
5
周立功GD32|  楼主 | 2013-11-17 16:51 | 只看该作者
【wdx_sysTick接口函数概览】
    sysTickInit()               SysTick初始化
    sysTickClockGet()           获取SysTick的工作时钟频率
    sysTickLoadRun()            SysTick装载初值并运行
    sysTickStop()               SysTick停止计数
    sysTickCounterGet()         获取SysTick计数值
    sysTickIntRegist()          SysTick中断注册
    sysTickIntUnregist()        SysTick中断注销

【sysTick用法示例】
#include  "wdxLib_GD32F103.h"
#include  "Led.h"

//  SysTick中断服务函数
void MyIntHandler(void)
{
    LedToggle();
}

int main(void)
{
    //  设置系统时钟(48MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 6) == 0)              //  采用外部8MHz晶振,6倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 6);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  LED初始化
    LedInit(GPIOE, PIN7);

    //  SysTick(系统节拍定时器)配置
    sysTickInit();                                          //  SysTick初始化
    sysTickIntRegist(MyIntHandler);                         //  注册SysTick中断
    sysTickLoadRun(sysTickClockGet() / 10);                 //  SysTick装载初值并运行,定时0.1秒

    for (;;)
    {
    }
}

运行效果:LED每秒钟闪烁5次

使用特权

评论回复
6
周立功GD32|  楼主 | 2013-11-17 17:07 | 只看该作者

【wdx_sysMode接口函数概览】
    sysModeSleep()          使处理器进入睡眠模式(较低功耗)
    sysModeStop()           使处理器进入停机模式(很低功耗)
    sysModeStandby()        使处理器进入待机模式(极低功耗)

【sysModeSleep()函数】
void sysModeSleep(uint8_t WakeupMode);
/*********************************************************************************************************
【功能】使处理器进入睡眠模式
【参数】WakeupMode  唤醒模式,取下列值之一:
                        SYS_WAKEUP_INT      //  中断唤醒(任意中断皆可唤醒)
                        SYS_WAKEUP_EVENT    //  事件唤醒(主要是GPIO边沿事件)
【返回】无(在处理器被唤醒前不会返回)
【说明】Sleep模式是处理器的3种低功耗模式之一(最常用),能节省CPU部分的功耗
        主要特性:
            在线程模式下调用此函数即进入Sleep模式
            此时CPU时钟被关闭,程序暂停执行
            但所有片内外设(包括NVIC、SysTick)仍可正常工作
        唤醒方式:
            当产生任意中断或事件时,处理器被唤醒(必须提前配置好相关中断或事件)
            唤醒事件主要有:GPIO边沿事件、PVD输出事件、RTC闹铃事件、USB唤醒事件
        被唤醒后:
            若当初是以SYS_WAKEUP_INT方式进入的Sleep模式,则在唤醒后,CPU时钟恢复,首先执行ISR中断
            处理程序,执行完毕返回到线程模式,此后正常执行程序;
            若当初是以SYS_WAKEUP_EVENT方式进入的Sleep模式,则在唤醒后,CPU时钟恢复,此后正常执行程序。
*********************************************************************************************************/

【Sleep模式示例】
#include  "wdxLib_GD32F103.h"
#include  "Led.h"

static uint32_t DelayBase = 9000;
static volatile bool_t DelayFlag = 0;

//  SysTick中断服务函数
void Delay_SysTickHandler(void)
{
    DelayFlag = 1;
}

void Delay(uint ms)
{
    sysTickLoadRun(DelayBase);

    do
    {
        for (;;)
        {
            sysModeSleep(SYS_WAKEUP_INT);           //  进入Sleep模式,节省功耗,任意中断可唤醒
            if (DelayFlag) break;                   //  若是因为发生SysTick中断,则退出循环
        }

        DelayFlag = 0;
    } while (--ms != 0);

    sysTickStop();
}

int main(void)
{
    //  设置系统时钟(48MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 6) == 0)              //  采用外部8MHz晶振,6倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 6);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  LED初始化
    LedInit(GPIOC, PIN1);

    //  SysTick(系统节拍定时器)配置
    sysTickInit();                                          //  SysTick初始化
    sysTickIntRegist(Delay_SysTickHandler);                 //  注册SysTick中断
    DelayBase = sysTickClockGet() / 1000;                   //  时基1ms

    for (;;)
    {
        LedOn();
        Delay(50);
        LedOff();
        Delay(950);
    }
}

使用特权

评论回复
7
周立功GD32|  楼主 | 2013-11-17 17:15 | 只看该作者
【wdx_swFIFO接口函数概览】
    swFifoInit()            初始化swFIFO对象(都是面向对象的操作)
    swFifoIsFull()          判定swFIFO对象是否满
    swFifoIsEmpty()         判定swFIFO对象是否空
    swFifoWrite()           向swFIFO对象写入数据
    swFifoRead()            从swFIFO对象读出数据

【wdx_USART接口函数概览】
    usartPeriphEnable()     USART外设使能
    usartPeriphDisable()    USART外设禁止
    usartPinRemap()         USART管脚映射
    usartModeConfig()       USART模式配置(波特率、字长、停止位、校验等)
    usartFifoConfig()       USART软件FIFO配置(FIFO大小可由用户指定,很灵活)
    usartRun()              USART运行
    usartStop()             USART停止(先等待硬件发送完成再停止)
    usartWaitTxFinish()     USART等待硬件发送真正完成
    usartRxIsAvail()        USART判定接收是否可用(即判定RxFIFO是否不空)
    usartRxFifoClear()      USART清空RxFIFO(遇到接收错误时应清空)
    usartPutc()             USART发送单个字符(如果TxFIFO满则自动等待)
    usartPuts()             USART发送字符串
    usartGetc()             USART接收单个字符(等待)
    usartFifoGetc()         USART以FIFO方式接收数据(不等待)
    usartTerminalGets()     USART以终端方式接收字符串(HyperTerminal,等待)
    usartBreakSend()        USART发送间断字符
    usartFlagGet()          USART获取标志(超载、校验错、帧错误、空闲线、间断等)
    usartFlagClear()        USART清除标志

【USART示例】发送字符串
#include  "wdxLib_GD32F103.h"

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

int main(void)
{
    //  设置系统时钟(48MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 6) == 0)              //  采用外部8MHz晶振,6倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 6);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  初始化并配置USART1:TX = PA9,RX = PA10;波特率115200,数据8位,无校验,1个停止位,无流控制
    usartPeriphEnable(USART1);
    usartPinRemap(USART1, USART_PIN_DEFAULT);
    usartModeConfig(USART1, 115200, USART_WLEN_8, USART_PAR_NONE, USART_STOP_1, USART_FLOW_NONE);
    usartFifoConfig(USART1, USART1_buf, sizeof(USART1_buf));
    usartRun(USART1);

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

    for (;;)
    {
        sysModeSleep(SYS_WAKEUP_INT);           //  进入Sleep模式以节省功耗(不影响USART收发)
    }
}

使用特权

评论回复
8
周立功GD32|  楼主 | 2013-11-17 17:27 | 只看该作者
【wdx_swTimer重要说明】
这是利用硬件定时器扩展出的多个简易软件定时器,有以下主要特性:
    ●接口友好,用法简易
    ●时基规定为1ms(其它时基,如10ms,实际上也允许)
    ●默认8个定时器(可定义成更多)
    ●定时器编号浮动分配/释放(应用兼容性更强)
    ●32位,倒计时(作为定时器用法很方便)
    ●溢出时自动重装,并产生软件中断
    ●各定时器独立运作
    ●以毫秒为单位的延时函数
    ●用途广泛:大范围延时,动态数码管,键盘扫描,无需OS的多任务软件架构,等等
由于软件定时器本身无法产生1ms时基信号,所以必须要由另外的硬件定时器提供支持,详见swTimerTick()函数

【swTimer接口函数概览】
    swTimerInit()               软件定时器初始化
    swTimerTick()               软件定时器节拍(核心驱动函数)
    swTimerClock()              获取自软件定时器初始化以来经过的时钟数
    swTimerDelay()              软件定时器延时
    swTimerAlloc()              申请分配一个软件定时器资源
    swTimerFree()               释放一个软件定时器资源
    swTimerLoadRun()            软件定时器装载并运行
    swTimerStop()               软件定时器停止
    swTimerFlagGet()            获取软件定时器溢出标志
    swTimerFlagClear()          清除软件定时器溢出标志
    swTimerIntRegist()          软件定时器中断注册
    swTimerIntUnregist()        软件定时器中断注销

【swTimer用法示例】
#include  "wdxLib_GD32F103.h"
#include  "LED.h"

int main(void)
{
    int  Ta, Tb;

    //  设置系统时钟(48MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 6) == 0)              //  采用外部8MHz晶振,6倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 6);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  LED初始化
    LedInit(LED1, GPIOC, PIN1);
    LedInit(LED2, GPIOC, PIN13);

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

    //  申请软件定时器
    Ta = swTimerAlloc();                                    //  申请一个软件定时器
    Tb = swTimerAlloc();                                    //  再申请一个软件定时器(Tb不会等于Ta)

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

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

        if (swTimerFlagGet(Tb))
        {
            swTimerFlagClear(Tb);
            LedToggle(LED2);
        }

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

使用特权

评论回复
9
周立功GD32|  楼主 | 2013-11-17 17:36 | 只看该作者
【wdx_RTC接口函数概览】
    rtcPeriphEnable()           //  RTC外设使能
    rtcPeriphDisable()          //  RTC外设禁止
    rtcDataRegRead()            //  RTC数据寄存器读(BKP模块已合并到RTC模块)
    rtcDataRegWrite()           //  RTC数据寄存器写
    rtcClockSet()               //  RTC工作时钟设置
    rtcClockGet()               //  RTC工作时钟获取
    rtcClockOutput()            //  RTC时钟输出设置
    rtcCounterSet()             //  RTC计数器设置
    rtcCounterGet()             //  RTC计数器读取
    rtcIntConfig()              //  RTC中断配置
    rtcIntRegist()              //  RTC中断注册
    rtcIntUnregist()            //  RTC中断注销
    rtcAlarmAheadSet()          //  RTC闹铃超前值设置
    rtcAlarmEventEnable()       //  RTC闹铃事件使能
    rtcAlarmEventDisable()      //  RTC闹铃事件禁止
    rtcIntEnable()              //  RTC中断使能
    rtcIntDisable()             //  RTC中断禁止
    rtcCalibValSet()            //  RTC校准值设置
    rtcCalibValGet()            //  RTC校准值获取

【RTC用法示例】
#include  "wdxLib_GD32F103.h"
#include  "LED.h"

void Delay(uint32_t ms)
{
    uint32_t  t1, t2;

    t1 = rtcCounterGet();               //  记录当前毫秒数

    for (;;)
    {
        t2 = rtcCounterGet();
        if (t2 - t1 >= ms) break;       //  若毫秒数差值超过ms则结束
    }
}

int main(void)
{
    //  设置系统时钟(48MHz主频)
    if (sysClockSet(OSC_HSE, FREQ_8M, 6) == 0)              //  采用外部8MHz晶振,6倍频
    {
        sysClockSet(OSC_HSI, FREQ_8M, 6);                   //  若外部晶振失效,则改用内部振荡器
    }

    //  LED初始化
    LedInit(GPIOE, PIN8);

    //  RTC初始化
    rtcPeriphEnable();
    rtcClockSet(32000, 32);                                 //  采用32.000kHz晶振,32预分频
    rtcCounterSet(0);                                       //  从0开始计数,每毫秒计数值增1

    for (;;)
    {
        LedOn();
        Delay(50);
        LedOff();
        Delay(950);
    }
}

使用特权

评论回复
10
shdjdq| | 2013-11-17 17:42 | 只看该作者
不错,不知和ST的库兼容不?

使用特权

评论回复
11
周立功GD32|  楼主 | 2013-11-17 17:44 | 只看该作者
本帖最后由 周立功GD32 于 2013-11-17 18:10 编辑

兼容的,《wdxLib_for_GD32F103》就是在ST固件库的基础上建立的。并不排斥ST固件库,可以混用!
程序既能在GD32F103系列上运行,也能在STM32F103系列上运行。

使用特权

评论回复
12
周立功GD32|  楼主 | 2013-11-17 18:01 | 只看该作者
本帖最后由 周立功GD32 于 2013-11-17 18:15 编辑

所有模块的驱动程序都提供源代码学习笔记!方便大家学习交流:D

使用特权

评论回复
13
shdjdq| | 2013-11-17 18:08 | 只看该作者
不错

使用特权

评论回复
14
make8419247| | 2013-11-18 07:54 | 只看该作者
哦不错!

使用特权

评论回复
15
周立功GD32|  楼主 | 2013-11-25 12:27 | 只看该作者
up

使用特权

评论回复
16
bivib| | 2013-11-25 19:24 | 只看该作者
加油,喜欢周立功的东西,有很多中文注解

使用特权

评论回复
17
喵小棋| | 2013-11-26 18:52 | 只看该作者
向周公学习

使用特权

评论回复
18
张涛190| | 2013-11-26 18:57 | 只看该作者
下载一下玩玩

使用特权

评论回复
19
beyondhyq| | 2013-11-26 21:58 | 只看该作者
开国内之先河之作,大力支持!

使用特权

评论回复
20
zhangmangui| | 2013-11-26 23:44 | 只看该作者
好丰富啊  谢谢

使用特权

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

本版积分规则

个人签名:GD兆易半导体——周立功单片机 www.zlgmcu.com/GigaDevice

5

主题

124

帖子

5

粉丝