打印
[开发板]

CW32L0开发板学习记录二:外部中断控制LED灯电平翻转

[复制链接]
1408|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
聪聪哥哥|  楼主 | 2024-12-7 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1,CW32L0开发板:GPIO口介绍:GPI0 控制器实现芯片内部各类数字和模拟电路与物理引脚之间的联系。

GPI0 可配置为数字输入输出和模拟功能,支持外设功能复用,支持上升沿和下降沿2种中断源,可在深度休眠模式下通过外部中断唤醒 MCU 回到运行模式。
主要特性
所有寄存器通过 AHB 总线接口读写
具有数字输入输出和模拟功能
数字输入输出支持普通 GPI0 和功能复用
模拟功能可作为 ADC、VC、LVD 的输入信号
支持内部多种时钟信号输出
数字输入支持内部上拉和高阻两种模式
数字输出支持推挽和开漏模式
数字输出支持位置位,位清零,位翻转的原子位操作
中断功能支持上升沿、下降沿触发方式
中断具有数字滤波功能,可选择6种时钟源
支持在深度休眠模式下通过外部中断唤醒 MCU


将模拟数字配置寄存器 GPIOx_ANALOG[y] 清零,配置 GP10 端口为数字功能;将输入输出方向寄存器 GPIOx_DIR[y]置位,配置相应的 GPI0 端口为输入模式。数字输入信号可配置:
到达输入数据寄存器 GPIOx IDR
到达片内数字外设
触发中断
在该模式下,数字输入信号通过 ADS 开关导入内部数字输入电路。
经施密特触发器确认电平状态后,可以直接被送往片内复用功能所指向的数字外设的输入,或者通过一个基于
HCLK 的同步器后,在输入数据寄存器 GPIOx IDRy 上呈现。
GPIOx IDR 寄存器的各位与其前面的锁存器组成了一个同步器,可以避免系统时钟变化的时间内引脚电平跳化而
造成的信号不稳定,但是会产生一定的读取延迟。读端口引脚的同步时序如下图所示:


在系统时钟上升沿之后的时钟周期,引脚电平信号会锁存在内部寄存器,如图中阴影部分所示,在下一次系统时钟上升沿之后,稳定的引脚电平信号被读取,再一个系统时钟上升沿时,数据被锁存到 GPIOx_IDR 寄存器中。信号延迟 T 为 1~2 个系统时钟。
如果考虑将该输入信号用于触发中断,还可以启用内置的硬件滤波器电路。该滤波器电路是基于双 D触发器同步器实现的,该同步器的时钟来源有6种,其中部分时钟源是低功耗模式特有的。例如,可以轻易的实现无软件干预的按键消抖操作。具体的时钟源选项及边沿触发选项请参见8.3.6 中断功能。
在该模式下,通过上拉电阻寄存器 GPIOx PUR 可以单独选择打开或者关闭内部上拉功能。

中断功能介绍:
每个 GPI0 在设置为数字输入模式时,可作为外部中断信号源,产生中断的信号源可以设置为上升沿、下降沿2种。
中断触发方式可组合使用,但共用同一个中断标志位。
中断触发后,中断标志寄存器 GPIOx ISR的对应位会被硬件置位,程序可通过查询 GPIOx ISR 来确认产生中断的端口。通过中断标志清除寄存器 GPIOx ICR[],可以清除对应的中断标志位。
内部的中断数字滤波器可对引脚上的输入信号进行数字滤波,提供了6种滤波时钟选择,如下表所示:


由于选择的滤波时钟周期范围宽广,用户可以轻易实现灵活的输入中断防抖功能。输入电平的变化如果未保持超过一个完整的滤波时钟周期,将不会通过硬件滤波器传达到内部中断触发电路。输入电平的变化如果保持超过两个完整的滤波时钟周期,则一定会通过硬件滤波器。
对于边沿触发类型,考虑到对触发沿的时间的敏感性,建议在中断数字滤波器配置寄存器 GPIOx_FILTER[y]中关闭硬件滤波器功能,因为硬件滤波器在提升信号稳定性的同时,也会插入一定延迟。
当 CW32L010 工作于休眠模式 (Sleep mode)或深度休眠模式(DeepSleep mode)时,仍可使用 GPIO 的外部中断功能,当产生外部中断后,可将芯片从休眠模式或深度休眠模式唤醒回到运行模式。
注意:
同组 GPIOx.PINy 共用一个硬件滤波器时钟源选择寄存器,因此同组 GPI0 只能以相同的滤波时钟来过滤输入信号抖动。

二:原理图分析:

KEY1:PB04 KEY02:PA06   LED1:PB02 LED2:PB03
三:软件代码:
按键和LED灯使用的GPIO口初始化部分
   __SYSCTRL_GPIOA_CLK_ENABLE();    //Open GPIOA Clk
   __SYSCTRL_GPIOB_CLK_ENABLE();    //Open GPIOA Clk
    //set PA00 / PA01 / PA02 / PA03 as output
    GPIO_InitStruct.Pins =GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init( CW_GPIOB, &GPIO_InitStruct);
    GPIO_InitStruct.Pins =  GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.IT   = GPIO_IT_NONE;
    GPIO_Init( CW_GPIOA, &GPIO_InitStruct);
    GPIO_InitStruct.Pins =  GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.IT   = GPIO_IT_NONE;
    GPIO_Init( CW_GPIOB, &GPIO_InitStruct);
主程序:
        if( GPIO_ReadPin(CW_GPIOA, GPIO_PIN_6 ) == 0)
        {
            GPIO_WritePin( CW_GPIOB, GPIO_PIN_2|GPIO_PIN_3, GPIO_Pin_SET );
        }
//        else
//        {
//            GPIO_WritePin( CW_GPIOB, GPIO_PIN_2|GPIO_PIN_3, GPIO_Pin_RESET );
//        }
        if( GPIO_ReadPin(CW_GPIOB, GPIO_PIN_4 ) == 0)
        {
            GPIO_WritePin( CW_GPIOB, GPIO_PIN_2|GPIO_PIN_3, GPIO_Pin_RESET );
        }
试验现象:按下key1时:LED灯灭 ;按下 key2时:LED亮

测试视频:
[media=x,500,375][/media]

使用特权

评论回复
沙发
AdaMaYun| | 2024-12-10 08:35 | 只看该作者
外部中断信号源,产生中断的信号源可以设置为上升沿、下降沿2种。

使用特权

评论回复
板凳
LOVEEVER| | 2024-12-12 09:11 | 只看该作者
数字输入信号通过 ADS 开关导入内部数字输入电路。

使用特权

评论回复
地板
小小蚂蚁举千斤| | 2024-12-19 16:26 | 只看该作者
GPI0 可配置为数字输入输出和模拟功能,支持外设功能复用,支持上升沿和下降沿2种中断源,可在深度休眠模式下通过外部中断唤醒 MCU 回到运行模式。

使用特权

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

本版积分规则

49

主题

128

帖子

0

粉丝