1.资源的获取:
关注
博主并点赞
对应博客,并在文章下留言
邮箱索取;
2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章;
博主分享不易,请给三连
哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。
STM32CubeMX 实战教程:串口通信实验(LL 库)
1 前言
1.1 STM32CubeMX
1.2 教程介绍
STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX 。
本教程是 STM32CubeMX 实战教程中的第三篇,主要通过串口通信实验,将 STM32CubeMX USART 的配置方法讲述清楚。
1.3 准备工作
系统版本:Windows 10 专业版 64 位
软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程 )
硬件平台:正点原子 STM32F1 精英板
编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程 )
调试工具:ST-LINK/V2
串口助手:ATK-XCOM V2.6
1.4 硬件资源
本节教程使用的硬件资源分配:
序号 | 引脚 | 引脚功能 | 硬件连接 | 备注 |
---|---|---|---|---|
01 | PA9 | USART1_TX | CH340G(USART1 跳线帽需短接) | USB 线接 USB_232 端口 |
02 | PA10 | USART1_RX | CH340G(USART1 跳线帽需短接) | USB 线接 USB_232 端口 |
2 配置项目
2.1 项目导入
将上一节的 SysTick_Test 的项目另存作为 USART_Test 的项目初始模板。
工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
2.2 USART & NVIC 配置
- 将 PA9 和 PA10 配置成 USART1_TX 和 USART1_RX;(由于没有配置 USART1,引脚会显示黄色警告)
- 点击 USART1,设置模式为 Asynchronous,无硬件流控制,参数为:115200,8 Bits,None,1;(配置完 USART1 后,相关引脚会显示绿色,提示引脚配置正常)
其他模式可参考:附录2 USART1 配置窗口介绍 。 - 点击 NVIC,使能 USART1 中断,优先级设置为 2,0;
- 勾选 Generate IRQ handler 生成中断服务函数,不勾选 Call HAL handler;(由于默认不开启中断源,勾选了也没有作用)
2.3 Clock 配置
Clock 不需要配置,可直接继续使用。可参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程、STM32CubeMX 实战教程:SysTick 实验。
2.4 生成代码
项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程、STM32CubeMX 项目配置窗口介绍(一)、STM32CubeMX 项目配置窗口介绍(二)。
点击 GENERATE CODE 生成代码。
3 代码测试
- 打开 MDK_ARM 工程;
- main.c 文件
main
函数中,有MX_USART1_UART_Init()
的回调函数,查看其函数源码;
值得注意的是:生成代码中开启中断,但默认不使能中断源。所以我们需要在初始化代码后配置使能一下 USART1 的中断源。 - 配置 USART1 Interrupt Source,在
MX_USART1_UART_Init()
函数后的用户代码区域加入配置代码;(使能 RXNE 和 IDLE 中断)
- 在 usart.c 文件用户代码区域加入中断回调函数及中断处理代码;(请自行在 usart.h 文件中声明相关变量和函数)
USART1_IRQ 回调函数代码如下:(代码解析请参考:STM32 串口接收不定长字节数据 )
/* USER CODE BEGIN 0 */
uint8_t USART1_RX_BUF[256];
uint8_t USART1_RX_CNT = 1;
uint8_t USART1_TX_STA = 0;
void USART1_IRQ(void)
{
uint8_t res;
uint8_t clear = clear;
if(LL_USART_IsActiveFlag_RXNE(USART1) != 0)
{
res = USART1->DR;
USART1_RX_BUF[USART1_RX_CNT++] = res;
}
else if(LL_USART_IsActiveFlag_IDLE(USART1) != 0)
{
clear = USART1->SR;
clear = USART1->DR;
USART1_RX_BUF[0] = USART1_RX_CNT - 1;
USART1_RX_CNT = 1;
USART1_TX_STA = 1;
}
}
/* USER CODE END 0 */
- 在 stm32f1xx_it.c 文件
USART1_IRQHandler()
函数的用户代码区域调用中断处理函数USART1_IRQ()
;
- 在
while
循环中加入测试代码;
main 函数代码如下:
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* System interrupt init*/
/** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
*/
LL_GPIO_AF_Remap_SWJ_NONJTRST();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz)
SysTick_CTRL_TICKINT_Msk; // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
LL_RCC_GetSystemClocksFreq(&get_rcc_clock);
LL_USART_EnableIT_RXNE(USART1); // ENABLE USART1 RXNE Interrupt
LL_USART_EnableIT_IDLE(USART1); // ENABLE USART1 IDLE Interrupt
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(USART1_TX_STA == 1)
{
uint8_t i;
for(i=1;i<USART1_RX_BUF[0] + 1;i++)
{
while(LL_USART_IsActiveFlag_TC(USART1) == RESET);
LL_USART_TransmitData8(USART1,USART1_RX_BUF[i]);
}
while(LL_USART_IsActiveFlag_TC(USART1) == RESET);
USART1_TX_STA = 0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
- 编译工程;
- 使用 ST-LINK/V2 下载程序,按下复位按键,若按照下面操作看到正常现象,则说明程序正常运行,USART1 配置成功。
Steps | 操作 | 正常现象 | 备注 |
---|---|---|---|
1 | 使用 X-COM 串口助手默认配置发送任意字符串(中英文皆可) | 串口助手会接收到相同的字符串 | - |
可参看下图:
4 结束
本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。
此教程由本人独立整理,如有不当之处,欢迎指正。
附录
附录1 相关教程
STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总 。
该文章还提供:
- STM32Cube 生态系统相关文章
- STM32Cube 生态系统相关软件更新介绍
- STM32Cube 生态系统相关教程汇总
- STM32Cube 生态系统相关网站汇总
- 该文章会不定期修改更新,更多信息请进入文章查看
附录2 USART1 配置窗口介绍
Mode | 描述 | 硬件引脚 | 支持外设 | 备注 |
---|---|---|---|---|
Asynchronous | 异步模式 | TXD、RXD | USART、UART | 我们常用的串口 |
Synchronous | 同步模式 | TXD、RXD、CK | USART | - |
Single Wire (Half-Duplex) | 半双工单线模式 | TXD | USART、UART | - |
Multiprocessor Communication | 多处理器通讯模式 | TXD、RXD | USART、UART | - |
IrDA | 红外解码通信 | TXD、RXD | USART、UART | - |
LIN | 总线通信 | TXD、RXD | USART、UART | - |
SmartCard | 智能卡模式 | TXD | USART | - |
SmartCard with Card Clock | 带时钟智能卡模式 | TXD、CK | USART | - |
硬件流控制(RS232) | 描述 | 硬件引脚 | 支持外设 | 备注 |
---|---|---|---|---|
CTS Only | Clear To Send,发送清除 | CTS | USART | - |
RTS Only | Require To Send,发送请求 | RTS | USART | - |
CTS/RTS | 发送清除/发送请求 | CTS、RTS | USART | - |
以下为Mode的相应模式配置界面:
- Mode
-
Asynchronous - 异步模式
该模式下,仅需 TXD 和 RXD 两个引脚即可通信,即我们常用的串口。 -
Synchronous - 同步模式
-
Single Wire (Half-Duplex) - 半双工单线模式
-
Multiprocessor Communication - 多处理器通讯模式
-
IrDA - 红外解码通信
-
LIN - 总线通信
-
SmartCard - 智能卡模式
-
SmartCard with Card Clock - 带时钟智能卡模式
-