打印
[蓝牙芯片]

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

[复制链接]
1065|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  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) UINT8  RxBuffer[ MAX_PACKET_SIZE ];  // IN, must even address
__align(4) UINT8  TxBuffer[ 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;
        }
}


使用特权

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

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

88

主题

171

帖子

3

粉丝