新手刚接触,遇到无法中断,请求大佬指教,使用芯片型号是CH32V203RBT6

项目需求:

通过PC串口或其他并联板的串口,发送一个指令(如1,2,3,4等)到CH32V203RBT6芯片的串口2中,芯片的串口2接收到之后,简单处理,如发送的是1,那么返回A,如发送的是2,返回B


我的设计思路:

初始化串口2,并启动接收中断,当接收到串口2数据,进行判断,是1,马上串口2发回字符A


问题:

没有进入中断接收


代码


#include "usart.h"


//保证中断之后程序的正常运行,不添加情况下,中断前数据不会被返回

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


void USART2_CFG(uint32_t baudrate) {

    GPIO_InitTypeDef GPIO_InitStructure; // GPIO结构体

    USART_InitTypeDef USATRT_InitStructure; // 串口结构体

    NVIC_InitTypeDef NVIC_InitStructure; // 中断函数结构体


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 加载串口2时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 加载串口1的GPIOA时钟


    USART_DeInit(USART2); // 串口初始化声明

    // 设置PA2,PA3的两个引脚

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2端口 TX

    GPIO_InitStructure.GPIO_Pin = GPIO_Speed_50MHz; // 选择速度

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽模式

    GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化PA2


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3端口 RX

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空模式

    GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化PA3


    USATRT_InitStructure.USART_BaudRate = baudrate; // 设置串口波特率

    USATRT_InitStructure.USART_WordLength = USART_WordLength_8b; // 字节长度

    USATRT_InitStructure.USART_StopBits = USART_StopBits_1; // 设置停止位 1

    USATRT_InitStructure.USART_Parity = USART_Parity_No; // 奇偶校验 不使用奇偶校验

    USATRT_InitStructure.USART_HardwareFlowControl =

    USART_HardwareFlowControl_None; // 硬件流控制:无

    USATRT_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //输入输出模式 TX|RX


    USART_Init(USART2, &USATRT_InitStructure); // 初始化串口2

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 启动中断


    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // 中断函数 串口2

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级 1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级默认为 0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IR通道启用

    NVIC_Init(&NVIC_InitStructure); // 中断优先级初始化


    USART_Cmd(USART2, ENABLE); // 启动串口2


} // 初始化串口函数


void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data) {

    USART_SendData(pUSARTx, data); // 发送字符函数

    while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)==RESET);

} // 发送单个字符


void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str) {

    uint8_t i = 0;

    do {

        // 利用循环把字符串逐个字节发送出去,直至字符串为空

        USARTx_SendByte(pUSARTx, *(str + i));

        i++;

    } while (*(str + i) != '\0');


    while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);


} // 串口发送字符串函数


void USART2_IRQHandler(void) {

//    uint8_t ucTemp;

    if (USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET) {

        USART_ClearFlag(USART2, USART_IT_RXNE); // 清除中断寄存器标志

//        ucTemp = USART_ReceiveData(USART2); // 接收串口2数据

//        ZM1=ucTemp;

        USARTx_SendStr(USART2, "vca\n"); // 输出字符串

    }

} // 串口2的中断函数



WCH-LINK线还在运输的路上,现在是USB直接下载的所以无法进行调试,新手小白刚接触,烦请大佬有空帮忙解答一下

中断中发送也需要判断标志位的

    while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)==RESET);


感谢你回复,我是在中断中,调用发送的函数,USARTx_SendStr 这个函数里面已经有判断标志位,请问这样写是否有问题?


您好,附件例程是根据你设计思路写的参考例程,发1回A,如下图,你可以参考一下

icon_rar.gifCH32V203 USART2接收中断.zip

image.png

image.png


非常感谢,马上测试


拿到了代码,原文没改,但还是不行

芯片启动的时候输出是正确的,证明串口和程序都启动和写入正确了,但发送过去,返回的还是1不是A

我截图我的烧录工具选择项目截图和测试串口截图,是什么原因就是不行呢?可以从哪些地方去检查?求解


1710302417110695.png

1710302417169453.png




您好,你直接使用我例程做测试,不要做任何修改,工程已根据你的型号进行了配置,下载时FLASH、RAM的大小选择160+32,如下图。

icon_rar.gifCH32V203 USART2接收中断.zip

image.png


收到,马上测试


我是用USB直连下载程序的,配置按你说的配置了32+160,并且没有修改任何东西直接运行,效果还是一样,以下是截图,看下

下载设置.png2.png


你好,我这边测试也是符合预期的,请您留个微信我加你具体看一下你的工程image.png


另外问一下,我的芯片型号是CH32V203RBT6 和 C8T6一样的是不?


发您的工程已经改成RBT6了,只是工程名字没改,要是还没有解决,请您留个微信,我这边远程给你看下。


已私信你了,还没解决,摸不着头脑不知哪里出现问题了,感谢


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