初级会员

- 积分
- 122
- 金钱
- 122
- 注册时间
- 2010-12-21
- 在线时间
- 0 小时
|

楼主 |
发表于 2011-3-22 21:17:53
|
显示全部楼层
回复【5楼】正点原子:
-------------------------------
下面的代码为usart.c 中的内容:
void USART_Init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa; //定义整数部分
u16 fraction; //定义小数部分
temp=(float)(pclk2*1000000)/(bound*16); //得到USARTDIV
mantissa=(u16)temp; //(此处比原码多加了一个u16强制类型转换,因为提示有警告)
fraction=(u16)((temp-mantissa)*16);
mantissa<<=4; //左移4位得到整数部分
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能USART1时钟
GPIOA->CRH=0X444444B4; //IO状态设置  A9推挽输出,PA10浮空输入
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14); //停止复位
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.8位数据位,
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
下面的两个函数另外写的:(对printf不造成影响吧?)
----------------------------------------------------------------------------------------------------
void USART_SendChar(uint8_t data)
{
USART1->DR = data;
while((USART1->SR&0x40) == 0); //TXE=0时,一直等待,直到发送完成
}
void USART_SendString(uint8_t *string)
{
while(*string)
{
USART1->DR = *string++;
while((USART1->SR&0x40) == 0); //TXE=0时,一直等待,直到发送完成
}
}
---------------------------------------------------------------------------------------------------------------
|
|