0基础初学stm32,手上是ministm32开发板,根据原子哥给出的例子,手敲了一遍,同时将自己的一些问题记录在这里,希望能帮到大家。
1.理论基础
- 串口:串口是一个重要的外部接口,在stm32上面也有丰富的串口资源,不过以我现在的水平还啥都不了解,所以这次主要说的就是通过USB串口和电脑通信
- 串口配置:详细配置可以参考STM32开发指南寄存器版本的5.3.2章节,每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过配置它就可以配置串口的波特率
- 串口时钟使能:串口的时钟由外设时钟使能寄存器控制,我们这次使用的串口1挂载在APB2ENR上寄存器上。
-数据的发送与接收:STM32的发送与接受是通过数据寄存器USART-DR实现,存入和取出他都可以,由两个寄存器TDR(发送用),RDR(接收用)组成,兼具读写功能。
-串口状态:串口状态通过状态寄存器USART-SR读取
2.硬件部分
-
板子是新买的,上面的跳线帽为啥那么安并不是很清楚,一开始照着原点哥的教程,将RXD和PA9,TXD和PA10用跳线帽连接在了一起,但是数据传不上去,于是动手把PA0,PA1上面的跳线帽摘掉,终于成功用FLYMCU把程序烧了上去,打开串口调试助手后上面没有任何反馈,经过一系列操作,最后的解决办法是:
1:配置里面勾上红圈处2.将B1与GND,B0与GND都用跳线帽连接起来
3.将串口调试工具中的波特率调成跟代码初始化的波特率相同,并且点击打开串口按钮
3.主要代码
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
u8 t;
u8 len;
u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时函数初始化
uart_init(72,9600); //串口波特率初始化
LED_Init(); //初始化LED
while(1)
{
if(USART_RX_STA&0x8000)//判断输入是否完成
{
len=USART_RX_STA&0x3fff;//计算出数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];//把输入的数据输入到到寄存器里面
while((USART1->SR&0X40)==0);//手动流出时间等待传输完成
}
printf("\r\n\r\n");//换行
USART_RX_STA=0;//这次传输结束了,下一次已经准备好啦~
}else //数据还没有输入完毕
{
times++;
if(times%500==0)
{
printf("\r\n......loading......\r\n");
printf("\r\n出现了!出现了!\r\n\r\n");
}
if(times%200==0)printf("请输入你想要的数据\r\n");
if(times%30==0)LED0=!LED0;//闪灯,证明你的程序还在进行中
delay_ms(10);
}
}
}
重点代码理解
if(USART_RX_STA&0x8000):为什么这段代码可以判断数据有没有传输完毕呢,其实USART_RX_STA是一个定义好的十六位数:0000 0000 0000 0000 ,他的第十六位为0表示没接收完,等于1就是接收完毕,而0x8000转为2进制就是1000 0000 0000 0000,两者相与,只有两种结果,一个是0,一个是非0,所以就作为判断条件来使用了
len=USART_RX_STA&0x3fff 这段代码是计算出输入数据的长度的,USART-RX-STA里面已经储存了接收来的字节数,在与上可以接收的最大字节数,就得到了数据的长度。
if(USART1->SR&0X40)==0) 翻看手册我们可以知道USART1-SR的第6位掌管着判断发送是否完成,0x40=1000 000,与上它的意思就是看最后一位有没有变成1(有没有完成传输)
USART_RX_STA=0; 清0,复原,重启
以上为本人粗略的理解,如有错误还请指出!