资深版主
 
- 积分
- 4306
- 金钱
- 4306
- 注册时间
- 2018-6-30
- 在线时间
- 808 小时
|
本帖最后由 1208 于 2019-3-2 10:18 编辑
1)首先,先要在原理图确认串口3对应的IO引脚
将串口1的跳线帽拔掉
通过杜邦线将RXD对应PB10(TX),TXD对应接PB11(RX)
2)串口1和串口3的GPIOx引脚和串口时钟是不一样的
既然不一样,就要改成对应串口3的GPIOx引脚和串口时钟
这时,就需要看STM32参考资料的STM32F1中文参考手册
在RCC寄存器里面
GPIOB是挂载在APB2 外设时钟使能寄存器(RCC_APB2ENR)
USART3是APB1 外设时钟使能寄存器(RCC_APB1ENR)
使能相应的时钟对应的位
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口时钟
RCC->APB1RSTR|=1<<18; //复位串口3
RCC->APB1RSTR&=~(1<<18);//停止复位
3)接下来是更改GPIOB对应的引脚
端口配置低寄存器(GPIOx_CRL) (x=A..E)对应PB0到PA7(如GPIOB)
端口配置高寄存器(GPIOx_CRH) (x=A..E)对应PB8到PB15
因为用到PB10,PB11选的是GPIOB->CRH
GPIOB->CRH&=0XFFFF00FF;//IO状态设置(&=清零)
GPIOB->CRH|=0X00004B00;//IO状态设置(|=置1)
将选中的对应引脚先清零
PB10(TX)用到复用推挽输出 包含时钟速度50MHz B对应1011
PB11(RX)用到浮空输入(上拉和下拉也可以)4对应0100
看到这个图要先看MODEy[1:0],再看CNFy[1:0]
为什么PB10(TX)是1011
MODEy[1:0]=11是输出模式,最大速度50MHz
CNFy[1:0]=10复用功能推挽输出模式[输出模式(MODE[1:0]>00)]
为什么PB11(RX)是0100
MODEy[1:0]=00是输入模式
在输入模式(MODE[1:0]=00)下选择浮空模式
CNFy[1:0]=01
4)重定向fputc函数
printf的输出,指向fputc,由fputc输出到串口
这里使用串口1(USART1)输出printf信息
int fputc(int ch, FILE *f)
{
while((USART3->SR&0X40)==0);//等待上一次串口数据发送完成
USART3->DR = (u8) ch; //写DR,串口1将发送数据
return ch;
}
5)串口3时钟挂载在APB1总线上
PCLK1时钟频率(Mhz)为36M
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
主函数要改为 uart_init(36,115200); //串口初始化为115200
最后就是将对应的串口1改为串口3就可以
其它修改的别的串口过程,原理也是相似的
6)串口3的主要程序
[mw_shl_code=c,true]void uart_init(u32 pclk1,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<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口时钟
GPIOB->CRH&=0XFFFF00FF;//IO状态设置
GPIOB->CRH|=0X00004B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口1
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级
#endif
}[/mw_shl_code]
|
|