打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】:图形化配置IO和UART并驱动OLED

[复制链接]
9453|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 pzsh 于 2021-9-13 13:22 编辑

#申请原创# @21小跑堂
PIC18F16Q41-Curiosity-Nano-Hardware-User-Guide-DS50003048A.pdf (8.68 MB)

开发板采用防静电灰色透明塑料包装,还提供了排针,可以自己根据需要焊接。
外面是红色的纸盒包装,并在包装上贴了使用的基本软件需求。


开发板上的资源如下图所示,可见没有提供片上外部的晶振。只提供了焊接的预留位置。我们学习可以使用内部振荡器即可。

开发板的端口布局如下所示
该开发板小巧美观,方便集成与DIY项目中,另外该开发板主控芯片PIC18F16Q41管脚只有20个,非常适合需要管脚较少的项目开发。

开发板上可直接上手体验的有一个按键,一个橙色LED,以及一个串口可以直接通信使用,接下来我们图形化配置他们。

然后我立马下载安装了最新版的MPLAB X IDE v5.50
按照纸盒上的说明安装了响应的支持包和xc8编译器。不再赘述安装过程,可查看相关帖子。
在工具菜单找到插件,安装MCC插件,采用MCC进行初始化。
根据开发板型号进行选择,最后生成一个MCC工程。

根据手册说明,RC1连接LED,通过低电平点亮。
RC0连接按钮
因此我们可以将这两个端口分别配置为输出和输入。
另外使能串口1,开发板上用的是RB7---TX;RB5---RX;
配置后这样的,然后点生成按钮,按提示完成生成代码工作。

最后main.c主要内容如下所示
#include "mcc_generated_files/mcc.h"

void main(void)
{

    SYSTEM_Initialize();

    while (1)
    {
        printf("Hello world!\n");
        IO_LED_Toggle();
        __delay_ms(500);
    }
}
编译后烧录运行。

然后开发板的橙色LED也按照1S的周期开始闪烁了。

使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2021-8-14 22:28 | 只看该作者

查看原理图得知,开发板并未对SW提供上拉电阻,这是因为芯片内部集成了软件可配置的上下拉电阻。
我们使用MCC自动生成的配置函数
IO_BUTTON_SetPullup() 
进行使能上拉电阻。
将main.c文件修改为
#include "mcc_generated_files/mcc.h"

void get_button(int *i)
{
        if(IO_BUTTON_GetValue()==0)
        {
                __delay_ms(5);
                if(IO_BUTTON_GetValue()==0)
                {
                        while(IO_BUTTON_GetValue()==0);
                        (*i)--;
                        if(*i<=0) *i=10;
                        printf("i=%d                T=%.2f s \n",*i,(float)*i/5);
                }
        }
}

void main(void)
{
        int t=10;
    int i=0;
    int val=0;
    SYSTEM_Initialize();
    IO_BUTTON_SetPullup() ;
   
    printf("Hello world!\n");
    while (1)
    {
        IO_LED_Toggle() ;
        get_button(&t);        
        for(i=0;i<t;i++)
             __delay_ms(50);
        val=IO_BUTTON_GetValue();
        printf("val=%d\n",val);
    }
}
我们实现了通过按键调整LED闪烁的频率,同时打印出了闪烁频率相关的参数和周期值,同时可以打印当前按键接口的高低电平状态。

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2021-8-14 22:42 | 只看该作者
最后提供一下该测试项目工程,方便其他朋友验证或参考
001.zip (39.38 KB)




使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2021-8-14 23:57 | 只看该作者
本帖最后由 gaoyang9992006 于 2021-8-15 16:35 编辑

接下来我们实现点亮IIC接口的OLED
该OLED是128×32分辨率
接口顺序是GND,VCC,SCL,SDA
我们可以使用开发板上的右上角四个接口:RC2,RA2,RC3,GND
我们让接口按照以下规则对应
OLED--------------CNANO
GND --------------GND
VCC ---------------RC3
SCL ---------------RA2      
SDA ---------------RC2
直接可以将OLED插入开发板上的接口,如下图所示

接下来我们配置RC3,让其输出高电平为OLED提供电能,这里配置为输出模式,并使能上拉电阻。
RC2和RA2设置为开漏输出,并使能上拉电阻。
并给对应的函数起名,以方便识别是SCL还是SDA,或者是VCC接口。
修改OLED的头文件,以完成oled.h的内部调用IO高低操作的函数映射。
//-----------------OLED端口定义----------------

#define OLED_SCL_Clr() IO_SCL_SetLow()
#define OLED_SCL_Set() IO_SCL_SetHigh()

#define OLED_SDA_Clr() IO_SDA_SetLow()
#define OLED_SDA_Set() IO_SDA_SetHigh()
最后我们的main.c就是
//#include "mcc_generated_files/mcc.h"
#include "OLED/oled.h"
void get_button(int *i)
{
        if(IO_BUTTON_GetValue()==0)
        {
                __delay_ms(5);
                if(IO_BUTTON_GetValue()==0)
                {
                        while(IO_BUTTON_GetValue()==0);
                        (*i)--;
                        if(*i<=0) *i=10;
                        printf("i=%d                T=%.2f s \n",*i,(float)*i/5);
                }
        }
}

void main(void)
{
        int t=10;
    int i=0;
    int val=0;
    SYSTEM_Initialize();
    IO_BUTTON_SetPullup();
    IO_VCC_SetHigh();
    IO_VCC_SetPullup();

    IO_SCL_SetOpenDrain();
    IO_SDA_SetOpenDrain();
    IO_SCL_SetPullup();
    IO_SDA_SetPullup();
   
    OLED_Init();//初始化OLED
    __delay_ms(5);
        OLED_ColorTurn(0);//0正常显示,1 反色显示
        OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
            for(i=0;i<8;i++)
                OLED_ShowChinese(i*16,0,i,16);
    OLED_ShowString(0,2,"PIC18F16Q41",16);
    printf("Hello world!\n");
    while (1)
    {
        IO_LED_Toggle() ;
        get_button(&t);        
        for(i=0;i<t;i++)
             __delay_ms(50);
        val=IO_BUTTON_GetValue();
        printf("val=%d\n",val);
        OLED_ShowNum(8*14,2,t,2,16);
    }
}
编译烧录,就是上图那个状态了,通过按键可以调整最后的数字用于调试闪烁周期对应的变量。
这里提供完成的工程以供大家测试。
001-02.zip (47.39 KB)
奉上视频:从启动软件,图形化配置,代码编写,烧录运行效果。
https://www.bilibili.com/video/BV1RP4y1W7jW/

使用特权

评论回复
评论
forgot 2023-7-31 17:58 回复TA
赞一个 
5
玛尼玛尼哄| | 2021-8-15 19:58 | 只看该作者
全面,细致。

使用特权

评论回复
6
lulugl| | 2023-7-27 15:39 | 只看该作者
gaoyang9992006 发表于 2021-8-14 23:57
接下来我们实现点亮IIC接口的OLED
该OLED是128×32分辨率
接口顺序是GND,VCC,SCL,SDA

非好的教程!

使用特权

评论回复
7
bestwell| | 2023-8-4 12:54 | 只看该作者
用于简化和加速基于MPLAB X IDE的嵌入式应用程序开发。

使用特权

评论回复
8
maqianqu| | 2023-8-4 13:28 | 只看该作者
MCC 是一个用于快速生成和配置硬件外设代码的插件,可以与 MPLAB X IDE 配合使用。

使用特权

评论回复
9
saservice| | 2023-8-4 13:38 | 只看该作者
MCC插件是Microchip公司提供的一款用于在MPLAB X IDE中进行代码编写、调试和测试的插件。它集成了多种编程工具

使用特权

评论回复
10
51xlf| | 2023-8-4 13:48 | 只看该作者
MPLAB X IDE 则是一个全功能的集成开发环境,用于嵌入式应用程序的开发和调试。

使用特权

评论回复
11
wwppd| | 2023-8-4 13:57 | 只看该作者
MCC插件的优势在于它可以减少手动编写初始化代码和配置代码的工作量,提高开发效率,并降低出错的风险。

使用特权

评论回复
12
kmzuaz| | 2023-8-4 14:06 | 只看该作者
MCC插件也可以与其他编程工具和开发环境进行集成,为开发人员提供更加灵活的开发选择。

使用特权

评论回复
13
hearstnorman323| | 2023-8-4 14:14 | 只看该作者
MPLAB X IDE 是一款经典的集成开发环境,用于 PIC 和 AVR 微处理器的嵌入式应用程序开发

使用特权

评论回复
14
janewood| | 2023-8-4 14:22 | 只看该作者
通过集成MCC插件,你可以在MPLAB X IDE中更方便地进行外设和功能模块的配置和初始化。

使用特权

评论回复
15
mollylawrence| | 2023-8-4 14:33 | 只看该作者
MCC插件是MPLAB X IDE中的一款重要插件,它可以与MPLAB X IDE无缝集成,为开发人员提供更加便捷的编程和调试体验。

使用特权

评论回复
16
pmp| | 2023-8-4 14:44 | 只看该作者
MCC插件是Microchip Configuration Connector的缩写,它是MPLAB的一个插件,用于配置和编程PIC微控制器。

使用特权

评论回复
17
cashrwood| | 2023-8-4 14:54 | 只看该作者
它简化了嵌入式应用程序开发过程中的配置工作,使开发者能够更方便地设置和使用外设。

使用特权

评论回复
18
bartonalfred| | 2023-8-4 15:00 | 只看该作者
MCC 插件是 MPLAB X IDE 的一个附加组件,用于简化硬件外设的配置和代码生成

使用特权

评论回复
19
elsaflower| | 2023-8-4 15:07 | 只看该作者
MCC插件提供了一个图形化界面,使开发人员能够通过简单的拖放操作配置和生成代码,而无需手动编写大量的初始化代码。

使用特权

评论回复
20
saservice| | 2023-8-4 15:13 | 只看该作者
通过 MCC 插件,你可以选择所需的外设(例如GPIO、UART、SPI等),然后通过图形界面进行配置。MCC 将根据你的选择自动生成与所选外设相关的初始化和驱动代码。

使用特权

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

本版积分规则

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

1971

主题

15978

帖子

210

粉丝