HAL库记录(L4)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

多个串口发送(多个串口+多种方法)

1.添加 printf函数

下面展示一些 内联代码片

// printf函数
int fputc (int ch,FILE* f)
{
 uint8_t temp[1]={ch};
 {
  HAL_UART_Transmit(&huart1,temp,1,2);
 }
 return HAL_OK;
}

2.发送

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
串口1:&huart1
串口2:&huart2
**注意:**不要直接使用DMA发送数据,由于同时使用DMA接收和发送(两个优先级相同)会导致发出的数据不完整

3.中断回调函数判断(== 华清远见博客中写了详细方法==):

在这里插入图片描述

PWM

在这里插入图片描述

在这里插入图片描述

舵机控制

50HZ的频率:
预分频 79
计数值 2000

角度计算: 高电平时长计数个数为1000,即时长为1ms >>45°
在这里插入图片描述
在这里插入图片描述

NVIC

配置解析:
在这里插入图片描述

L4硬件知识

TIM

在这里插入图片描述

通过STM32微控制器的串口通信功能控制舵机,通常涉及使用串口接收来自外部设备(如遥控器、上位机等)的指令,并根据这些指令控制舵机的角度或动作。以下是实现这一功能的详细步骤和相关技术要点。 ### 1. 硬件连接与配置 在硬件层面,需要将舵机的信号线连接到STM32的PWM输出引脚,通常使用定时器通道(如TIMx_CHy)来生成PWM信号。同时,串口(如USART)用于接收外部指令,需将其配置为接收中断模式,以便实时处理数据。 - **串口配置**:设置波特率、数据位、停止位和校验方式,确保与外部设备的通信参数一致。 - **PWM配置**:根据舵机的控制要求(如周期20ms,脉宽0.5ms~2.5ms对应0°~180°),配置定时器的自动重载值和比较值[^1]。 ### 2. 串口通信协议设计 为了准确解析外部指令,需设计或选择合适的通信协议。例如,可以定义如下格式: - **指令格式**:`$ANGLE:90*`,其中`ANGLE`表示角度控制指令,`90`为目标角度,`*`为结束标志。 - **校验机制**:可添加校验和或CRC校验,确保数据完整性。 在STM32中,可以使用串口接收中断函数`HAL_UART_Receive_IT`来接收数据,并在中断回调函数`HAL_UART_RxCpltCallback`中处理接收到的数据包[^2]。 ### 3. 控制逻辑实现 当接收到有效指令后,将其转换为对应的PWM占空比,并通过定时器通道输出。例如,若目标角度为90°,则对应的PWM脉宽为1.5ms,占空比为7.5%(假设系统时钟为80MHz,定时器预分频为80,周期为20000计数单位,则比较值为1500)。 ```c void Set_Servo_angle(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t angle) { uint16_t pulse = 500 + (angle * 1000) / 180; // 计算对应角度的脉宽 __HAL_TIM_SET_COMPARE(htim, channel, pulse); } ``` ### 4. 示例代码 以下是一个简化的示例代码,展示如何通过串口接收角度指令并控制舵机: ```c #include "main.h" #include "stdio.h" #include "string.h" TIM_HandleTypeDef htim4; UART_HandleTypeDef huart2; #define RX_BUFFER_SIZE 128 uint8_t rx_buffer[RX_BUFFER_SIZE]; uint8_t rx_byte; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM4_Init(void); static void MX_USART2_UART_Init(void); void Set_Servo_angle(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t angle) { uint16_t pulse = 500 + (angle * 1000) / 180; __HAL_TIM_SET_COMPARE(htim, channel, pulse); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM4_Init(); MX_USART2_UART_Init(); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); HAL_UART_Receive_IT(&huart2, &rx_byte, 1); // 启动串口接收中断 while (1) { // 主循环可执行其他任务 } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { static uint8_t rx_data[RX_BUFFER_SIZE]; static uint8_t rx_index = 0; if (huart == &huart2) { if (rx_byte == '*') { // 指令结束标志 rx_data[rx_index] = '\0'; // 字符串结束 char *angle_str = strstr((char *)rx_data, "ANGLE:"); if (angle_str != NULL) { angle_str += 6; // 跳过"ANGLE:"部分 int angle = atoi(angle_str); if (angle >= 0 && angle <= 180) { Set_Servo_angle(&htim4, TIM_CHANNEL_3, angle); } } rx_index = 0; // 重置索引 } else { rx_data[rx_index++] = rx_byte; if (rx_index >= RX_BUFFER_SIZE) { rx_index = 0; // 防止溢出 } } HAL_UART_Receive_IT(&huart2, &rx_byte, 1); // 重新启动接收 } } ``` ### 5. 调试与优化 - **波特率匹配**:确保STM32与外部设备的波特率一致,避免通信错误。 - **数据缓冲**:使用环形缓冲区或队列管理接收数据,防止数据丢失。 - **异常处理**:添加超时机制和错误检测,确保系统稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值