LFD STM32编程规范20241111

  • 1. 源文件和头文件放同一目录bsp文件夹
  • 顺序
  • 文件注释
  • 防重复设置
  • #include
  • #define
  • enum
  • 类型声明、定义 包括struct union typedef
  • 全局变量声明
  • 文件级变量声明
  • 全局或文件级函数声明
  • 函数实现。按函数声明顺序
  • 文件尾注释。/**************END FILE**************/
  • 引用头文件不用绝对路径
  • 头文件只存放声明,不存放定义,避免重复。
  • 缩进4
  • 变量与语句空一行
  • 不同功能空一行
  • 长表达式换行书写

if((ucParam1 ==0) && (ucParam2 ==0) 

||(ucParam==0)) 

{

}

  • = 、+= 、+ 、%、 &&、& 、<<、^加空格

!、~、++、--、-> . 不加空格

函数名命规则

前缀模块明、模块名小写,与函数名区分。

uartReceive();

函数形参已下划线开头,与普通变量区分。

uint32_t uartConvUartBaud(uint32_t _ulBaud)

一个函数实现一个功能。

函数名准确描述,避免无意义,含义混淆的命名。

检查函数输入有效性 assert()验证。

防止函数参数作为工作变量。

避免五个参数函数。不用的去掉。

不使用技巧语句

变量命名

uint8_t ==>uc   ucSum

uint16_t ==> us  usParaWord

uint32_t ==>ul ulParaWord

int8_t ==>c   cSum

int16_t ==> s  sParaWord

int32_t ==>l lParaWord

int8_t * ==>cp   cpWrite

int16_t * ==>sp spWrite

int32_t * ==>lp slWrite

int8_t 数组 ca  caNum[3]

int16_t 数组 sa saNum[3]

int32_t 数组 la laNum[3]

结构体 t tParam

uint8_t * ==>ucp   ucpWrite

uint16_t * ==>usp uspWrite

uint32_t * ==>ulp uslWrite

uint8_t 数组 uca  ucaNum[3]

uint16_t 数组 usa usaNum[3]

uint32_t 数组 ula ulaNum[3]

变量名作用域。

在变量类型前缀加变量作用域

  • 全局变量 +g

uint32_t g_ulParaWord

uint8_t g_ucByte

  • 静态变量+s

static uint32_t s_ulPara

函数内部局部变量不加作用域前缀

结构体命名 tag开头,之后首字母大写。结尾以_T标识。单词间不用下划线分开

typedef struct tagBillQuery_T

{

}BillQuery_T;

结构体变量定义

BillQuery_T tBillQuery

枚举定义全部采用大写,结尾_E标识,

typedef enum

{

        F1=0,

        F2,

        F3

}KEY_CODE_E

宏定义多个单词用_分开,并注释。

#define LOG_BUF_SIZE 8000

### 实现 ROS 键盘控制 STM32 驱动小车的功能 为了实现通过键盘控制 STM32 驱动的小车,可以通过 `teleop_twist_keyboard` 功能包发送速度指令给 ROS 节点,再由该节点将数据转换为适合 STM32 的协议并通过串口通信传递给 STM32 控制器。 #### 安装 teleop_twist_keyboard 如果尚未安装 `teleop_twist_keyboard`,可以运行以下命令完成安装: ```bash sudo apt-get install ros-noetic-teleop-twist-keyboard ``` 启动此工具后,它会发布 `/cmd_vel` 主题的消息,其中包含线速度和角速度的信息[^1]。 #### 创建自定义 ROS 节点 创建一个新的 ROS 节点来订阅 `/cmd_vel` 并将其转化为 PWM 和方向信号,随后通过串口发送至 STM32。以下是 Python 版本的示例代码: ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist import serial class CmdVelToSerialNode: def __init__(self, port='/dev/ttyUSB0', baudrate=9600): self.ser = serial.Serial(port, baudrate) rospy.init_node('cmd_vel_to_serial') rospy.Subscriber('/cmd_vel', Twist, self.cmd_vel_callback) def cmd_vel_callback(self, msg): linear_x = msg.linear.x angular_z = msg.angular.z # 将线速度和角速度映射到 PWM 值 (假设范围 [-255, 255]) pwm_left = int((linear_x - angular_z) * 255 / 2) pwm_right = int((linear_x + angular_z) * 255 / 2) # 设置电机方向标志位 dir_left = 'F' if pwm_left >= 0 else 'B' dir_right = 'F' if pwm_right >= 0 else 'B' # 发送数据格式:L<dir><pwm>R<dir><pwm> data = f"L{dir_left}{abs(pwm_left)}R{dir_right}{abs(pwm_right)}" self.send_data(data) def send_data(self, data): try: self.ser.write(data.encode()) except Exception as e: rospy.logerr(f"Failed to write to serial: {e}") if __name__ == '__main__': node = CmdVelToSerialNode() rospy.spin() ``` 上述代码实现了从 `/cmd_vel` 订阅消息并解析成左轮和右轮的速度值,之后按照特定格式(如 `LFD87RBD123` 表示左侧前进、右侧倒退)发送给 STM32。 #### STM32 端处理逻辑 STM32 接收来自串口的数据后,在定时中断中解析这些数据,并更新电机的方向和占空比。具体流程如下: 1. 初始化 UART 模块用于接收数据。 2. 使用 DMA 或者循环读取方式获取完整的帧数据。 3. 解析帧内容提取左右轮的速度信息。 4. 更新 TIMx 的 CCR 寄存器以调整 PWM 占空比以及 INx 引脚状态改变电机转动方向。 由于引用提到仅需在定时器中操作这部分细节未提供完整源码,则需要开发者自行补充相关部分。 ### 注意事项 确保 ROS PC 和 STM32 设备之间的波特率一致;另外还需校准实际硬件响应与理论计算之间可能存在偏差的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值