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