初级会员

- 积分
- 77
- 金钱
- 77
- 注册时间
- 2012-9-21
- 在线时间
- 0 小时
|
下面是原子大哥的代码
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<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
*******************************************************************************
问题如下:
1. RCC->APB2ENR|=1<<2; //使能PORTA口时钟
2.RCC->APB2ENR|=1<<14; //使能串口时钟
3.GPIOA->CRH&=0XFFFFF00F;
4.GPIOA->CRH|=0X000008B0;//IO状态设置
这个usart1的配置有点不明白,既然usart1是复用功能,只要设置发送器和接收器使能,按理说就开启了
usart功能了。为什么还要对porta时钟使能,开启一个串口时钟不行吗??(实验证明不开启porta时钟不行,但我不明白)
另外 为什么还要单独设置 TX RX作为输出输入。我试了TX如果不设置输出不行,另外RX用作任何输入都是可以的。
希望原子哥或者其他高手能解开本菜鸟的疑惑,谢谢了
|
|