KEAZ128学习(三)--- GPIO和PORT

本文详细介绍了KEAZ128核心板上的GPIO配置与使用,包括端口控制器(PORT)和通用输入输出(GPIO)的功能,如数据方向、上拉使能、滤波设置等。并提供了NXP GPIO配置实例,展示了如何在KEA上实现高灵活性的IO口应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、开发平台使用

  • 山外KEAZ128核心板(使用Jlink解除保护)
  • 使用Keil 5.25

2、PORT描述

PORT也叫做端口控制器,在NXP上,GPIO的控制是分成PORT和GPIO两个部分进行控制的,即使是在Kinetis K60上也一样。
在KEAZ128上,PORT的控制主要有:

  • 端口数据及数据方向
  • 内部上拉使能
  • 输入干扰滤波设置
  • 高电流驱动
  • 停止模式

习惯于使用ST的朋友,看到这个一定会感到很陌生,毕竟ST上要么没有这些功能,要么就PORT和GPIO的功能都写在一起了。因为NXP这样的寄存器设计,也造就了IO口的高灵活应用。对于做量产产品的客户,输入干扰滤波设置能够很好的保证了EMC测试的时候能通过。在初始上电时,除了几个默认IO,比如SWD接口等等,几个特殊接口之外,其余未配置的IO口会被默认为高阻态(Hi-Z)。

3、GPIO描述

说到GPIO并不会觉得陌生,即通用输入输出,在KEA的GPIO中,有如下功能:

  • 在所有数字引脚重用模式中,输入数据寄存器引脚可见。
  • 带有相应的设置/清除/反转寄存器的输出数据寄存器引脚。
  • 数据方向寄存器引脚。
  • 以零等待状态(IOPORT)访问 GPIO 寄存器。

GPIO的时钟挂在系统时钟上,每个功能都使用单独的寄存器进行控制,GPIO寄存器如下:

  • PDOR

  • PSOR

  • PCOR

  • PTOR

  • PDIR

  • PDDR

  • PIDR

    对应的相关描述,查看数据手册即可。
    KEA的GPIO端口有三组,GPIOA,GPIOB,GPIOC。但是IO端口则有PTA PTB PTC PTD PTE PTF PTG PTH PTI,以8位的形式组合在GPIO上(这设计真觉得有点恶心。。)。因此在编程中,需要自己额外定义好PORT端口,以及GPIO_PIN。

4、GPIO输入输出配置

我觉得NXP的头文件还是很良心的(虽然我们自己也会这样写),它帮我们定义好了相关寄存器的位带操作,如图:

在这里插入图片描述
这仅仅是GPIO的,在’'SKEAZ1284.h"这个头文件中,基本上涵盖了KEA所有的寄存器位带定义,寄存器操作起来十分方便,且很直观。而GPIO的配置功能,只需要根据自己的要求,先配置好PORT,再配置GPIO即可。

注:KEA在配置引脚输入输出时,并没有像Kinetis K60那样需要先开启时钟、清除DMA中断标志等操作,可直接进行寄存器操作,如:

GPIO_PDOR_REG(GPIOA)  |= (1<<7);
GPIO_PDDR_REG(GPIOA)  |= (1<<7);

在配置输入输出之前,应该先配置IO的上拉下拉、是否开漏等等,再进行IO的输入输出的初始化。

### WS2812 LED 驱动与 KEAZ128 单片机应用实例 #### 一、硬件连接 为了使 KEAZ128 控制 WS2812 RGB LED,需要通过 GPIO 口发送特定的时序信号来控制这些灯珠的颜色亮度。通常情况下,WS2812 的数据输入端 DIN 连接到单片机的一个 I/O 引脚上。 #### 二、软件编程要点 KEAZ128 处理器具有丰富的外设资源以及灵活的工作模式,在处理像 WS2812 这样的高速通信协议时可以采用定时器配合 DMA 或者直接利用 CPU 循环精确延时的方法生成所需的波形[^1]。 对于 WS2812 来说,其通讯接口要求严格的高低电平宽度比例,具体表现为 T0H/T1H T0L/T1L 时间间隔的不同组合表示逻辑 '0' '1'。因此编写驱动程序的关键在于如何精准地控制这些时间参数: ```c void ws2812_send_bit(uint8_t bit){ if(bit){ // 发送高电平位 (T1) SET_PIN_HIGH(DATA_PORT, DATA_PIN); __delay_cycles(T1HIGH_CYCLES); SET_PIN_LOW(DATA_PORT, DATA_PIN); __delay_cycles(T1LOW_CYCLES); }else{ // 发送低电平位 (T0) SET_PIN_HIGH(DATA_PORT, DATA_PIN); __delay_cycles(T0HIGH_CYCLES); SET_PIN_LOW(DATA_PORT, DATA_PIN); __delay_cycles(T0LOW_CYCLES); } } ``` 此函数用于向 WS2812 设备传输单一比特的数据流,其中 `__delay_cycles()` 函数用来产生微秒级别的延迟周期数,而宏定义 `SET_PIN_*` 则负责设置指定引脚的状态变化。 #### 、注意事项 由于 WS2812 对时序非常敏感,所以在实际开发过程中可能还需要考虑如下因素: - **电源稳定性**:确保足够的电流供应给所有的LED单元; - **布线长度影响**:较长导线可能会引起信号衰减甚至反射干扰正常工作; - **优化算法效率**:减少不必要的计算开销以提高刷新频率;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值