想利用开发板里面的RS232,就必须对USART2进行初始化,PA3和PA2的跳线帽必须跳好,根据原子的USART1的代码修改后,发现接收乱码:
[mw_shl_code=c,true]初始化函数:[/mw_shl_code]
[mw_shl_code=c,true]void uart2_init(u32 pclk2, 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->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口时钟
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //1位停止,无校验位.
}[/mw_shl_code]
[mw_shl_code=c,true]发送函数:[/mw_shl_code]
[mw_shl_code=c,true]void uart2_putc(u8 data)
{
while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
USART2->DR = (u8)data;
return;
}[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]主函数里面添加:[/mw_shl_code]
[mw_shl_code=c,true]int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200);
LED_Init(); //初始化与LED连接的硬件接
uart2_init(72,115200); //usart2初始化
uart2_putc(0x10); //usart2发送一个数
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}[/mw_shl_code]
[/mw_shl_code]
烧进开发板后,通过串口接收显示为乱码:
最后发现是弄错了usart1与usart2的时钟源,usart1的时钟源是APB2,usart1的时钟源是APB1,APB2最大为72MHz,APB1最大为36MHz。
我们在看看原子的时钟初始化函数:
所以usart2里面的时钟应该是36MHz修改主函数代码:
[mw_shl_code=c,true]int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200);
LED_Init(); //初始化与LED连接的硬件接
////////////////////////////////重点
uart2_init(36,115200); //usart2初始化,第一个参数是36,不是72
uart2_putc(0x10); //usart2发送一个数
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}[/mw_shl_code]
烧到开发板结果:
问题解决。 |