我查看了STM32F4的手册,应该IO都能复用的,现在我已经调通USART2了,用相同的初始化程序,只是将USART2的部分换成了USART3,发现不能正常通讯,程序如下:
[mw_shl_code=c,true]void Rs485Usart3Init(u32 pclk1 , u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float) (pclk1 * 1000000) / (bound * 16);//得到USARTDIV
mantissa = temp; //得到整数部分
fraction = (temp - mantissa) * 16; //得到小数部分
mantissa <<= 4;
mantissa += fraction;
RCC->AHB1ENR |= 1 << 3;
RCC->AHB1ENR |= 1 << 0;
RCC->AHB1ENR |= 1 << 1;
GpioSet(GPIOB,PIN7,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GpioSet(GPIOA,PIN3,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
GpioSet(GPIOD,PIN5,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
GpioAfSet(GPIOA,3,7);
GpioAfSet(GPIOD,5,7);
// GpioSet(GPIOC,PIN8,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
// GpioSet(GPIOC,PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
// GpioSet(GPIOC,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
// GpioAfSet(GPIOC,6,7);
// GpioAfSet(GPIOC,7,7);
RCC->APB1ENR |= 1 << 18; //使能串口3时钟
RCC->APB1RSTR |= 1 << 18; //复位串口3
RCC->APB1RSTR &= ~(1<<18); //停止复位
//波特率设置
USART3->BRR = mantissa; // 波特率设置
USART3->CR1 |= 0X200C; //1位停止,无校验位.
//使能接收中断
USART3->CR1 |= 1 << 2; //串口接收使能
USART3->CR1 |= 1 << 5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQn,3);//组2,最低优先级
rs485Usart3TxEn = 0 ; //默认为接收模式
}
void Rs485Usart3Send(u8 *buf , u8 len)
{
u8 sendCnt;
u8 sendMsg[3] ={0x11,0x66,0x55};
rs485Usart3TxEn = 1;
for(sendCnt=0;sendCnt<3;sendCnt++)
{
while((USART3->SR&0X40)==0);//等待发送结束
USART3->DR = sendMsg[sendCnt];
}
while((USART3->SR&0X40)==0);//等待发送结束
rs485Usart3TxEn = 0;
}
void USART3_IRQHandler(void)
{
u8 recData;
if(USART3->SR&(1<<5)) //接收到数据
{
recData = USART3->DR; //存储接收到数据
if(pcRxCnt<64)
{
pcRxBuf[pcRxCnt] = recData ;
pcRxCnt ++;
}
}
pcRxBuf[10] +=1;
}[/mw_shl_code]
这究竟是哪里出错了,请帮忙看看,谢谢!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>