1、开发环境
(1)Keil MDK: V5.38.0.0
(2)STM32CubeMX: V6.8.1
(3)MCU: STM32F407ZGT6
2、UART和USART的区别
2.1、UART
(1)通用异步收发收发器:Universal Asynchronous Receiver/Transmitter)。
2.2、USART
(1)通用同步异步收发器:Universal Synchronous/Asynchronous Receiver/Transmitter
(2)同步:Synchronous。
(3)目前只用到异步收发的场景,同步收发场景没有用过。同步应该类似IIC总线,需要一个时钟。
3、中文芯片参考手册去哪找的。
(1)进入STMCU中文官网:STMCU中文官网
(2)点击设计资源→芯片文档。找到相应芯片的英文参考手册,点击蓝色字体就能直接下载英文的参口手册了。
(3)网页搜索框搜索RM0090。
(4)搜索后便有可能找到中文参考手册。
(5)也可直接搜索该芯片,筛选选择中文译文。
4、示例程序的目的
(1)通过串口实现阻塞发送和中断接收;将中断接收到的内容通过阻塞形式发送出去。。
(2)阻塞模式串口发送。MCU的CPU一个字节一个字节的将要发送的内容丢给串口模块,然后看着串口模块将这个字节发送出去,然后CPU再去拿下一个字节来丢给串口模块。直到本次要发送的所有字节全部发完,CPU才会去做其他事。
(3)中断模式串口发送。MCU的CPU向串口模块丢一个字节,然后串口模块慢慢发,CPU丢完这个字节后会跳出去做其他事情,等串口模块发完这个字节后会生成一个中断,中断会通知CPU过来继续丢下一个字节。这主要是因为CPU主频远远大于串口的发送速度,CPU一直在这看着挺浪费的。这种方式更加充分利用了CPU。
(4)在程序开发过程中,会通过串口打印很多调试信息。可以通过宏定义的方式,在调试时允许打印,在正式版中屏蔽打印。
5、原理图
(1)CH340芯片部分。
(2)使用的串口是USART1。STM32大多数串口1都是接PA9、PA10引脚。
6、STM32CubeMX创建工程及时钟配置
6.1、创建工程
(1)打开STM32CubeMX软件。
(2)点击File→NewProject。
(3) Commercial Part Number(商用部件号)处输入MCU型号,然后选择正确的单片机型号,点击Start Project(开始项目)。
(4)配置工程名、工程存放文件等。
点击Project Manager(项目经理)进行如下配置。
点击Code Generator(代码生成器)进行如下配置。
(5)点击GENERATE CODE生成KeilMDK工程。
6.2、配置时钟
(1)HSE、LSE时钟源选择
- HSE:高速外部时钟源
- LSE:低速外部时钟源
- Disable:禁用
- BYPASS Clock Source:旁路时钟源
- Crystal/Ceramic Resonator :水晶/陶瓷共振器
- 一般选择水晶陶瓷共振器
- 旁路时钟源就是由外部给定一个时钟信号,一般用于作为同步时钟。
- 水晶/陶瓷共振器:指外接晶振,经过内部振荡电路产生时钟。
(2)时钟树配置
(3)点击GENERATE CODE更新KeilMDK工程。
7、STM32CubeMX配置串口
(1)USART1模式配置,选择异步
- Asynchronous: 异步
- Synchronous: 同步
- Single Wire(Half-Duplex): 单线(半双工)
- Multiprocessor Communication: 多处理器通信
(2)串口1参数设置
- Parameter Settings: 参数设置
- Basic Parameters: 基本参数
- Baud Rate: 波特率
- Word Length: 字长
- including Parity:包括奇偶校验
- Parity: 奇偶校验
- Stop Bits: 停止位
(3)使能串口中断
8、Keil MDK软件编写
8.1、串口中断接收
/*
*功能:接收完成回调函数
*参数:串口x
*返回值:无
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Transmit(&huart1, &UART_Data.DebugRxBuf[0], 1,0xFF); /*将接收到的内容发送出去*/
HAL_UART_Receive_IT(&huart1, UART_Data.DebugRxBuf,1);
}
}
8.2、printf的重定向
(1)需要勾选Keil微库。
/*
*功能:将C库printf函数重定向到USART1
*参数:无
*返回值:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
8.3、完整工程下载地址。
(1)完整工程存储在码云。