项目需求:
通过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直接下载的所以无法进行调试,新手小白刚接触,烦请大佬有空帮忙解答一下