OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3265|回复: 1

[战舰F103] 分享:战舰串口3寄存器程序更改过程

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-3-1 17:50:57 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-3-2 10:18 编辑

1)首先,先要在原理图确认串口3对应的IO引脚
将串口1的跳线帽拔掉
通过杜邦线将RXD对应PB10(TX),TXD对应接PB11(RX)
串口3.JPG
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);//停止复位
时钟.JPG
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
CRH.JPG
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]



战舰:串口3的寄存器版本.zip

824.11 KB, 下载次数: 222

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2017-12-11
在线时间
483 小时
发表于 2020-7-15 15:36:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-5 11:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表