CH32V307VCT6 串口中断只能进入1次问题请教!

各位老师好,请教:CH32V307VCT6 串口中断只能进入1次问题?

环境:沁恒官方申请的307开发板+MRS。为验证和实验,用mrs生成工程后,即对串口初始,没有多余的其他应用了。

现象:串口1,中断方式,板子每次复位后能够接收1个字节,之后再收不到了。只能再复位,后只能收到1个字节。


   例:

         我测试应用里,串口助手 发,0xA1 ,点亮了PA0 挂载的LED;再发0xA2 无反应。感觉触发串口中断后就挂在哪个地方死循环出不来一样。

  板子复位启动时能收到printf发来的字符,说明串口和硬件是无问题的。


(        后用CH32V203C8T6 也用一样的方法测试,结果一样,肯定是我那个地方用的不对,肯定是我那个地方用的不对,

    困扰2天了,迟迟无法移植到业务项目中,


    恳请各位老大指导指导 !!  感谢!!

  )


#include "debug.h"

char RxPacket[64]; //接收缓冲区
char TxPacket[64]; //发送缓冲区
uint8_t Serial_RxFlag; //接收完毕标志位
uint8_t pRxPacket = 0;

//===========================================
// 串口初始化
// 使用COM1 口:PA9、10
//===========================================
void Uart_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;

        //普通IO设置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;// USART1_Tx(PA9).
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //USART1_RX   PA.10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    //Usart1 NVIC 配置
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
    NVIC_Init(&NVIC_InitStructure);


    //USART 初始化设置
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);//初始化串口

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);//使能串口1
}


//===========================================
// 串口1 中断
//===========================================
void USART1_IRQHandler(void)
{
    uint8_t RxData;
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
        {
            RxData = USART_ReceiveData(USART1); //获取数据

            if(RxData==0xA1) GPIO_ResetBits(GPIOA, GPIO_Pin_0);
            if(RxData==0xA2) GPIO_SetBits(GPIOA, GPIO_Pin_0);
        }
}


//==========================================================
// 主函数
//==========================================================
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);

    Uart_Init();  //串口初始化

    GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);

    while(1)
    {

    }

}

您好,中断函数注意加中断声明,关于中断声明使用方式,可参考下图:

image.png


问题解决了。

原来是 要在中断函数前声明中断啊。。。。   之前用C51和其他32是不需要对中断函数声明的。

。在一个网页中翻到,:

截图20230721171742.png


void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));


看来这是 CH32V,MRS特有的吧。也可能是我没仔细阅读开发手册。



只有登录才能回复,可以选择微信账号登录