ps:1,本人是一位大一新生,初入大学才接触单片机,在上学期间自学了一些,写这篇文章为了记录一下自己的经历,也想帮助别人更快入门。有错误希望大佬们指正!
2,本文更偏向于操作教学而非原理,想了解原理的小伙伴可以单独搜索。
(看懂本文需要大家先下载keil5,stm32cubemx。大家也要了解一下他们的用法。还要有一点c语言基础哦。)
(这个教学非常简单基础,大家学会了也不要骄傲哦。)
那下面我们直接开始:
一,cubemx基础配置。
1,首先,我们打开cubemx创建一个新项目。(这里我使用的是stm32f401ccu6)
先搜索我们的单片机型号,然后双击进入。
2,点进project manager栏,输入我们的项目名称,然后因为我们用keil5开发,所以下方改成MDK ARM,后面的版本号我们不用更改。
3,选择code generalor栏,然后更改为只复制必要文件(避免生成文件过大)还有单独生成.c和.h文件。
4,然后点进时钟树,将HCLK改为最大。
5,回到初始页面,点进rcc,开启高速晶振。
6,点进SYS,开启外部晶振。到此我们的基础工作全部做完,已经可以开始编写我们自己的东西了。
二,串口设置。
1,点进connectivity,然后选择串口1,选择异步通信,可以看到我们的PA9和PA10被自动配置了,这里我们默认的波特率是115200,现在不用更改。
然后我们可以点击GENERATE CODE生成代码然后进入。
三,代码部分。
关于keil5的配置就不赘述了,我们直接看代码。(这次操作全部在main.c这个主函数下进行)
1,为了让单片机接收我们发送的消息,我们需要先定义一个uint8_t来接收。
2,我们使用的HAL库对串口的最常用函数有:
(1)HAL_UART_Receive用于串口数据接收。
(2)HAL_UART_Transmit用于串口数据发送。
因此我们不妨直接在while(1)里写如下代码。
编译下载,然后打开串口助手调试,看到单片机正常回复了我们的信息,说明我们的测试成功了。
串口的基本操作其实已经实现了。在往后的代码编写中,我们只需要用接收函数接收,然后用if循环语句来控制接收每个数据后做出的反应,从而可以控制单片机的各种行为。
四,中断和DMA:
因为我们的串口一般是配合其他各种东西在一个单片机上起作用,而串口的轮询模式对cpu的占用太大,因而我们可以选择中断模式和DMA模式来使用串口接收和发送,达到更好的效果。
1,中断模式:我们先在cube中打开串口中断,然后生成代码。
2,我们只需要在我们的函数后面加上_IT即
HAL_UART_Receive_IT
HAL_UART_Transmit_IT
然后去掉括号最后部分的时间
再使用即可。
效果是差不多的(会疯狂给你发送你发给他的东西,虽然没什么影响)
但是如此对cpu占用还是大,我们需要一种更好的方式,那就是DMA。(没了解过的朋友们可以去了解一下,相当于一个信息搬运工)
配置DMA首先我们回到cubemx,点进串口配置界面,打开DMA配置,然后为串口的接收和发送都开启一个DMA通道,其他配置不用我们改。然后生成代码。
回到代码界面
我们在main函数外重新调用一个函数void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)串口中断回调函数(开始中断也可以在这个函数下写)
然后将我们写的代码移转到这个函数下。将
HAL_UART_Receive_IT
HAL_UART_Transmit_IT
改成
HAL_UARTEx_ReceiveToIdle_DMA
HAL_UART_Transmit_DMA
运用这个,我们也可以摆脱中断的限制,让串口接收不同长度的数据。
可以将开头的定义改的稍大一点,如uint8_t receivedate[50],然后我们在主函数中接收一次,剩下的写在回调函数中。(为了在多个串口使用时辨认出是串口一的数据,可以在此前加上一个串口判断即如图)
编译下载,然后看结果
这就说明我们成功了。你学会了吗?
看一个通过串口控制的灯捏(随手搓的,勿喷)
led