RS485查询发送方式输出乱码,用库函数的输出正常,说明硬件没什么问题,配置就RCC配置和GPIO口配置,其他都没有用到,
不知道到底什么原因,还请前辈们帮忙看下,多谢~~
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
// delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
// LED_Init(); //初始化与LED连接的硬件接口
//清除TC标志 否则总丢失第一个字符
USART2->SR&=0XBF;
while(NbrOfDataToTransfer--)
{
GPIOF->ODR |=1<<11; // 使能发信号
// USART_SendData(USART2,TxBuffer[TxCounter]);
// TxCounter++;
USART2->DR=TxBuffer[TxCounter++];
//总是丢失第一个字符,这个问题的根本原因是复位后,TC和TXE标志位默认都是1;
//while在发送第一个字节时没有起到应有作用,直接跳出,接着写第二个字节,这时第一个字节还未发出,数据被破坏了
while((USART2->SR&0X40)==0);//等待发送结束
printf("\r\nSuccess of displaying\r\n"); ////
//delay_ms(100);
}
}
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<7; //使能PORTF口时钟
RCC->APB1ENR|=1<<17; //使能UART2时钟
GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000B00;//PA2 推挽复用 UART2_TX alternate function push-pull
GPIOA->CRL&=0XFFFF0FFF;
GPIOA->CRL|=0X00004000;//PA3: UART2_RX input floating
//接收、发送方向控制
GPIOF->CRH&=0XFFFF0FFF;
GPIOF->CRH|=0X00003000;//PF11 推挽输出
GPIOF->ODR|=0<<11; //PF11 输出高 发送模式
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //USART2使能 使能发送接收
USART2->CR1&=0XEBFF;//1个起始位、8个数据位、n个位停止、无校验
USART2->CR2&=0XCFFF; // 1个停止位
}
|