需要帮忙看看程序出现了什么问题,顶贴不能解决什么问题,反而有借机赚分的嫌疑 ...
不懂的情况下,帮顶当然是赚分的!
不帮你顶,你的帖子2天就沉了,没人看了! void USART1_Printf(uint8_t* String)
{
while(*String!='\0')
{
USART_SendData(USART1, (uint16_t)*String);
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
while(USART_GetITStatus(USART1,USART_IT_TC)==RESET)
{
Char_LED(ON);
}
// USART1_Busy=SET;
// while (USART1_Busy==SET)
// {
// Char_LED(ON);
// }
String++;
}
// USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
USART_ITConfig(USART1,USART_IT_TC,DISABLE);
//¹Ø±Õ·¢ËÍÖжÏ
}
我不太懂你这里为什么用TXE不用TC,如果可以你改成这样试试 void USART1_Printf(uint8_t* String)
{
while(*String!='\0')
{
USART_SendData(USART1, (uint16_t)*String);
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
while(USART_GetITStatus(USART1,USART_IT_TC)==RESET)
{
Char_LED(ON);
}
// USART1_Busy=SET;
// while (USART1_Busy==SET)
// {
// Char_LED(ON);
// }
String++;
}
// USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
USART_ITConfig(USART1,USART_IT_TC,DISABLE);
//¹Ø±Õ·¢ËÍÖжÏ
}
我不太懂你这里为什么用TXE不用TC,如果可以你改成这样试试 帮顶,,,,,,,,,,,,, 00-405686 发表于 2015-7-27 11:45
void USART1_Printf(uint8_t* String)
{
while(*String!='\0')
非常感谢你的帮助,问题已经解决!!! 00-405686 发表于 2015-7-27 11:45
void USART1_Printf(uint8_t* String)
{
while(*String!='\0')
结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
解决问题后的代码如下:
void USART1_IRQHandler(void)
{
uint8_tRx_Data_Buf=0;
if(USART_GetFlagStatus(USART1, USART_FLAG_TC) ==SET) //发送中断被触发
{
USART_ClearFlag(USART1, USART_FLAG_TC);
USART1_Busy=RESET;
USART2_String("T\n");
}
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ==SET)//接收中断被触发
{
Rx_Data_Buf=USART_ReceiveData(USART1);
if (Rx_Data_Buf!='\n')
{
USART1_RxData_buffer = Rx_Data_Buf;
Rx_count++;
if (Rx_count==1&&USART1_RxData_buffer !='A')
Rx_count=0;
if (Rx_count==2&&USART1_RxData_buffer !='X' )
{
if(USART1_RxData_buffer =='A' )
Rx_count=1;
else
Rx_count=0;
}
if (Rx_count==3&&USART1_RxData_buffer !='X' )
{
if(USART1_RxData_buffer =='A' )
Rx_count=1;
else
Rx_count=0;
}
//以上过滤无效打印信息,只有AXX开头的字符串才认为是需要接收的模块命令;
}
if (Rx_Data_Buf=='\n' && Rx_count> 10)
{
USART1_RxData_buffer = Rx_Data_Buf;
USART1_RxData_buffer ='\0';
Rx_count = 0;
Rx_ReadData_Over=SET;
}
}
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) ==SET) //接收溢出中断被触发
{
USART_ClearFlag(USART1, USART_FLAG_ORE);
USART2_Printf("USART1 ISR(ORE)= %b\n",USART1->ISR);
}
//USART2_Printf("USART1 ISR= %b\n",USART1->ISR);
}
就是把之前的 :USART_GetITStatus(USART1,USART_IT_RXNE) 修改为:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
根本原因就是对这两个库函数的功能没有搞清楚;USART_GetITStatus(USART1,USART_IT_RXNE)这个函数的功能是获取你设置了那些中断,因为函数返回的是CR1/CR2/CR3的相应标志位;而中断函数中需要查询的是当前是哪个中断产生,所以必须使用USART_GetFlagStatus(USART1,USART_FLAG_RXNE);因为所有的中断请求都是在ISR寄存器中;查看库函数,只有这个函数返回的是ISR寄存器的值。
新手接触STM32,走了很多弯路!!!并且STM32F030系列的编程参考手册没有中文的,我们这些英文不太好的新手 ,学起来相当费力啊!!!希望以后不要再走这样的弯路!!!! yinlian 发表于 2015-8-1 23:25
结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
解决问题后的代码如下:
void ...
问题解决了就好 最近在调试LO系列也有类似问题,在F1系列没有,看看LZ有没有效果
页:
1
[2]