用的芯片是STM8S103F3.
使用串口1,内部时钟,查询发送,中断或者查询接收
疑问:STM8的管教复用是不是,你配置了串口,那么相应的两个管脚IO就自动成为RXD和TXD?
现在的把收发两个管脚直接短路,程序里面一直在发送,用万用表测试电压为1.8V左右,估计是在不停地发送。我不发送的时候一直保持高电平。
现在怀疑是接收出了问题。
参考的是风驰的串口程序。
初始化程序,都是调用库函数
void Uart_init(void)
{
// UART1_DeInit();
UART1_Init((u32)19200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_RX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
UART1_Cmd(ENABLE);
}
发送函数参考风驰的
void UART1_SendByte(u8 data) //发送字节
{
UART1_SendData8((unsigned char)data);
/* Loop until the end of transmission */
while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
}
void UART1_SendString(u8* Data,u16 len) //发送指定长度的字符串
{
u16 i=0;
for(;i<len;i++)
UART1_SendByte(Data
);
}
接收函数,中断方式:
#pragma vector = ITC_IRQ_UART1_RX + 2
__interrupt void UART1_RX_IRQHandler(void)
{
u8 Res;
if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET)
{/*接收中断(接收到的数据必须是0x0d 0x0a结尾)*/
Res =UART1_ReceiveData8();
/*(USART1->DR);读取接收到的数据,当读完数据后自动取消RXNE的中断标志位*/
rx_buf[rx_counter] = Res;
dis_num[1] = Res;
rx_counter++;
}
}
大家看看还有什么需要配置的吗?感觉是接收不到的问题。
此帖出自小平头技术问答
你好 我最近也在做uart 不过我的芯片是STM8S103F3 参考风驰的例子 但是程序一直在接收中段跳不出来 请问这是什么原因呢
@far @interrupt void UART1_RX_IRQHandler(void)
{
u8 Res;
if(UART1_GetITStatus(UART1_IT_RXNE)!= RESET)
{/*接收中断(接收到的数据必须是0x0d 0x0a结尾)*/
Res =UART1_ReceiveData8();
UART1_ClearITPendingBit(UART1_IT_RXNE);
/*(USART1->DR);读取接收到的数据,当读完数据后自动取消RXNE的中断标志位*/
if(( UART_RX_NUM&0x80)==0)/*接收未完成*/
{
if( UART_RX_NUM&0x40)/*接收到了0x0d*/
{
//UART1_SendString("33333...",sizeof("33333..."));
if(Res!=0x0a) UART_RX_NUM=0;/*接收错误,重新开始*/
else UART_RX_NUM|=0x80; /*接收完成了 */
}
else /*还没收到0X0D*/
{
if(Res==0x0d)
{
UART_RX_NUM|=0x40;
UART1_SendString("55555...",sizeof("55555..."));
}
else
{
RxBuffer[UART_RX_NUM&0X3F]=Res ;
UART_RX_NUM++;
UART1_SendString("33333...",sizeof("33333..."));
#if 1
if( UART_RX_NUM>63)
{
UART_RX_NUM=0;/*接收数据错误,重新开始接收*/
UART1_SendString(" 44444",sizeof(" 44444"));
}
#endif
}
}
}
//UART1_SendString("666666",sizeof("666666"));
}
这是中段程序
你用什么编译器?
一周热门 更多>