[PIC®/AVR®/dsPIC®产品] ATmega4809开发——GPIO输出

[复制链接]
1420|1
 楼主| JackTang1994 发表于 2021-9-3 14:42 | 显示全部楼层 |阅读模式
本帖最后由 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语言结构体允许将一个变量拆成不同的位来访问,这个就是位域操作。
  1. typedef struct VPin_x_Jack{
  2.         uint8_t PIT_0: 1;
  3.         uint8_t PIN_1: 1;
  4.         uint8_t PIN_2: 1;
  5.         uint8_t PIN_3: 1;
  6.         uint8_t PIN_4: 1;
  7.         uint8_t PIN_5: 1;
  8.         uint8_t PIN_6: 1;
  9.         uint8_t PIN_7: 1;
  10. }VPINx_Jack_TypeDef; //使用结构体的位域操作,将1个字节分成8个变量(PIT_0到PIT_7)每一个变量占用一个位


添加一个新文件夹
选中工程,然后右键选择Add >> New Folder

向文件夹中添加文件
新建VPORT.c

选择C file,然后输入C文件名称VPORT.c


按照同样的方法,新建VPORT.h文件

2. 设置头文件路径
打开工程设置窗口


点击工程设置,设置头文件路径


编写代码
我们采用结构体来操作外设。因为结构体的占用内存地址和数组一样是连续的,同时我们查看芯片手册也会发现VPORTF外设寄存器组地址也是连接的。所以我们可以将VPORF寄存器基地址赋值给结构体指针。
  1. typedef struct VPin_x_Jack{
  2.         uint8_t PIT_0: 1;
  3.         uint8_t PIN_1: 1;
  4.         uint8_t PIN_2: 1;
  5.         uint8_t PIN_3: 1;
  6.         uint8_t PIN_4: 1;
  7.         uint8_t PIN_5: 1;
  8.         uint8_t PIN_6: 1;
  9.         uint8_t PIN_7: 1;
  10. }VPINx_Jack_TypeDef;

  11. typedef struct VPort_x_Jack{
  12.         VPINx_Jack_TypeDef DIR;
  13.         VPINx_Jack_TypeDef OUT;
  14.         VPINx_Jack_TypeDef IN;
  15.         VPINx_Jack_TypeDef INTFLAGS;
  16. }VPORTx_Jack_TypeDef;


  17. #define VPORTA_Jack (*(VPORTx_Jack_TypeDef *)0x0000)
  18. #define VPORTB_Jack (*(VPORTx_Jack_TypeDef *)0x0004)
  19. #define VPORTC_Jack (*(VPORTx_Jack_TypeDef *)0x0008)
  20. #define VPORTD_Jack (*(VPORTx_Jack_TypeDef *)0x000C)
  21. #define VPORTE_Jack (*(VPORTx_Jack_TypeDef *)0x0010)
  22. #define VPORTF_Jack (*(VPORTx_Jack_TypeDef *)0x0014)


在main.c文件中引脚头文件
  1. #include <avr/io.h>
  2. #include "VPORTx.h"

  3. extern protected_write_io(void *addr, uint8_t KEY,uint8_t value);


  4. static inline void System_Clock_Setting(void *addr,uint8_t value)
  5. {
  6.         protected_write_io(addr,0xD8,value);
  7. }


  8. void LED_Init(void)
  9. {
  10.         VPORTF_Jack.DIR.PIN_5 = 1; // PF5输出
  11.         VPORTF_Jack.OUT.PIN_5 = 1; // LED灭
  12. }


  13. int main(void)
  14. {

  15.         // 配置系统时钟为10MHZ
  16.         System_Clock_Setting((void *)&(CLKCTRL.MCLKCTRLB),CLKCTRL_PDIV_2X_gc | 1 << CLKCTRL_PEN_bp);
  17.         //初始化LED端口
  18.         LED_Init();
  19.         
  20.     while (1)
  21.     {
  22.     }
  23. }


LED灯控制代码
  1. VPORTF_Jack.OUT.PIN_5 = 1; // LED灭
  2. VPORTF_Jack.OUT.PIN_5 = 0; // LED亮



调试代码
1. 设置工程
配置工程为Simulator,使用模拟调试器进行代码调试

设置为Simulator


2.打开I/O View查看引脚寄存器状态


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lcczg 发表于 2021-9-6 14:17 | 显示全部楼层
很详细,点赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部