历史上的今天
今天是:2024年08月23日(星期五)
2019年08月23日 | 正点原子STM32F4笔记 串口使用
2019-08-23 来源:eefocus

1、初始化
时钟
串口时钟,引脚时钟
RCC->AHB1ENR|=1<<0; //使能PORTA口时钟
RCC->APB2ENR|=1<<4; //使能串口1时钟
引脚复用初始化
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
GPIO_AF_Set(GPIOA,9,7); //PA9,AF7
GPIO_AF_Set(GPIOA,10,7);//PA10,AF7
波特率设置
//波特率设置
USART1->BRR=mantissa; //波特率设置
USART1->CR1&=~(1<<15); //设置OVER8=0
USART1->CR1|=1<<3; //串口发送使能
是否使用中断
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<2; //串口接收使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
串口使能
USART1->CR1|=1<<13; //串口使能
波特率设置 BRR寄存器
(尾数即整数部分)

计算公式

代码:USARTDIV=(float)(pclk21000000)/(bound16);//得到USARTDIV@OVER8=0
如果使用USART1,系统时钟为72MHZ,USART1使用PCLK2时钟,也定义为72MHz.
定义波特率=9600,fPCLK2=72MHz,则: 计算USARTDIV=72MHz/9600/16=468.75
取整数468=0x1D4. 小数0.75*16=12=0x0C. 所以写入寄存器USART_BRR中的值为:
0x1D4|0x0C=0x1D4C
USART_BRR=0x1D4C.
**说明一下:0.75*16=12=0x0C.
这是小数转十六进制的方法,乘16取整,一般省略后面的小数。
**
如果使用USART2,USART2使用PCLK1时钟,PCLK1时钟为36MHz.
定义波特率=9600,fPCLK1=36MHz,则: 计算USARTDIV=36MHz/9600/16=234.375
取整数234=0xEA.小数0.375*16=6=0x06.所以写入寄存器USART_BRR中的值为:USART_BRR=0xEA6.
正点原子计算代码
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到**USARTDIV**@OVER8=0
mantissa=temp; //得到整数部分(float变int,只取整数)
fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
mantissa<<=4; // 整数部分在BRR寄存器的4-15位
mantissa+=fraction;
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 哪位高人能帮帮我啊!急需!!!谢了先……有的话请发到我的邮箱:cocokaola@126.com … 查看全部问答> |
|
在网上查了一下发现在WINCE下的DLL注入和在WINDOWS下注入DLL使用的方法是不一样的,现在有以下几个问题麻烦高手帮忙解答一下,谢谢! 1.WINCE是否支持DLL注入,如果支持能否提供一个例子 2.如果目标程 ...… 查看全部问答> |
|
2410的开发板,我用Activesync连接PC和开发板,能够正常连接,PC端也可以显示移动设备,可以看到开发板上的文件夹。可是使用PB5.0中Tools -> Remote Process Viewer却连接不上,我已经把Configuration中的两个连接选项选成了ActiveSync,可是Test的 ...… 查看全部问答> |
|
在tb中加上下面一组语句,用来产生波形文件。initial begin $shm_open(\"./SPISLAVE.shm\"); $shm_probe (\"AS\");end 如果把上面的语句注释掉,运行的过程似乎是正确的,如下:ncsim: v04.00.(s005): (c) Copyright 1995 - 2 ...… 查看全部问答> |
|
最近迷上了51单片机,大学的时候学过,不过早还给老师了。那时候用的是汇编,现在买了块学习板教程用C的,现在有点迷茫,学单片机用汇编好还是C好?自己认为用汇编的话可能对内部寄存器会比较熟悉,但是用C看起来是比较简单!希望大家给点建议。… 查看全部问答> |
|
使用430F437发现32K晶体起振速度很慢,引起LCD显示开机不正常。 使用430F437发现32K晶体起振速度很慢,引起LCD显示开机不正常。 是什么原因引起的,我怎么改电容都不行啊。… 查看全部问答> |
|
昨天DE1到手,就准备装开发环境,因为QII之前有装是13.1,所以打算装个EDS就可以开工了,到altera下载了个SOCEDS 14.1版本,等下完安装的时候提示这个软件只能装在64位系统上,一下蛋疼了,现在用的xp,装了诸多的软件 ...… 查看全部问答> |




