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

ATmega4809开发——GPIO输出

[复制链接]
969|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JackTang1994 于 2021-9-3 15:04 编辑

#技术资源# #申请原创#
说明:
硬件平台:ATmega4809 Curiosity Nano
软件开发工具:Microchip Studio 7
上一篇**,我们已经完成了ATmega4809芯片时钟的配置(内部20MHZ高速时钟,2分频。)最后到外设这边的时钟为10MHZ

工程示例代码下载 ATMEGA4809_LED.zip (47.37 KB)

查看电路图确认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查看引脚寄存器状态


使用特权

评论回复
沙发
lcczg| | 2021-9-6 14:17 | 只看该作者
很详细,点赞

使用特权

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

本版积分规则

27

主题

60

帖子

0

粉丝