diff --git a/.vscode/settings.json b/.vscode/settings.json index 97a085b..b95b67e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -45,6 +45,9 @@ "stdint-gcc.h": "c", "string.h": "c", "motor_def.h": "c", - "stdio.h": "c" + "stdio.h": "c", + "segger_rtt_conf.h": "c", + "segger_rtt.h": "c", + "bsp_log.h": "c" } } \ No newline at end of file diff --git a/VSCode+Ozone使用方法.md b/VSCode+Ozone使用方法.md new file mode 100644 index 0000000..92ee851 --- /dev/null +++ b/VSCode+Ozone使用方法.md @@ -0,0 +1,2 @@ +# VSCode+Ozone使用方法 + diff --git a/bsp/bsp_can.md b/bsp/bsp_can.md index 6e83cb1..2f939d6 100644 --- a/bsp/bsp_can.md +++ b/bsp/bsp_can.md @@ -7,11 +7,19 @@ > 1. 增加数据帧的长度定义,使得收发更加灵活,而不是固定的8 bytes > 2. 增加自动检测ID冲突的log输出。 +## 使用说明 + +若你希望新增一个基于CAN的module,首先在该模块下应该有一个包含`can_instance`指针的module结构体(或当功能简单的时候,可以是单独存在的`can_instance`,但不推荐这样做)。 + + + + + ## 代码结构 .h文件内包括了外部接口和类型定义,以及模块对应的宏。c文件内为私有函数和外部接口的定义。 -### 类型定义 +## 类型定义 ```c @@ -55,7 +63,7 @@ typedef void (*can_callback)(can_instance*); - 每个使用CAN外设的module,都需要在其内部定义一个`can_instance`。 -### 外部接口 +## 外部接口 ```c void CANRegister(can_instance* instance, can_instance_config config); @@ -73,7 +81,7 @@ can_instance_config config={.can_handle=&hcan1, `CANTransmit()`是通过模块通过其拥有的CAN实例发送数据的接口,调用时传入对应的instance。在发送之前,应当给instance内的`send_buff`赋值。 -### 私有函数和变量 +## 私有函数和变量 在.c文件内设为static的函数和变量 diff --git a/bsp/bsp_log.c b/bsp/bsp_log.c index de902f2..6ecf863 100644 --- a/bsp/bsp_log.c +++ b/bsp/bsp_log.c @@ -6,7 +6,10 @@ #define BUFFER_INDEX 0 -void BSP_Log_Init() { SEGGER_RTT_Init(); } +void BSP_Log_Init() +{ + SEGGER_RTT_Init(); +} int printf_log(const char *fmt, ...) { diff --git a/bsp/bsp_log.md b/bsp/bsp_log.md index cba4329..7daab16 100644 --- a/bsp/bsp_log.md +++ b/bsp/bsp_log.md @@ -2,4 +2,34 @@
neozng1@hnu.edu.cn
+> TODO: +> +> 1. 在未接入调试器的时候,将日志写入flash中,并提供接口读取 +> 2. 增加日志分级,提供info、warning、error三个等级的日志 + ## 使用说明 + +bsp_log是基于segger RTT实现的日志打印模块。 + +```c +int printf_log(const char *fmt, ...); +void Float2Str(char *str, float va); +``` + +调用第一个函数,可以通过jlink或dap-link向调试器连接的上位机发送信息,格式和printf相同,示例如下: + +```c +printf_log("Hello World!\n"); +printf_log("Motor %d met some problem, error code %d!\n",3,1); +``` + +第二个函数可以将浮点类型转换成字符串以方便发送: + +```c +float current_feedback=114.514; +char* str_buff[64]; +Float2Str(str_buff,current_feedback); +printf_log("Motor %d met some problem, error code %d!\n",3,1); +``` + +或直接通过`%f`格式符直接使用`printf_log()`发送日志,可以设置小数点位数以降低带宽开销。 diff --git a/bsp/bsp_usart.md b/bsp/bsp_usart.md index da7f98a..5f90ad4 100644 --- a/bsp/bsp_usart.md +++ b/bsp/bsp_usart.md @@ -4,11 +4,21 @@ > TODO:为初始化定义一个结构体`usart_init_config`用于保存初始化所需的参数从而避免单独赋值,使得整体风格统一。 +## 使用说明 + +若你需要构建新的基于串口的module,首先需要拥有一个`usart_instance`的指针用于操作串口对象。 + +需要在串口实例下设定接收的数据包的长度,实例对应的串口硬件(通过`UART_HandleTypeDef`指定,如`&huart1`),解析接收数据对应的回调函数这三个参数。然后,调用`USARTRegister()`并传入配置好的`usart_instance`指针即可。 + +若要发送数据,调用`USARTSend()`。注意buffsize务必小于buff的大小,否则造成指针越界后果未知。 + +串口硬件收到数据时,会将其存入`usart_instance.recv_buff[]`中,当收到完整一包数据,会调用设定的回调函数`module_callback`(即你提供的解析函数)。在此函数中,你可以通过`usart_instance.recv_buff[]`访问串口收到的数据。 + ## 代码结构 .h文件内包括了外部接口和类型定义,以及模块对应的宏。c文件内为私有函数和外部接口的定义。 -### 类型定义 +## 类型定义 ```c #define DEVICE_USART_CNT 3 // C板至多分配3个串口 @@ -35,7 +45,7 @@ typedef struct - 每定义一个`usart_instance`,就代表一个串口的**实例**(对象)。一个串口实例内有接收buffer,单个数据包的大小,该串口对应的`HAL handle`(代表其使用的串口硬件具体是哪一个)以及用于解包数据的回调函数。 -### 外部接口 +## 外部接口 ```c void USARTRegister(usart_instance *_instance); @@ -48,7 +58,7 @@ void USARTSend(usart_instance *_instance, uint8_t *send_buf, uint16_t send_size) - `USARTSend()`是通过模块通过其拥有的串口对象发送数据的接口,调用时传入的参数为串口实例指针,发送缓存以及此次要发送的数据长度(8-bit\*n)。 -### 私有函数和变量 +## 私有函数和变量 在.c文件内设为static的函数和变量