|
|
#include "usart1.h"//自身的頭文件
/*******************
函數(shù)名: USART1_init
函數(shù)返回值: 無
函數(shù)參數(shù): U32 bound:設(shè)置的botelv
函數(shù)功能: 實(shí)現(xiàn)USART1的初始化函數(shù)
函數(shù)描述:
********************/
void USART1_init(u32 bound)
{
float USARTDIV;
u32 DIV_Mantivssa = 0;
u32 DIV_Fraction = 0;
u8 over8 = 0;
/****IO口的配置******/
RCC->AHB1ENR |= (0x1<<0);
GPIOA->MODER &= ~(0xf<<18);
GPIOA->MODER |=(0xa<<18); //選擇復(fù)用功能
GPIOA->AFR[1] &=~(0xff<<4); //清零
GPIOA->AFR[1] |=(0x77<<4); //選擇USART1 復(fù)用
/*****串口驅(qū)動(dòng)配置***********/
RCC->APB2ENR |= (0x1<<4); //打開串口時(shí)鐘
USART1->CR1 |= (0x1<<13);
USART1->CR1 &= ~(0x1<<10);
USART1->CR1 &= ~(0x1<<0);
USART1->CR1 |= (0x1<<3); //打開發(fā)送器
USART1->CR1 |= (0x1<<2); //打開接收器
/*******波特率的配置********/
#ifdef OVER8 //采用8倍采樣
USART1->CR1 |= (0x1<<15);
over8 = 1;
#else //采用16倍采樣
USART1->CR1 &= ~(0x1<<15);
over8 = 0;
#endif
USARTDIV=(float)84000000/((8*(2-over8))*bound);
DIV_Mantivssa = USARTDIV;
DIV_Fraction=(USARTDIV-DIV_Mantivssa)*(8*(2-over8));
USART1->BRR = (DIV_Mantivssa<<4 | DIV_Fraction); //寫入計(jì)算好的小數(shù)波特率
}
//串口發(fā)送函數(shù)
void USART1_sendbyte(u8 data)
{
//等待數(shù)據(jù)發(fā)送完成
while((USART1->SR & (0x1<<6))==0);
//發(fā)送該次數(shù)據(jù)
USART1->DR = data;
}
//串口接收函數(shù)
u8 USART1_recbyte(void)
{
u8 data = 0;
//等待數(shù)據(jù)接收完成
while((USART1->SR & (0x1<<5))==0);
//接收該次數(shù)據(jù)
data = USART1->DR;
return data;
}
|
|