用cubemx完成初始化过程,采用HAL库编程实现,在Keil下用软件仿真运行上面代码,并用虚拟逻辑分析仪观察 对应管脚上的输出波形(高低电平转换)

本实验通过STM32CubeMX完成初始化过程,并采用HAL库编程实现GPIO接口的控制。实验介绍了HAL库的安装、项目的创建过程以及如何在Keil环境下进行软件仿真。最终通过观察虚拟逻辑分析仪上的输出波形验证了程序的正确性。

重庆交通大学信息科学与工程学院

《嵌入式系统基础A》课程

作业报告(第四周)

班 级: 物联网工程2002

姓名-学号 : 吴泽霖-632007060217

实验项目名称: 用cubemx完成初始化过程,采用HAL库编程实现。

实验项目性质: 设计性

实验所属课程: 《嵌入式系统基础》

实验室(中心): 南岸校区语音大楼

指 导 教 师 : 娄路

完成时间: 2022 10 13


一、实验内容和任务

用cubemx完成初始化过程,采用HAL库编程实现。

二、实验要求

1. 分组要求:每个学生独立完成,即1人1组。

2. 程序及报告文档要求:具有较好的可读性,如叙述准确、标注明确、截图清晰等。

3.项目代码上传github,同时把项目完整打包为zip文件,与实验报告(Markdown源码及PDF文件)、作业博客地址一起提交到学习通。

三. 实验过程介绍 (此处可以填博客内容)

一、安装HAL库

(1)打开安装好的STMCubeMX,点击HELP->Manage embedded software packages :
然后安装hal库
请添加图片描述

二.新建项目

回到STMCubeMX的主界面,创建新项目:
请添加图片描述在part name里选择自己的芯片,点击信息栏中的具体芯片信息选中,点击start project:

在这里插入图片描述点击system core,进入SYS,在debug下选择serial wire:

请添加图片描述配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里:
请添加图片描述接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上:请添加图片描述将hse那里设为Crystal/Ceramic Resonator请添加图片描述接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA4,PB9,PC15:请添加图片描述点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM:请添加图片描述进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了:

请添加图片描述

三、打开.uvprojx文件

将原主函数处覆盖图中代码
在这里插入图片描述电路连接

根据设计的程序连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

总电路:
红——B9
绿——C15
黄——A4

烧录运行

请添加图片描述

四、观察GPIO端口的输出波形

Target界面中,选择跟正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。Debug页的设置:

请添加图片描述选择逻辑分析仪:请添加图片描述

请添加图片描述

观察波形请添加图片描述
引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期(LED闪烁周期)为1s左右。

三、总结

本次实验后能熟练安装 stm32CubeMX,用cubemx完成初始化过程,采用HAL库编程实现,并在Keil下用软件仿真运行上面代码,并用虚拟逻辑分析仪观察 对应管脚上的输出波形。

<think>好的,我现在需要帮助用户解决如何使用Keil5和HAL通过上位机控制STM32点亮LED的问题。首先,我得理解用户的具体需求。他们想通过上位机发送指令,然后STM32接收到这些指令后控制LED的点亮。这涉及到串通信、HAL的使用以及Keil5的配置。 首先,我得回忆一下之前的引用内容。引用1到4主要讲解了使用STM32CubeMX配置HAL,点亮LED的基本步骤,包括GPIO的配置、时钟设置以及简单的延时闪烁代码。但用户现在需要的是上位机控制,所以需要添加串通信的部分。 接下来,我需要确定步骤。首先,用户需要配置GPIO,这点在之前的引用中已经有说明,比如引用3中的PC13引脚配置。然后,配置USART串,这在之前的引用中没有详细提到,所以需要补充这部分。用户需要使用STM32CubeMX来启用USART,设置波特率、数据位等参数,并开启中断。 接下来是生成代码部分,用户需要将控制逻辑放在USER CODE BEGIN和END之间,如引用2和3提到的。然后,在Keil5中添加代码,处理串接收的数据。这里可能需要使用HAL_UART_Receive_IT函数来启动中断接收,并在回调函数中解析接收到的指令,控制LED。 然后是关于上位机的部分,用户可能需要一个简单的上位机软件,比如串助手,发送特定的指令,比如“LED1_ON”、“LED1_OFF”等。STM32在接收到这些指令后,通过解析字符串来执行相应的GPIO操作。 还需要注意中断处理,确保接收的数据不溢出,并且正确解析。可能需要使用环形缓冲区或者简单的字符处理来累积接收到的数据,直到检测到结束符(如换行符)再进行解析。 另外,用户可能需要了解如何配置NVIC(嵌套向量中断控制器)来使能串中断,这在STM32CubeMX中应该可以配置。同时,时钟的配置是否正确,比如USART的时钟源和GPIO的时钟是否使能,这些都会影响通信是否正常。 最后,编译和下载程序到STM32,使用Keil5的仿真功能或者实际硬件测试,用逻辑分析仪或者示波器检查GPIO输出是否符合预期,同时通过串助手发送指令测试LED的控制是否成功。 可能遇到的问题包括:串通信不成功,可能是波特率设置错误,或者GPIO引脚配置不正确;指令解析错误,比如缓冲区溢出或者字符串比较错误;LED无法点亮,可能是电路连接问题或者GPIO状态设置错误(比如某些LED是低电平点亮,需要确认)。 需要提醒用户注意这些常见问题,并提供调试建议,比如使用HALHAL_UART_Transmit函数回传数据,确认指令是否正确接收,或者通过调试器单步执行代码检查程序逻辑。</think>### 使用Keil5和HAL通过上位机控制STM32点亮LED的步骤 #### 1. **硬件与软件准备** - **硬件**:STM32开发板(如STM32F103C8T6)、USB转串模块(如CH340)、LED模块。 - **软件**:STM32CubeMXKeil5、串调试助手(如XCOM或Putty)。 --- #### 2. **STM32CubeMX工程配置** 1. **配置GPIO** - 在STM32CubeMX中,选择控制LED的GPIO引脚(例如PA5、PB9、PC14),设置为`GPIO_Output`模式[^3]。 2. **配置USART** - 启用USART1(或其他可用串),选择异步模式(Asynchronous)。 - 设置波特率(如115200)、数据位(8位)、停止位(1位)、无校验[^4]。 - 开启串全局中断(NVIC Settings中使能USART中断)[^1]。 3. **时钟配置** - 根据开发板晶振频率(如8MHz)配置系统时钟树,确保USART时钟源正确(通常为PCLK)[^3]。 4. **生成代码** - 在Project Manager中选择MDK-ARM(Keil5)工具链,生成代码。 --- #### 3. **Keil5代码编写** 1. **添加串接收中断代码** 在`main.c`的`/* USER CODE BEGIN 0 */`区域添加以下代码: ```c // 定义接收缓冲区 #define RX_BUFFER_SIZE 64 uint8_t rx_buffer[RX_BUFFER_SIZE]; volatile uint8_t rx_flag = 0; // 串接收完成回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { rx_flag = 1; // 设置接收完成标志 HAL_UART_Receive_IT(&huart1, rx_buffer, 1); // 重新启动中断接收 } } ``` 2. **初始化接收** 在`main()`函数的初始化部分添加: ```c HAL_UART_Receive_IT(&huart1, rx_buffer, 1); // 启动首次接收 ``` 3. **解析上位机指令** 在`while(1)`循环中添加指令解析逻辑: ```c if (rx_flag == 1) { rx_flag = 0; if (strncmp((char*)rx_buffer, "LED1_ON", 7) == 0) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 点亮LED1 } else if (strncmp((char*)rx_buffer, "LED1_OFF", 8) == 0) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 熄灭LED1 } memset(rx_buffer, 0, RX_BUFFER_SIZE); // 清空缓冲区 } ``` --- #### 4. **上位机通信** - **发送指令**:通过串调试助手发送字符串指令(如`LED1_ON`、`LED1_OFF`)。 - **波特率匹配**:确保上位机与STM32的波特率设置一致(如115200)[^4]。 --- #### 5. **调试与验证** 1. **Keil仿真** - 使用Keil软件仿真功能(Debug模式),观察GPIO引脚电平变化[^1]。 2. **逻辑分析仪** - 在Keil中通过虚拟逻辑分析仪(Logic Analyzer)监控LED引脚波形,确认周期是否符合预期[^1]。 --- #### 6. **示例代码** ```c // 在main.c中添加以下代码段 /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { if (rx_buffer[0] == '1') { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED1状态 } HAL_UART_Receive_IT(&huart1, rx_buffer, 1); // 重启接收 } } /* USER CODE END 4 */ ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值