2730|3

1513

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【国民技术N32G457评测】两种N32G457开发工具及点灯程序的比较 [复制链接]

 

对N32G457开发板进行开发可使用MDK、IAR及RT-Thread等工具,下面仅以MDK和RT-Thread这两种工具为例,对点亮板载LED灯的程序变化加以比较。

若以MDK为工具,则可以直接在Nationstech.N32G45x_Library.2.0.0的压缩包中找到例程LedBlink,其程序如下:

int main(void)
{
    /*SystemInit() function has been called by startup file startup_n32g45x.s*/
    /* Initialize Led1~Led5 as output pushpull mode*/
    LedInit(PORT_GROUP1, LED1_PIN | LED2_PIN);
    LedInit(PORT_GROUP2, LED3_PIN | LED4_PIN | LED5_PIN);
    /*Turn on Led1*/
    LedOn(PORT_GROUP1, LED1_PIN);
    while (1)
    {
        /*LED1_PORT and LED2_PORT are the same port group.Enable Led2 blink and not effect Led1 by Exclusive-OR
         * operation.*/
        LedBlink(PORT_GROUP1, LED2_PIN);
        /*LED3_PORT, LED4_PORT and LED5_PORT are the same port group.*/
        /*Turn Led4 and Led5 off and not effect other ports by PBC register,correspond to
         * PORT_GROUP2->POD&=~(LED4_PIN|LED5_PIN);*/
        LedOff(PORT_GROUP2, LED4_PIN | LED5_PIN);
        /* Insert delay */
        Delay(0x28FFFF);
        /*Turn Led4 and Led5 on,turn Led3 off and not effect other ports by PBSC register,correspond to
         * PORT_GROUP2->POD&=~(LED3_PIN),then PORT_GROUP2->POD|=(LED4_PIN|LED5_PIN);*/
        LedOnOff(PORT_GROUP2, (LED3_PIN << 16) | LED4_PIN | LED5_PIN);
        /* Insert delay */
        Delay(0x28FFFF);
        /*Turn on Led3*/
        LedOn(PORT_GROUP2, LED3_PIN);
        /* Insert delay */
        Delay(0x28FFFF);
    }
}

void Delay(uint32_t count)
{
    for (; count > 0; count--) ;
}

void LedInit(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_InitType GPIO_InitStructure;
    /* Check the parameters */
    assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    /* Enable the GPIO Clock */
    if (GPIOx == GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    }
    else if (GPIOx == GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    }
    else if (GPIOx == GPIOC)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
    }
    else if (GPIOx == GPIOD)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
    }
    else if (GPIOx == GPIOE)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
    }
    else if (GPIOx == GPIOF)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOF, ENABLE);
    }
    else
    {
        if (GPIOx == GPIOG)
        {
            RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOG, ENABLE);
        }
    }
    if (Pin <= GPIO_PIN_ALL)
    {
        GPIO_InitStructure.Pin        = Pin;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
    }
}

void LedOn(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIOx->PBSC = Pin;
}

void LedOff(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIOx->PBC = Pin;
}

void LedOnOff(GPIO_Module* GPIOx, uint32_t Pin)
{
    GPIOx->PBSC = Pin;
}

void LedBlink(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIOx->POD ^= Pin;
}

相应的引脚定义为:

/*Led1-PB10,Led2-PB15,Led3-PA9,Led4-PA5,Led5-PA6*/

#define PORT_GROUP1 GPIOB

#define PORT_GROUP2 GPIOA

#define LED1_PORT   PORT_GROUP1

#define LED2_PORT   PORT_GROUP1

#define LED3_PORT   PORT_GROUP2

#define LED4_PORT   PORT_GROUP2

#define LED5_PORT   PORT_GROUP2

#define LED1_PIN    GPIO_PIN_10

#define LED2_PIN    GPIO_PIN_15

#define LED3_PIN    GPIO_PIN_9

#define LED4_PIN    GPIO_PIN_5

#define LED5_PIN    GPIO_PIN_6

 

程序看起来很臃肿,其功能就是控制 LED(D1) 常亮,PB15 控制 LED(D2) 闪烁,PA5(D3)、PA6(D4)、PA9(D5) 电平翻转。

归纳之后,其操作无外乎对LED相关引脚的初始化及循环体内的高低电平切换。

但该程序是基于N32G457QE_EVB开发板的,在编译时需改为N32G457VEL7,此外对引脚的定义也需进行修改。

若只是让LED(D1)产生闪烁效果,主程序则可以改为如下内容:

int main(void)
{
    LedInit(PORT_GROUP1, LED1_PINN);
    LedOn(PORT_GROUP1, LED1_PIN);
    while (1)
    {
        LedOn(PORT_GROUP1, LED1_PIN);   /*Turn on Led1*/ 
        Delay(0x28FFFF);
        LedOff(PORT_GROUP2, LED1);      /*Turn Off Led1*/
        Delay(0x28FFFF);
    }
}

或是:

int main(void)
{
    LedInit(PORT_GROUP1, LED1_PINN);
    LedOn(PORT_GROUP1, LED1_PIN);
    while (1)
    {
        LedBlink(PORT_GROUP1, LED2_PIN);    /*link Led1*/
        Delay(0x28FFFF);
    }
}

 

若以RT-Thread为工具,则直接以创建新项目的形式即可生成,其程序如下:

#include <stdint.h>
#include <rtthread.h>
#include <rtdevice.h>
/* defined the LED1 pin: PB5 */
#define LED1_PIN    57
int main(void)
{
    uint32_t Speed = 200;
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
    while (1)
    {
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(Speed);
        rt_pin_write(LED1_PIN, PIN_HIGH);
    }
}

程序看上去还是比较简洁的,唯一需要指出的是尽管该程序有效,但其引脚的定义是不准确的,它使用的是芯片定义是64PIN的,而开发板实际使用的芯片是100PIN的,因此所使用的引脚编号也是需要修改的,应是67。

最新回复

这颗芯片也是仿STM32的吧?看函数名称太像了。   详情 回复 发表于 2022-1-24 21:14

赞赏

1

查看全部赞赏

点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

测评的很好。

开发板实际使用的芯片是100PIN的,例程的引脚的定义是60PIN的,例程这也太不准确了。

 
 
 

回复

5260

帖子

239

TA的资源

管理员

板凳
 

收到,论坛这边会反馈给国民技术~

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 

这颗芯片也是仿STM32的吧?看函数名称太像了。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表