| 本帖最后由 JackTang1994 于 2021-9-3 15:04 编辑 
 #技术资源# #申请原创#
 说明:
 硬件平台:ATmega4809 Curiosity Nano
 软件开发工具:Microchip Studio 7
 上一篇**,我们已经完成了ATmega4809芯片时钟的配置(内部20MHZ高速时钟,2分频。)最后到外设这边的时钟为10MHZ
 
 工程示例代码下载
 
 查看电路图确认LED引脚
 找到LED引脚所接的IO口为PF5,由于LED正极接电源所以当LED负极这边为低时,LED被点亮。反之,LED熄灭
 
 
 查看手册关于PORT介绍
 了解下PORT端口的功能(输入、输出、中断、虚拟端口)。
 Mapping of often-used PORT registers into bit-accessible I/O memory space (virtual ports)
 上面这句话为芯片手册上的原话,意思是这个VPORT(虚拟端口)可以通过位操作来访问寄存器相应的位。
 
 PORT与VPORT区别
 主要就是VPORT为PORT精简版即常用的一些功能,同时VPORT可以按位来访问寄存器对应的位。
 PORT与VPORT的映射的地址不一样
 
 VPORT使用
 1. 查看芯片外设映射的内存地址
 我们找到VPORTF寄存器的地址为0x0014
 
 
 
 结构体位域的使用
 C语言结构体允许将一个变量拆成不同的位来访问,这个就是位域操作。
 
 typedef struct VPin_x_Jack{
        uint8_t PIT_0: 1;
        uint8_t PIN_1: 1;
        uint8_t PIN_2: 1;
        uint8_t PIN_3: 1;
        uint8_t PIN_4: 1;
        uint8_t PIN_5: 1;
        uint8_t PIN_6: 1;
        uint8_t PIN_7: 1;
}VPINx_Jack_TypeDef; //使用结构体的位域操作,将1个字节分成8个变量(PIT_0到PIT_7)每一个变量占用一个位
 添加一个新文件夹
 选中工程,然后右键选择Add >> New Folder
 
 向文件夹中添加文件
 新建VPORT.c
 
 选择C file,然后输入C文件名称VPORT.c
 
 
 按照同样的方法,新建VPORT.h文件
 
 2. 设置头文件路径
 打开工程设置窗口
 
 
 点击工程设置,设置头文件路径
 
 
 编写代码
 我们采用结构体来操作外设。因为结构体的占用内存地址和数组一样是连续的,同时我们查看芯片手册也会发现VPORTF外设寄存器组地址也是连接的。所以我们可以将VPORF寄存器基地址赋值给结构体指针。
 
 typedef struct VPin_x_Jack{
        uint8_t PIT_0: 1;
        uint8_t PIN_1: 1;
        uint8_t PIN_2: 1;
        uint8_t PIN_3: 1;
        uint8_t PIN_4: 1;
        uint8_t PIN_5: 1;
        uint8_t PIN_6: 1;
        uint8_t PIN_7: 1;
}VPINx_Jack_TypeDef;
typedef struct VPort_x_Jack{
        VPINx_Jack_TypeDef DIR;
        VPINx_Jack_TypeDef OUT;
        VPINx_Jack_TypeDef IN;
        VPINx_Jack_TypeDef INTFLAGS;
}VPORTx_Jack_TypeDef;
#define VPORTA_Jack (*(VPORTx_Jack_TypeDef *)0x0000)
#define VPORTB_Jack (*(VPORTx_Jack_TypeDef *)0x0004)
#define VPORTC_Jack (*(VPORTx_Jack_TypeDef *)0x0008)
#define VPORTD_Jack (*(VPORTx_Jack_TypeDef *)0x000C)
#define VPORTE_Jack (*(VPORTx_Jack_TypeDef *)0x0010)
#define VPORTF_Jack (*(VPORTx_Jack_TypeDef *)0x0014)
 在main.c文件中引脚头文件
 
 #include <avr/io.h>
#include "VPORTx.h"
extern protected_write_io(void *addr, uint8_t KEY,uint8_t value);
static inline void System_Clock_Setting(void *addr,uint8_t value)
{
        protected_write_io(addr,0xD8,value);
}
void LED_Init(void)
{
        VPORTF_Jack.DIR.PIN_5 = 1; // PF5输出
        VPORTF_Jack.OUT.PIN_5 = 1; // LED灭
}
 
int main(void)
{
        // 配置系统时钟为10MHZ
        System_Clock_Setting((void *)&(CLKCTRL.MCLKCTRLB),CLKCTRL_PDIV_2X_gc | 1 << CLKCTRL_PEN_bp);
        //初始化LED端口
        LED_Init();
        
    while (1) 
    {
    }
}
 LED灯控制代码
 
 VPORTF_Jack.OUT.PIN_5 = 1; // LED灭
VPORTF_Jack.OUT.PIN_5 = 0; // LED亮
 
 调试代码
 1. 设置工程
 配置工程为Simulator,使用模拟调试器进行代码调试
 
 设置为Simulator
 
 
 2.打开I/O View查看引脚寄存器状态
 
 
 
 |