串口接收数据失败
void Usart_Configuration(uint32_t BaudRate)
{
USART_InitTypeDef USART_InitStructure; //定义一个串口结构体
USART_InitStructure.USART_BaudRate =BaudRate ; //波特率115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //传输过程中使用8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; //在帧结尾传输1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No ; //奇偶失能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流失能
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //接收和发送模式
USART_Init(USART1, &USART_InitStructure); //根据参数初始化串口寄存器
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口中断接收
USART_Cmd(USART1, ENABLE); //使能串口外设
}
int main(void)
{
SystemInit(); //系统时钟配置
Init_LED(); //各个外设引脚配置
Init_Usart(); //串口引脚配置
Usart_Configuration(115200); //串口配置 设置波特率为115200
while(1)
{
printf("%d",USART1_Receive_Byte());
}
是stm32fxxx_it.c,刚才写错了
是不是没有初始化IO口时钟?
我给看看先呗~~
学习一下
亲,你把代码贴全一点,串口的接收和发送程序没有贴出来,没法看问题出在哪里啊
没有初始化时钟;吧,串口和GPIO
没有使能串口中断几优先级配置
void USART1_Send_Byte(uint16_t Data)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
//USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
USART_SendData(USART1,Data); //发送一个字符
}
uint8_t USART1_Receive_Byte(void)
{
while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位
//USART_FLAG_RXNE:接收数据寄存器非空标志位
//1:忙状态 0:空闲(没收到数据,等待。)
return USART_ReceiveData(USART1); //接收一个字符
}
如果没有初始化IO适中的话,应该电脑收不到芯片发送的数据啊?
你的中断服务程序呢?
1.你开了接收中断,但是中断服务程序呢?中断要配置中断优先级的(NVIC)
2.用printf要用C库函数进行重定义,在网上很多
串口中断使用需注意:在串口中断服务函数里每一次要把读写寄存器里的内容读走,另外 看看有没有别的中断打断了串口中断 使能配置都配置好了没有 时钟都开了没有 IO模式配置对了没有 我能想到的就这些
串口中断使用要注意,串口中断服务函数要把读写寄存器里的内容读走
我删掉了这条语句,把接收函数直接写到了主函数里
int main(void)
{
SystemInit();
Init_Usart();
Usart_Configuration(115200);
while(1)
{
u8 i=65;
printf(menu);
i=USART1_Receive_Byte();
// Delay_Ms(1000); //系统时钟配置
USART1_Send_Byte(i);
printf("%c",i);
Delay_Ms(1000);
}
}
这个接受字节的函数必须放到中断里?
这样肯定是不行的,接收要放到中断里,用一个数组把数据接收下来,然后需要的话把数组读出来,或者不用数组,把接收的数据直接再发回串口
哦?好吧,我再试试
void Init_NVIC(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
不知道是哪里的问题始终不进中断?
在stm32fxxx.it中添加这个函数,或是在其他文件中添加这个函数,函数名必须是这个,函数内容自己写,注意必须是void返回void参数
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
ComRev_ISR();
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
这个函数我写了,现在的问题是,我检测了一下中断进入状态,始终返回0,但是当我吧RX线拔下来是,就进中断了!而且出不来始终在中断里!
