abner_ma 发表于 2025-6-18 18:18

【沁恒蓝牙SOC——CH579M篇】GPIO中断引发串口打印

CH579 是集成 BLE 无线通讯的 ARM 内核 32 位微控制器。片上集成低功耗蓝牙 BLE 通讯模块、以太网控制器及收发器、全速 USB 主机和设备控制器及收发器、段式 LCD 驱动模块、ADC、触摸按键检测模块、RTC 等丰富的外设资源。
功能强大:通用输入输出端口 GPIO:
- 40 个 GPIO,其中 4 个支持 5V 信号输入
- 32 个中断输入,32 个唤醒输




最小系统原理图:

程序设计使用GPIO7下降沿触发中断的程序,实现了GPIO下降沿中断和UART1接收中断的回显功能。短接GIPO7和GND,进入中断后引发串口将会打印。

#include "CH57x_common.h"

__align(4) UINT8RxBuffer[ MAX_PACKET_SIZE ];// IN, must even address
__align(4) UINT8TxBuffer[ MAX_PACKET_SIZE ];// OUT, must even address

int main()
{
        //上拉
        GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PU);
        //下降沿触发
        GPIOA_ITModeCfg(GPIO_Pin_7,GPIO_ITMode_FallEdge);
        //        NVIC_SetPriority(GPIO_IRQn,4);//设置中断优先级(也可以不设置,默认 4)
        //使能中断
        NVIC_EnableIRQ( GPIO_IRQn );
       
        /*配置串口1*/
        GPIOA_SetBits(GPIO_Pin_9);
        GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);   // RXD-配置上拉输入
        GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);// TXD-配置推挽输出,注意先让IO口输出高电平
        UART1_DefInit();
        /*使能接收中断,接收错误中断*/
        UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
//        NVIC_SetPriority(TMR0_IRQn,18);//设置中断优先级(也可以不设置,默认14)
        NVIC_EnableIRQ( UART1_IRQn );
       
        while(1)
        {
        }
}

//GPIO中断
void GPIO_IRQHandler(void) {
        if(GPIOA_ReadITFlagBit(GPIO_Pin_7))
        {
                GPIOA_ClearITFlagBit(GPIO_Pin_7);
                PRINT("gpio interrupt\r\n");
        }
}

/*串口中断*/
void UART1_IRQHandler(void)
{
        char data;
        switch( UART1_GetITFlag() )
        {
                case UART_II_LINE_STAT:          // 线路状态错误
                                UART1_GetLinSTA();
                                break;
                case UART_II_RECV_RDY:          // 数据达到设置触发点
                                data = UART1_RecvByte();
                                UART1_SendByte(data);
                                break;
                case UART_II_RECV_TOUT:         // 接收超时,暂时一帧数据接收完成
                                data = UART1_RecvByte();
                                UART1_SendByte(data);
                                break;
                case UART_II_THR_EMPTY:         // 发送缓存区空,可继续发送
                                break;
                case UART_II_MODEM_CHG:         // 只支持串口0
                                break;
                default:
                                break;
        }
}


页: [1]
查看完整版本: 【沁恒蓝牙SOC——CH579M篇】GPIO中断引发串口打印