打印
[牛人杂谈]

最新M471K系列单片机开发板测评:第一步打探资源

[复制链接]
5705|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2021-7-30 21:29 编辑

最新的开发板,肯定资源是比较少的,去官网找了一下,没有明显的找到,但是可以根据影子搜索到,这里提供一下官方的下载链接。因为官方还没公开下载和查看,所以这里设置回复可见下载链接

游客,如果您要查看本帖隐藏内容请回复


实拍照片

该开发板上使用一枚M471KI8AE作为开发板主控,该系列单片机内部的片上配置






使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2021-7-30 21:11 | 只看该作者
开发板上资源介绍

NuMaker-M471KI 是针对 Nuvoton NuMicro M471KI,M471VI 和 M471VG 微控制器的开发板。 NuMaker-M471KI 由两部分组成:M471目标板与 Nu-Link2-Me 除错刻录器。 NuMaker-M471KI 可作为项目评估、开发、验证以及功耗监控的平台。
M471 目标板带有 NuMicro®M471KI8AE 微控制器。M471目标板提供 M471KI8AE 的脚位扩展接口,与兼容于 Arduino UNO 的接口,方便搭配各式接口设备或Arduino 模块,并有多种的电源供应设计,让项目的开发更加灵活。M471 目标板还带有电流量测接口可以随时监控功耗,协助项目开发与评估。 M471 目标板包括用于跟踪指令的嵌入式跟踪宏单元(ETM),嵌入式硬件IR接收器,用于对遥控器进行模式匹配和译码。开发板上预留的陶瓷振荡器零件位置可使用于4〜24 MHz高速外部(HXT)时钟。
NuMaker-M471KI 的另一部分为 Nu-Link2-Me 除错刻录器。Nu-Link2-Me 可透过 SWD 接口对新唐微控制器进行在线 ICP 刻录与除错,也可以进行脱机 ICP 刻录,刻录的状态会显示在状态 LED 上。Nu-Link2-Me 也支持虚拟串口(VCOM)功能,可输出讯息至终端机窗口。Nu-Link2-Me 还可以与开发板分离,成为独立的批次生产刻录器。
使用 NuMicro® M471KI8AE 微控制器,其功能向下兼容于:
-
M471VI8AE
-
M471VG7AE
M471KI8AE 全脚位扩展界面
Arduino UNO 兼容接口
电流量测接口可量测微控制器功耗
灵活电源供应设计
-
VDD 外部输入接口
-
主控板的 USB 端口
-
Arduino UNO 界面的 Vin
-
Nu-Link2-Me 的 ICE USB 端口
附带 Nu-Link2-Me 除错刻录器,可支持
-
透过 SWD 接口进行除错
-
在线/脱机刻录
-
虚拟串口功能

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2021-7-30 22:16 | 只看该作者
第一件事就是先搞个点灯看看,通过开发板手册或原理图文件可以知道,开发板上有1个红色LED,是可以编程的,在PB14端口,低电平点亮。如下图所示。

我们找到BSP,在SampleCode\StdDriver文件夹找到GPIO输入输出的示例工程,复制一份,修改成你想要的名字,比如00_LED
这样可以排行在第一个位置
打开这个工程,这里我使用KEIL
启动工程提示如下,因为没有更新pack,所以找不到该型号的数据库信息

更新pack信息后,提示有更新,更新该文件

之后重新以管理员身份启动Keil,就可以正常使用该例程了,工程的信息里也可以找到对应的数据库信息了
下载时候提示

从C:\Keil_v5_ARM\ARM\NULink目录找一个拷贝进去就行了
修改例程main.c文件为以下内容
#include "stdio.h"
#include "NuMicro.h"


void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

    /* Enable HIRC clock (Internal RC 48 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Wait for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Set core clock as 96MHz from PLL */
    CLK_SetCoreClock(FREQ_96MHZ);

    /* Set PCLK0/PCLK1 to HCLK/2 */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2);

    /* Enable UART clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART clock source from HIRC */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();

    /*----------------------------------------------------------------------*/
    /* Init I/O Multi-function                                              */
    /*----------------------------------------------------------------------*/
    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
                    (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Lock protected registers */
    SYS_LockReg();
}

/*----------------------------------------------------------------------*/
/* Init UART0                                                           */
/*----------------------------------------------------------------------*/
void UART0_Init(void)
{
    /* Reset UART0 */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

int32_t main(void)
{
                unsigned char zi;

    /* Init System, IP clock and multi-function I/O. */
    SYS_Init();

    /* Init UART0 for printf */
    UART0_Init();

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

    printf("+-------------------------------------------------+\n");
    printf("|    PB.14(Output) and PCH.4(Input) Sample Code     |\n");
    printf("+-------------------------------------------------+\n\n");

    /*-----------------------------------------------------------------------------------------------------*/
    /* GPIO Basic Mode Test --- Use Pin Data Input/Output to control GPIO pin                              */
    /*-----------------------------------------------------------------------------------------------------*/
    printf("     Press any key to start test by using [Pin Data Input/Output Control] \n\n");
    zi=getchar();
    /* Configure PB.14 as Output mode and PH.4 as Input mode then close it */
    GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT);
    GPIO_SetMode(PH, BIT4, GPIO_MODE_INPUT);
                PB14 = 1;
    printf("Receive a char:%c\n",zi);

    while(1)
                {
                                /* 按下PH4上的按钮,就拉低PB14,点亮红色LED*/
                                if(PH4==1) PB14=1;
                                if(PH4==0) PB14=0;
                }
}
开启串口助手软件,并打开与开发板的串口连接。
编译后烧录到开发板
这个时候,就可以看到串口收到的信息了,随意发送个字符给开发板
接收到的内容如下

这个时候按开发板的SW2按钮就会发现,按下后红色的LED点亮,松手就灭。
完成了点亮一个LED和串口收发的测试了。


使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2021-7-30 22:46 | 只看该作者
测试红外遥控功能,刚好提供的有个红外控制电视的例程
CIR_TV_Remote_Controller
编译烧录到单片机
通过手机的遥控软件进行测试打印结果如下

效果非常好。
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to use APIs of CIR to convert the output signal of an Infrared Receiver
*
* SPDX-License-Identifier: Apache-2.0
* [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>

#include "NuMicro.h"
#include "Queue.h"
uint32_t Queue[MAX_QUEUE];

/**
  * Receive error int:
  *     The CIR_STATUS_RERRF_Msk will be raised if following reasons.
  *     1. The coming pulse width does not meet the upper and lower bound of all patterns.
  *     2. The first pulse width of coming pattern is not header pattern if pattern type is CIR_POSITIVE_EDGE or CIR_NEGATIVE_EDGE.
  *
  * Due to the repeat code appears alone and is not header patteren. It will cause the CIR_STATUS_RERRF_Msk flag to be raised.
  * Programmer needs to judge if the error event caused by repeat code.
  */
void CIR_IRQHandler(void)
{
    uint32_t status = CIR_GetIntFlag(CIR0) & CIR_GetEnabledIntMask(CIR0);

    if(status & CIR_STATUS_RERRF_Msk)
    {
        uint32_t u32Hb, u32Lb;
        /*
         * Due to the special pattern (repeat code) out of header pattern and end pattern.
         * It will generate a error event. As raised a error event,
         * programmer needs to judge if the event caused by special pattern.
         */
        CIR_GetPatternBoundary(CIR0, CIR_SPECIAL_PAT, &u32Hb, &u32Lb);
        if((CIR_GetLatchedTimerValue(CIR0)< u32Hb)   &&   (CIR_GetLatchedTimerValue(CIR0) > u32Lb))
            Push(Queue, 0xFFFFFFFF);                                /* proprietary define repeat code to 0xFFFFFFFF */
        CIR_ClearIntFlag(CIR0, CIR_STATUS_RERRF_Msk);
    }
    else if(status & CIR_STATUS_EPMF_Msk)
    {
        uint32_t u32Data0, u32Data1;

        /* End Patter match int */
        CIR_ClearIntFlag(CIR0, CIR_STATUS_EPMF_Msk);

        CIR_GetData(CIR0, &u32Data0, &u32Data1);
        Push(Queue, u32Data0);

        /* Clear data fields and bit count for next receiving */
        CIR_ClearDataFieldBitCount(CIR0);
    }
}

void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

    /* Enable HXT clock */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Wait for HXT clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Set core clock as 96MHz from PLL */
    CLK_SetCoreClock(FREQ_96MHZ);

    /* Set PCLK0/PCLK1 to HCLK/2 */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Enable UART module clock */
    CLK_EnableModuleClock(CIR0_MODULE);

    /* Select UART module clock source as HXT and UART module clock divider as 1 */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));

    /* Select CIR module clock source as LIRC */
    CLK_SetModuleClock(CIR0_MODULE, CLK_CLKSEL2_CIR0SEL_LIRC, (uint32_t)NULL);

    /* Update System Core Clock */
    SystemCoreClockUpdate();

    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk);
    SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Set GPC14 multi-function pins for CIR */
    SYS->GPC_MFPH = (SYS->GPC_MFPH & ~SYS_GPC_MFPH_PC14MFP_Msk) | SYS_GPC_MFPH_PC14MFP_CIR0_RXD;

    CLK->PCLKDIV &= ~CLK_PCLKDIV_APB1DIV_Msk;

    /* Lock protected registers */
    SYS_LockReg();
}

void UART0_Init(void)
{
    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}


/**
*    Use AI-26C generic remote controller by setting TV system to Panasonic:
*    Pressed "Setup" up to 3 seconds, then pressed "0", "0", "1" to assign the remote controller to operate on Panasonic mode
*
*    CIR Clock Source From LIRC. T = 30.5us
*
*    unit: us
*    Header    9100+4450
*    Spec      9065+2282
*    D0        576+557
*    D1        576+1690
*    Stop      542+17000
*/
void CIR_Init(void)
{
    CIR_SetClockPrescaler(CIR0, CIR_PRESCALER_1);

    CIR_SetPatternBoundary(CIR0, CIR_HEADER_PAT, ((9100+4450)/26)+15, ((9100+4450)/26)-15);
    CIR_SetPatternBoundary(CIR0, CIR_DATA1_PAT, ((576+1690)/26)+15, ((576+1690)/26)-15);
    CIR_SetPatternBoundary(CIR0, CIR_DATA0_PAT, ((576+557)/26)+15, ((576+557)/26)-15);
    CIR_SetPatternBoundary(CIR0, CIR_SPECIAL_PAT, ((9065+2282)/26)+15, ((9065+2282)/26)-15);
    CIR_SetPatternBoundary(CIR0, CIR_END_PAT, 0, (542+17000)/26);

    CIR_EnableDataCmpWakeup(CIR0, 0x40, 7);                          /* Enable data compare if received data is 0x38 (8 bits) */
    CIR_EnableRecvBitCountMatch(CIR0, 32);                           /* Enable bit count compare if bit count compare match with 32 bit */

    CIR_EnableInt(CIR0, CIR_INTCTL_PERRIEN_Msk|CIR_INTCTL_EPMIEN_Msk);

    CIR_SetInputType(CIR0, CIR_POSITIVE_EDGE, CIR_INVERSE);
    NVIC_EnableIRQ(CIR_IRQn);
    CIR_Open(CIR0);
}

typedef struct
{
    char* KeyString;
    uint32_t IrCode0;
    uint32_t u32Len;
} IR_INFO;

const IR_INFO Array[] =
{
    "POWER",        0xED12BF40, 32,
    "IMAGE",        0xEB14BF40, 32,
    "0",            0xFF00BF40, 32,
    "1",            0xFE01BF40, 32,
    "2",            0xFD02BF40, 32,
    "3",            0xFC03BF40, 32,
    "4",            0xFB04BF40, 32,
    "5",            0xFA05BF40, 32,
    "6",            0xF906BF40, 32,
    "7",            0xF807BF40, 32,
    "8",            0xF708BF40, 32,
    "9",            0xF609BF40, 32,
    "TV",           0xEC13BF40, 32,
    "DISPLAY",      0xE916BF40, 32,
    "CATV",         0xAE51BF40, 32,
    "SLEEP",        0xE11EBF40, 32,
    "RETURN",       0xF30CBF40, 32,
    "INPUT",        0xF40BBF40, 32,
    "SILENT",       0xEF10BF40, 32,
    "VOL_UP",       0xE51ABF40, 32,
    "VOL_DN",       0xE11EBF40, 32,
    "VOL_SILENT",   0xE718BF40, 32,
    "CHAN_UP",      0xE41BBF40, 32,
    "CHAN_DN",      0xE01FBF40, 32,
    "REPEAT",       0xFFFFFFFF, 32,
};


void CIR_Parsing(void)
{
    uint32_t u32IrCode;
    uint32_t i;
    do
    {
        if(isEmpty() != 1)
        {
            u32IrCode = Pop(Queue);
            if(u32IrCode != 0xFFFFFFFF)
            {
                for(i=0; i<sizeof(Array)/ sizeof(Array[0]); i=i+1)
                {
                    if(u32IrCode == Array[i].IrCode0)
                        printf("%s Pressed\n", Array[i].KeyString);
                }
            }
            else
            {
                printf("REPEAT\n");
            }
        }
    }
    while(1);
}

int main()
{

    SYS_Init();                        /* Init System, IP clock and multi-function I/O */

    UART0_Init();                      /* Initialize UART0 */

    printf("\n");
    printf("+------------------------------------------+\n");
    printf("|    M471 CIR Sample Code                  |\n");
    printf("+------------------------------------------+\n");

    CIR_Init();                        /* Base on the remote control to set the timing */

    CIR_Parsing();

    printf("\nCIR Sample Code Completed.\n");

    while (1);
}

/*** (C) COPYRIGHT 2020 Nuvoton Technology Corp. ***/


使用特权

评论回复
评论
gaoyang9992006 2021-7-30 22:47 回复TA
红米手机带红外遥控功能。 
5
Harvard| | 2021-7-30 23:32 | 只看该作者
作为新唐忠实粉丝 居然没有拿到这个板子 ...可惜了

使用特权

评论回复
6
god9987| | 2021-7-31 21:25 | 只看该作者
471KI?
最新的不是481 吗?

使用特权

评论回复
7
god9987| | 2021-7-31 21:28 | 只看该作者
学习学习!

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2021-8-1 16:36 | 只看该作者
god9987 发表于 2021-7-31 21:25
471KI?
最新的不是481 吗?

反正都不新吧,只是新唐公开的晚一点而已。471还没有在官网明面上公开呢。

使用特权

评论回复
9
gaoyang9992006|  楼主 | 2021-8-1 16:36 | 只看该作者
Harvard 发表于 2021-7-30 23:32
作为新唐忠实粉丝 居然没有拿到这个板子 ...可惜了

加油啊,关注新唐的公众微信号了吗

使用特权

评论回复
10
sumoon_yao| | 2021-8-2 10:23 | 只看该作者
开发板的硬件资料有吗

使用特权

评论回复
11
gaoyang9992006|  楼主 | 2021-8-2 22:38 | 只看该作者
sumoon_yao 发表于 2021-8-2 10:23
开发板的硬件资料有吗

回复可见,你也拿到这块板子了吗?

使用特权

评论回复
12
sumoon_yao| | 2021-8-3 08:52 | 只看该作者
gaoyang9992006 发表于 2021-8-2 22:38
回复可见,你也拿到这块板子了吗?

使用特权

评论回复
13
ddw315| | 2021-8-4 10:40 | 只看该作者
看看

使用特权

评论回复
14
Harvard| | 2021-8-4 13:22 | 只看该作者
gaoyang9992006 发表于 2021-8-1 16:36
加油啊,关注新唐的公众微信号了吗

关注了 .一直关注中

使用特权

评论回复
15
muelfox| | 2021-8-6 09:31 | 只看该作者
@小管家 给资料了

使用特权

评论回复
16
jiekou001| | 2023-1-12 16:07 | 只看该作者
需要看看资料,学习学习。

使用特权

评论回复
17
643757107| | 2023-1-12 17:18 | 只看该作者
新唐的资料还是很丰富的。

使用特权

评论回复
18
中国龙芯CDX| | 2023-1-12 20:14 | 只看该作者
新唐的资料却是挺好的,很全

使用特权

评论回复
19
szt1993| | 2023-1-12 20:18 | 只看该作者
新唐的产品一如既往的支持,各方面真心不错

使用特权

评论回复
20
OKAKAKO| | 2023-1-13 19:09 | 只看该作者
新唐的产品跟资料都挺好的

使用特权

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

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1953

主题

15894

帖子

207

粉丝