各位老师好,请教: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)
{
}
}