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

[复制链接]
23497|478
手机看帖
扫描二维码
随时随地手机跟帖
周立功GD32|  楼主 | 2013-7-10 15:27 | 显示全部楼层 |阅读模式
本帖最后由 周立功GD32 于 2013-11-17 15:27 编辑

现在大家开发STM32F103或GD32F103基本上都会使用《STM固件库》,但这是面向底层硬件的驱动库,对于应用工程师而言使用起来非常不方便。我本来想重新写一个,但完全重新写又太费时费力。故我在原有STM固件库的基础上重新封装了一个面向应用的驱动库:《wdxLib for STM/GD32F103》。

wdxLib将以源代码的形式贡献出来,并将尽量保持所生成的代码既能在STM32F103上运行又能在GD32F103上运行。
这个库是从应用角度出发重新设计的函数接口,仅要求应用工程师对底层有个粗浅的了解即能熟练运用。
如果发现有什么bug,请及时报告,多谢支持!
对于国产的GD32F103系列ARM,我也是初学没多久,需要共同探讨共同进步,呵呵!

下载附件吧
(01)STM固件库及安装.rar (543 KB, 下载次数: 372)

评分

参与人数 3威望 +22 收起 理由
张亚杰 + 1 我能给的最多的分啦
rainbow99 + 1 ST的库做的很不错,为啥说使用起来不方便?.
锐鑫同创 + 20 先给穿个裤子,期待楼主后面的连载。.
cgd| | 2013-7-10 15:33 | 显示全部楼层
沙发!

使用特权

评论回复
锐鑫同创| | 2013-7-10 15:40 | 显示全部楼层
支持,谢谢您的分享,建议把这个连载放到一个帖子里,不然太乱了,谢谢。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-10 15:55 | 显示全部楼层
刚才断线,现在把标题修改了,以后会逐步在贴子里添加,共大家下载研究

使用特权

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

支持

使用特权

评论回复
锐鑫同创| | 2013-7-10 16:00 | 显示全部楼层
周立功GD32 发表于 2013-7-10 15:55
刚才断线,现在把标题修改了,以后会逐步在贴子里添加,共大家下载研究

谢谢您的支持,其实在1楼直接编辑添加内容最好,方便查看。

使用特权

评论回复
tonydong| | 2013-7-10 16:14 | 显示全部楼层
:handshake周立功的人就是NB

使用特权

评论回复
Z赤心木QW| | 2013-7-10 20:32 | 显示全部楼层
难道你就是我同学说的那个人吗?哈哈!!!久仰久仰!!

使用特权

评论回复
miaoguoqiang| | 2013-7-11 08:58 | 显示全部楼层
抱歉,只有特定用户可以下载本站附件

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-11 09:04 | 显示全部楼层
已降低下载级别,再试试

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-11 10:38 | 显示全部楼层
今天新增:SysTick定时器
驱动程序的接口非常友好,并且纠正了原有驱动库的一个bug:时钟源只能配置为HCLK而不能取HCLK/8

//  初始化
void sysTickInit(void);

//  获取工作时钟
uint32_t sysTickClockGet(void);

//  注册用户的中断处理函数
void sysTickIntRegist(tIsrPtr UserFun);

//  注销中断
void sysTickIntUnregist(void);

//  装载并运行(溢出时会自动重装)
void sysTickLoadRun(uint32_t LoadVal);

//  停止运行
void sysTickStop(void);

//  获取当前计数值
uint32_t sysTickCounterGet(void);

使用特权

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

系统时钟配置示例:

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

在sysClockSet()这个函数里,会调用ST库的SystemCoreClockUpdate()函数,以刷新全局时钟变量SystemCoreClock。

而sysClockGet()函数返回的正是SystemCoreClock值。

建议用sysClockGet()获取CPU时钟频率,而不要直接访问SystemCoreClock变量。

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-11 11:02 | 显示全部楼层
wdxGPIO模块用法示例:

//  定义LED端口
#define  LED_PORT       GPIOE
#define  LED_PIN        PIN7

void LedTest(void)
{
    //  初始化配置
    gpioPeriphInit(LED_PORT);                               //  初始化LED所在的GPIO端口
    gpioPinConfig(LED_PORT, LED_PIN, GPIO_MODE_OUT);        //  把驱动LED的管脚配置为推挽输出模式

    for (;;) {
        gpioPinSet(LED_PORT, LED_PIN);                      //  点亮LED
        msDelay(100);
        gpioPinClear(LED_PORT, LED_PIN);                    //  熄灭LED
        msDelay(900);
    }
}

使用特权

评论回复
tergy2012| | 2013-7-11 11:26 | 显示全部楼层
不错,支持啊

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-11 11:33 | 显示全部楼层
wdxSysTick模块(系统节拍定时器)用法示例:

//  定义全局变量
uint32_t msDelayBase = 6000;
volatile tBool  msDelayFlag = FALSE;            //  被ISR引用的全局变量必须前缀volatile关键字

//  用户的中断服务函数
void msDelayISR(void)
{
    msDelayFlag = TRUE;
}

//  延时初始化
void msDelayInit(void)
{
    sysTickInit();                              //  SysTick初始化
    sysTickIntRegist(msDelayISR);               //  注册中断,SysTick溢出时自动跳到msDelayISR()
    msDelayBase = sysTickClockGet() / 1000;     //  计算毫秒延时的时基
}

//  以毫秒为单位延时
void msDelay(uint32_t ms)
{
    sysTickLoadRun(msDelayBase);

    do {
        while (msDelayFlag == FALSE);
        msDelayFlag = FALSE;
    } while (--ms != 0);

    sysTickStop();
}

使用特权

评论回复
cdlxzlp520| | 2013-7-11 19:10 | 显示全部楼层
哈哈 好东西 一定是好东西的了

使用特权

评论回复
mmuuss586| | 2013-7-13 08:17 | 显示全部楼层

支持周。已经和你们申请样品了

使用特权

评论回复
linfeng24| | 2013-7-13 08:40 | 显示全部楼层
顶一个

使用特权

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

使用特权

评论回复
周立功GD32|  楼主 | 2013-7-15 08:38 | 显示全部楼层
应用工程师想用好STM固件库必须要探究底层硬件才行,因为它不是面向上层应用的驱动库。
现在我做的这个库是从应用角度出发重新设计的函数接口,仅要求应用工程师对底层有个粗浅的了解即能熟练运用。

使用特权

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

本版积分规则