配置如下:
1、USART3寄存器配置
USART_DeInit(USART3);
USART_StructInit(&USART_InitStructure);
USART_Init(USART3,&USART_InitStructure);
USART3->CR1|=0x206c; //;USART模块使能,允许接收发送,使能USART中断
USART3->BRR=0x1A0A; //BaudRate 4800
2、引脚配置
//USART3 配置//
// Configure USART3 Tx (PB.10) as alternate function push-pull //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//对于发送PIN必须配置成复用输出上拉否则不能正常发送//
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// Configure USART3 Rx (PB.11) as input floating //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
//对于接收PIN必须配置成浮点输入否则不能正常接收//
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
3、时钟配置
这里我用到很多其它的外设,也注意了管脚默认功能问题IIC这里是没用开启时钟的
#define GPIO_Remap_JTAG_Disable 0x04000000
//Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|
RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|
RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO,ENABLE);
//启动IO口的复用功能(AFIO), 用于外部中断
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//使能I2C2, SPI2 时钟//
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2|
RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB1Periph_DAC, ENABLE );
4、中断函数如下
可忽略各标志位,现在是发送数据正常(向USART3->DR写数据触发发送中断)。使用上位机串口猎人发送数据,USART3->DR没用接收到数据,无法触发接收终断
void USART3_IRQHandler(void)
{
BYTE RecTemp;
if(USART3->SR&0x40) //发送
{
USART3->SR&=~0x40;
if(SCIStartSent)
{
if(SendCounter<SendBuffer[0])
USART3->DR= SendBuffer[SendCounter++];
else
{
if(!SCIRece)sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信,此种情况专属sentkey
SCISentDis;
SendCounter=0;
SCIStartSent=0;
}
}
}
if(USART3->SR&0x20) //接收 //ReceBuffer[]不包含0x01
{
RecTemp=USART3->DR;
if(AddrEqual==0)
{
if(RecTemp==Saddress)
{
AddrEqual=1; //被正确询址
ReceBuffer[1]=Saddress;
}
}
else
{
if(RendCounter<LENGTH)
ReceBuffer[2+RendCounter++]=RecTemp;
if(RendCounter==LENGTH)
{
RendCounter=0;
if(SCIRece)
{
SCIRece=0;
sentIntervalDelay=3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信
}
FinishedRece=1; //完成一帧数据接收
AddrEqual=0;
SCIstate.bit.SCISendtoComputer = 1; // CP返回数据接收完成,可在1ms中断中进行数据处理
}
}
}
}
5、有没有遇到过类似问题的网友了,谢谢大家讨论帮助!
|