本帖最后由 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查看引脚寄存器状态
|