打印
[开发板]

CW32L010按键中断

[复制链接]
96|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 meiyaolei 于 2024-12-29 23:00 编辑

CW32L0开发板的GPIO(通用输入输出)口是连接芯片内部各类数字和模拟电路与外部物理引脚的重要桥梁。
通过GPIO口,开发者可以灵活地配置和控制外部设备。

GPIO口的主要特性
寄存器访问:所有与GPIO相关的寄存器都可以通过AHB总线接口进行读写操作,这保证了高速的数据传输和访问效率。
功能多样性:GPIO口既可以配置为数字输入输出,也可以支持模拟功能。数字输入输出支持普通GPIO操作以及功能复用,这意味着同一个GPIO口可以在不同的时间或条件下被不同的外设使用。
模拟功能:作为模拟功能的一部分,GPIO口可以作为ADC(模数转换器)、VC(电压比较器)、LVD(低电压检测)等电路的输入信号,这大大扩展了开发板的应用范围。

时钟信号输出:GPIO口还支持内部多种时钟信号的输出,这对于需要精确时序控制的应用来说是非常有用的。
数字输入模式:数字输入支持内部上拉和高阻两种模式,这可以根据外部电路的需求进行灵活配置。
数字输出模式:数字输出支持推挽和开漏两种模式,以及位置位、位清零、位翻转的原子位操作,这些特性使得GPIO口在控制外部设备时更加灵活和高效。
中断功能:GPIO口支持上升沿和下降沿两种中断触发方式,并且具有数字滤波功能,可以选择6种时钟源进行滤波。GPIO口还支持在深度休眠模式下通过外部中断唤醒MCU,这对于低功耗应用来说是非常重要的。

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

原理图:


了解按键的连接引脚。KEY1:PB04 KEY02:PA06   LED1:PB02 LED2:PB03。

LED
●● 电源指示灯LED3
红色LED3 亮表示评估板已通电,若J23 连接,此时微控制器已通电。
●● 用户LED1、LED2
绿色LED1 和LED2 连接至CW32L010F8P6 I/O:
‒‒ PB03 连接至LED1 阳极
‒‒ PB02 连接至LED2 阳极
轻触开关
●● S3 复位开关
该开关连接至NRST,用于复位CW32L010F8P6 微控制器。
●● S1、S2 用户开关
PB04 连接至S1,外接上拉电阻
PA06 连接至S2,外接上拉电阻

了解一下中断
中断信号源与触发方式
信号源:当GPIO设置为数字输入模式时,它可以作为外部中断信号源。
触发方式:产生中断的信号源可以设置为上升沿或下降沿,这两种触发方式可以组合使用,但会共用同一个中断标志位。

中断触发:当外部信号满足设定的触发条件(上升沿或下降沿)时,中断被触发。
中断标志寄存器:中断触发后,中断标志寄存器(GPIOx ISR)的对应位会被硬件置位。程序可以通过查询这个寄存器来确认是哪个端口产生了中断。
中断处理:程序在识别到中断后,会执行相应的中断服务程序来处理这个中断。
中断标志清除:中断处理完成后,需要通过中断标志清除寄存器(GPIOx ICR[])来清除对应的中断标志位,以便系统可以响应后续的中断。

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



代码:
    GPIO_InitTypeDef GPIO_InitStruct = {0};

   __SYSCTRL_GPIOA_CLK_ENABLE();    //Open GPIOA Clk

    //set PA00 / PA01 / PA02 / PA03 as output
    GPIO_InitStruct.Pins = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_Init( CW_GPIOA, &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);


   __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 );
        }

操作结果:



使用特权

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

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

187

主题

695

帖子

4

粉丝