2.53 WT31N 陀螺仪模块(来自#ifndef 的贡献)
2.53.1 模块来源
实物展示图
2.53.2 规格参数
工作电压:3.3~5.5V
工作电流:<10mA
通信方式:串口(3.3V)
测量范围:±90°
测量精度: 0.2°
响应频率: 0.1~100Hz
2.53.3 模块原理
本质为 MCU+LIS3DH 二次封装的模块,MCU 为 STM8S003F3.支持串口
串口默认 9600bps8N1,可配置至 115200bps
注意:
- 上电后需保持 3 秒以上静止,模块自校准
- 模块存在航向角偏移(长时间运行)
- 欧拉角万向锁问题,横滚/俯仰 90 度时会有互相影响
2.53.4 移植工程
模块使用串口进行通信,通信速率 9600bps(8N1),模块内置 LDO,因此可在 3~5V 供电情况下通过 3.3V 电平通信.
2.53.6 移植步骤
创建 bsp_wt31n.c 文档内容如下:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LC
* 修改日期: 2023年06月12日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "bsp_wt31n.h"
#include "bsp_usart.h" // communication interface & log
#include "systick.h"
/* Private types -------------------------------------------------------------*/
/* Data struct */
typedef struct
{
uint8_t head; ///< 0x55 fixed
uint8_t type; ///< 0x51 acceleration;0x53 angle
uint8_t data1_l;
uint8_t data1_h;
uint8_t data2_l;
uint8_t data2_h;
uint8_t data3_l;
uint8_t data3_h;
uint8_t data4_l;
uint8_t data4_h;
uint8_t sumcrc; ///< checksum
} Wt31nData_t;
/* Private macros ------------------------------------------------------------*/
/* User porting interfaces */
#define PORTING_API_INIT(n) bsp_uart_user_init((n))
#define PORTING_API_SEND(dat,len) bsp_uart_user_send((dat),(len))
#define PORTING_API_RECV(dat,len) bsp_uart_user_recv((dat),(len))
#define PORTING_BUFFER_SIZE 32u
#define ACCELERATION_GRAVITATIONAL 9.80 // unit: m/s2
/* Get uint16_t bigend */
#define GET_INT16_LE(n,b,i) \
{ \
(n) = (((int16_t) (b)[(i)] ) | \
((int16_t) (b)[(i) + 1] <<8 )); \
}
/* Private variables ---------------------------------------------------------*/
struct
{
bool initialize;
} Wt31nInfo;
/* Private functions ---------------------------------------------------------*/
static void acceleration_data_extract( const uint8_t* _Data, uint8_t _Length, float* _Temp,
float* _AccX, float* _AccY, float* _AccZ );
static void angle_data_extract( const uint8_t* _Data, uint8_t _Length,
int16_t* _Pitch, int16_t* _Roll, uint16_t* _Version );
static int packet_format_check( const uint8_t* _Data, uint8_t _Length );
static uint8_t checksumGet( const uint8_t* _Data, uint8_t _Length );
/* External variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/// @brief Initialize module
/// @return @see bsp_uart_user_init
__API__ int bsp_wt31n_init( void )
{
if( Wt31nInfo.initialize != false )
{
return 0;
}
/* Initialize uart port */
if( PORTING_API_INIT( 9600 ) != 0 )
{
return -1;
}
Wt31nInfo.initialize = true;
return 0;
}
/// @brief Test fucntion
/// @return 0 Success <0 Failed
__API__ int bsp_wt31n_coroutine( void )
{
uint8_t _buffer[PORTING_BUFFER_SIZE];
uint32_t _length;
uint8_t* _data = _buffer;
int _res;
/* Data processing after initialization */
if( Wt31nInfo.initialize != true )
{
return 0;
}
/* receive data */
_length = PORTING_API_RECV( _buffer, PORTING_BUFFER_SIZE );
if( _length < 22 )
{
return 0; // Buffer is empty
}
LOG_HEX( "Data:", 16, ( uint8_t* )_buffer, _length );
/* acceleration data */
_res = packet_format_check( ( const uint8_t* )_buffer, _length );
if( _res == 0x51 )
{
float _accx, _accy, _accz, _temp;
_res = 0;
// acceleration
acceleration_data_extract( ( const uint8_t* )_buffer + 2, _length - 2,
&_temp, &_accx, &_accy, &_accz );
LOG_RAW( "WT31N AccX:%.2f AccY:%.2f AccZ:%.2f Temperature:%.2f\r\n",
_accx, _accy, _accz, _temp );
}
else if( _res < 0 )
{
LOG_RAW( "WT31N-Error %d\r\n", _res );
return _res;
}
/* Angle data */
_data = _buffer + 11;
_length = _length - 11;
_res = packet_format_check( ( const uint8_t* )_data, _length );
if( _res == 0x53 )
{
int16_t _pitch, _roll;
uint16_t _version;
_res = 0;
// angle
angle_data_extract( ( const uint8_t* )_data + 2, _length - 2,
&_pitch, &_roll, &_version );
LOG_RAW( "WT31N Pitch:%d Roll:%d Version:%04X\r\n",
_pitch, _roll, _version );
}
if( _res < 0 )
{
LOG_RAW( "WT31N-Error %d\r\n", _res );
}
return _res;
}
/// @brief Get acceleration data from module
/// @param _Data input data
/// @param _Length length of data
/// @param[out] _Temp temperature
/// @param[out] _AccX x axis
/// @param[out] _AccY y axis
/// @param[out] _AccZ z axis
static void acceleration_data_extract( const uint8_t* _Data, uint8_t _Length, float* _Temp,
float* _AccX, float* _AccY, float* _AccZ )
{
#define SUM_ACC(num) ((float)((float)(num)/32768.0*16.0*ACCELERATION_GRAVITATIONAL))
// #define SUM_ACC(num) ((int16_t)((float)((num)>>11)*ACCELERATION_GRAVITATIONAL))
int16_t _temp;
if( _AccX )
{
GET_INT16_LE( _temp, _Data, 0 );
*_AccX = SUM_ACC( _temp );
}
if( _AccY )
{
GET_INT16_LE( _temp, _Data, 2 );
*_AccY = SUM_ACC( _temp );
}
if( _AccZ )
{
GET_INT16_LE( _temp, _Data, 4 );
*_AccZ = SUM_ACC( _temp );
}
if( _Temp )
{
GET_INT16_LE( _temp, _Data, 6 );
*_Temp = ( float )( ( float )_temp / 100.0 );
}
}
/// @brief Get angle data from module
/// @param _Data input data
/// @param _Length length of data
/// @param[out] _Pitch pitch angle
/// @param[out] _Roll roll angle
/// @param[out] _Verison Version code
static void angle_data_extract( const uint8_t* _Data, uint8_t _Length,
int16_t* _Pitch, int16_t* _Roll, uint16_t* _Version )
{
#define SUM_ANGLE(num) ((int16_t)((float)(num)/32768.0*180.0))
int16_t _temp;
if( _Roll )
{
GET_INT16_LE( _temp, _Data, 0 );
*_Roll = SUM_ANGLE( _temp );
}
if( _Pitch )
{
GET_INT16_LE( _temp, _Data, 2 );
*_Pitch = SUM_ANGLE( _temp );
}
/* Data[4]Data[5]is empty */
if( _Version )
{
*_Version = ( uint16_t )_Data[7] << 8 | _Data[6];
}
}
/// @brief Check message packet format(Address&Checksum)
/// @param _Data input data
/// @param _Length length of data
/// @retval -101 too short
/// @retval -103 checksum fail
/// @retval type 0x51/0x53
static int packet_format_check( const uint8_t* _Data, uint8_t _Length )
{
assert( _Data );
if( _Length < 11 )
{
return -101; //data too short
}
/* Check checksum */
uint8_t _checksum = checksumGet( _Data, 10 );
if( _checksum != _Data[10] )
{
LOG_RAW( "Checksum fail %04X-%04X\r\n", _Data[10], _checksum );
return -103; // Checksum check fail
}
return ( int )_Data[1];
}
/// @brief Get checksum
/// @param _Data input data
/// @param _Length length of data
/// @return checksum
static uint8_t checksumGet( const uint8_t* _Data, uint8_t _Length )
{
assert( _Data );
uint8_t _checksum = 0x00;
while( _Length-- )
{
_checksum += *_Data;
_Data++;
}
return ( _checksum );
}
/*---- Write command ---------------------------------------------------------*/
#define WT_CMD_CAL 0x01 // Calibration Mode: 0x0001 Acc 0x0008 Angle
#define WT_CMD_BAUD 0x04 // baudspeed: 0x0000 115200,0x0001 9600bps
#define WT_CMD_DELAY 0x59 // Alarm delay,unit: ms
#define WT_CMD_CAL_ACC 0x0001
#define WT_CMD_CAL_ANGLE 0x0008
#define WT_CMD_BAUD_HI 0x0000
#define WT_CMD_BAUD_LO 0x0001
/// @brief Format command struct
/// @param[out] _Data data buffer
/// @param _Length data buffer length
/// @param _Addr reg addr
/// @param _Command write value
/// @retval 0 buffer wrong
/// @retval 5 packet size
static uint8_t packet_format( uint8_t* _Data, uint8_t _Length,
uint8_t _Addr, uint16_t _Command )
{
if( _Data == NULL || _Length < 5 )
{
return 0;
}
uint8_t _len = 0;
_Data[_len++] = 0xFF;
_Data[_len++] = 0xAA;
_Data[_len++] = _Addr;
_Data[_len++] = ( uint8_t )( _Command & 0xFF ); // low byte
_Data[_len++] = ( uint8_t )( _Command >> 8 ); // high byte
return _len;
}
/// @brief Write command control module
/// @param _Command command
/// @param _Value value
/// @return >0 success 0 fail
__API__ int bsp_wt31n_command( uint8_t _Command, uint16_t _Value )
{
uint8_t _buffer[8];
uint8_t _len;
_len = packet_format( _buffer, sizeof( _buffer ), _Command, _Value );
PORTING_API_SEND( _buffer, _len );
return _len;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
创建 bsp_wt31n.h
文档内容如下:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LC
* 修改日期: 2023年06月12日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_WT31N_H__
#define __BSP_WT31N_H__
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Exported constants --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/// @brief Initialize module
/// @return @see bsp_uart_user_init
__API__ int bsp_wt31n_init( void );
/// @brief Test fucntion
/// @return 0 Success <0 Failed
__API__ int bsp_wt31n_coroutine( void );
/// @brief Write command control module
/// @param _Command command
/// @param _Value value
/// @return >0 success 0 fail
__API__ int bsp_wt31n_command( uint8_t _Command, uint16_t _Value );
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __BSP_WT31N_H__ */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
相关串口驱动等底层驱动部分参见 bsp_usart.c
文档内容:
c
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LC
* 修改日期: 2023年06月12日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "bsp_usart.h"
#include <string.h> //memcpy
/* Porting config */
// #define UARTx_BOUND 9600
#define UARTx_NAME USART1
#define UARTx_RCC RCU_USART1
#define UARTx_GPIO_RCC (RCU_GPIOA)
#define UARTx_PIN_TX GPIO_PIN_2
#define UARTx_PORT_TX GPIOA
#define UARTx_AF_TX GPIO_AF_7
#define UARTx_PIN_RX GPIO_PIN_3
#define UARTx_PORT_RX GPIOA
#define UARTx_AF_RX GPIO_AF_7
/* interrupt */
#define UARTx_IRQ_CHANNEL USART1_IRQn
#define UARTx_IRQ_HANDLER USART1_IRQHandler
#define UARTx_IRQ_PRIORITY 5
/* Revice data buffer size */
#define UARTx_RX_BUFFER_SIZE 64 // at least 9Bytes
#define MIN(n,m) (((n) < (m)) ? (n) : (m))
struct
{
bool initialize;
bool rx_flag;
uint8_t length;
uint8_t buffer[UARTx_RX_BUFFER_SIZE];
} bsp_uart_user;
__API__ int bsp_uart_user_init( uint32_t _BandRate )
{
if( bsp_uart_user.initialize != false )
{
return 0;
}
/* Enable the UART Clock */
rcu_periph_clock_enable( UARTx_GPIO_RCC );
rcu_periph_clock_enable( UARTx_RCC );
/* Configure the UART TX pin */
gpio_af_set( UARTx_PORT_TX, UARTx_AF_TX, UARTx_PIN_TX );
gpio_mode_set( UARTx_PORT_TX, GPIO_MODE_AF, GPIO_PUPD_PULLUP, UARTx_PIN_TX );
gpio_output_options_set( UARTx_PORT_TX, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, UARTx_PIN_TX );
/* Configure the UART RX pin */
gpio_af_set( UARTx_PORT_RX, UARTx_AF_RX, UARTx_PIN_RX );
gpio_mode_set( UARTx_PORT_RX, GPIO_MODE_AF, GPIO_PUPD_PULLUP, UARTx_PIN_RX );
gpio_output_options_set( UARTx_PORT_RX, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, UARTx_PIN_RX );
/* Configure UART param: 8N1 */
usart_deinit( UARTx_NAME );
usart_baudrate_set( UARTx_NAME, _BandRate );
usart_parity_config( UARTx_NAME, USART_PM_NONE );
usart_word_length_set( UARTx_NAME, USART_WL_8BIT );
usart_stop_bit_set( UARTx_NAME, USART_STB_1BIT );
/* Enabel transmit mode */
usart_transmit_config( UARTx_NAME, USART_TRANSMIT_ENABLE );
usart_receive_config( UARTx_NAME, USART_RECEIVE_ENABLE );
/* Configure interrupt */
nvic_irq_enable( UARTx_IRQ_CHANNEL, UARTx_IRQ_PRIORITY, 0 );
/* Interrupt mode */
/* receive data not empty interrupt */
usart_interrupt_enable( UARTx_NAME, USART_INT_RBNE );
usart_interrupt_enable( UARTx_NAME, USART_INT_IDLE );
usart_flag_clear( UARTx_NAME, USART_FLAG_TC );
/* Enable periph */
usart_enable( UARTx_NAME );
bsp_uart_user.initialize = true;
return 0;
}
__API__ uint32_t bsp_uart_user_send( uint8_t* _Data, uint32_t _Length )
{
#if 0
if( USART_CTL0( UARTx_NAME ) & ( USART_CTL0_UEN ) != ( USART_CTL0_UEN ) )
{
return 0; // Device is disable
}
#else
if( bsp_uart_user.initialize == false )
{
return 0;
}
#endif
for( uint32_t i = 0; i < _Length; i++ )
{
usart_data_transmit( UARTx_NAME, *( ( char* )_Data + i ) );
while( usart_flag_get( UARTx_NAME, USART_FLAG_TC ) == RESET );
}
return _Length;
}
__API__ uint32_t bsp_uart_user_recv( uint8_t* _Data, uint32_t _Length )
{
assert( _Data );
uint32_t _len = 0;
if( bsp_uart_user.initialize == false )
{
return 0;
}
_len = MIN( _Length, bsp_uart_user.length );
if( ( bsp_uart_user.rx_flag != false ) && ( _len > 0 ) )
{
memcpy( _Data, bsp_uart_user.buffer, _len );
/* Clear receive status */
bsp_uart_user.length = 0x00;
bsp_uart_user.rx_flag = false;
}
return _len;
}
__IRQ__ void UARTx_IRQ_HANDLER( void )
{
/* Data processing after initialization */
if( bsp_uart_user.initialize != true )
{
return;
}
/* Receive Data not empty */
if( usart_interrupt_flag_get( UARTx_NAME, USART_INT_FLAG_RBNE ) != RESET )
{
/* Read one byte from the receive data register */
uint8_t _recv = ( usart_data_receive( UARTx_NAME ) & 0xFF );
/* Push one byte to receive fifo */
if( bsp_uart_user.rx_flag != false )
{
return; //Buffer data not processed, skipping reception
}
if( bsp_uart_user.length < UARTx_RX_BUFFER_SIZE )
{
// Prevent overflow
bsp_uart_user.buffer[bsp_uart_user.length++] = _recv;
}
}
/* Bus idle */
else if( usart_interrupt_flag_get( UARTx_NAME, USART_INT_FLAG_IDLE ) != RESET )
{
/* Clear IDLE */
( void )USART_STAT0( UARTx_NAME );
( void )USART_DATA( UARTx_NAME );
if( bsp_uart_user.length )
{
bsp_uart_user.rx_flag = true;
}
}
/* Overrun error : skip */
}
/*---- Log output simple apis ----------------------------------------------- */
__API__ void _LOG_HEX( char* _Name, uint8_t _Width, uint8_t* _Data, uint8_t _Length )
{
size_t _len;
for( size_t i = 0; i < _Length; i += _Width )
{
/* Name */
printf( "%-*.*s ", 16, 16, _Name );
/* Timestamp */
/* Fill data */
_len = 0x00;
for( size_t j = 0; j < _Width; j++ )
{
if( ( i + j ) < _Length )
{
printf( "%02X", _Data[i + j] );
}
if( ( j + 1 ) % 4 == 0 )
{
printf( " " );
}
}
printf( "\r\n" );
}
}
/*---- Official printf interface(KeilMDK microLib) -------------------------- */
/************************************************
函数名称 : usart_gpio_config
功 能 : 串口配置GPIO
参 数 : band_rate:波特率
返 回 值 : 无
作 者 : LC
*************************************************/
void usart_gpio_config( uint32_t band_rate )
{
/* 开启时钟 */
rcu_periph_clock_enable( BSP_USART_TX_RCU ); // 开启串口时钟
rcu_periph_clock_enable( BSP_USART_RX_RCU ); // 开启端口时钟
rcu_periph_clock_enable( BSP_USART_RCU ); // 开启端口时钟
/* 配置GPIO复用功能 */
gpio_af_set( BSP_USART_TX_PORT, BSP_USART_AF, BSP_USART_TX_PIN );
gpio_af_set( BSP_USART_RX_PORT, BSP_USART_AF, BSP_USART_RX_PIN );
/* 配置GPIO的模式 */
/* 配置TX为复用模式 上拉模式 */
gpio_mode_set( BSP_USART_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_TX_PIN );
/* 配置RX为复用模式 上拉模式 */
gpio_mode_set( BSP_USART_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_RX_PIN );
/* 配置TX为推挽输出 50MHZ */
gpio_output_options_set( BSP_USART_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BSP_USART_TX_PIN );
/* 配置RX为推挽输出 50MHZ */
gpio_output_options_set( BSP_USART_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BSP_USART_RX_PIN );
/* 配置串口的参数 */
usart_deinit( BSP_USART ); // 复位串口
usart_baudrate_set( BSP_USART, band_rate ); // 设置波特率
usart_parity_config( BSP_USART, USART_PM_NONE ); // 没有校验位
usart_word_length_set( BSP_USART, USART_WL_8BIT ); // 8位数据位
usart_stop_bit_set( BSP_USART, USART_STB_1BIT ); // 1位停止位
/* 使能串口 */
usart_enable( BSP_USART ); // 使能串口
usart_transmit_config( BSP_USART, USART_TRANSMIT_ENABLE ); // 使能串口发送
}
/************************************************
函数名称 : usart_send_data
功 能 : 串口重发送一个字节
参 数 : ucch:要发送的字节
返 回 值 :
作 者 : LC
*************************************************/
void usart_send_data( uint8_t ucch )
{
usart_data_transmit( BSP_USART, ( uint8_t )ucch ); // 发送数据
while( RESET == usart_flag_get( BSP_USART, USART_FLAG_TBE ) ); // 等待发送数据缓冲区标志置位
}
/************************************************
函数名称 : usart_send_String
功 能 : 串口发送字符串
参 数 : ucstr:要发送的字符串
返 回 值 :
作 者 : LC
*************************************************/
void usart_send_string( uint8_t* ucstr )
{
while( ucstr && *ucstr ) // 地址为空或者值为空跳出
{
usart_send_data( *ucstr++ ); // 发送单个字符
}
}
/************************************************
函数名称 : fputc
功 能 : 串口重定向函数
参 数 :
返 回 值 :
作 者 : LC
*************************************************/
int fputc( int ch, FILE* f )
{
usart_send_data( ch );
// 等待发送数据缓冲区标志置位
return ch;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
2.53.7 移植验证
这里仅按照上面资料链接给出的 HWT31 协议进行解析,并提供里写指令端口但未测试验证.同时,默认串口接收模板采用断帧方式,本例数据量较大,因此未使用 delay 来阻塞.实际应用中应使用 fifo 等方式缓冲数据.另,维特给出其自定义协议及 SDK 包,支持多种维特官方模块,可按需移植.
工程主函数内修改如下:
c
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LC
* 修改日期: 2023年06月12日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
/* Porting files */
#include "wt31n/bsp_wt31n.h"
int main( void )
{
/* Bsp configuration */
nvic_priority_group_set( NVIC_PRIGROUP_PRE2_SUB2 );
systick_config();
usart_gpio_config( 115200U );
/* User configuration */
int _res;
if( bsp_wt31n_init() != 0 )
{
LOG_RAW( "Error component initialization failed\r\n" );
delay_1ms( 5000 );
NVIC_SystemReset(); //Call software reset system
}
LOG_RAW( "Component demo start\r\n" );
while( 1 )
{
_res = bsp_wt31n_coroutine(); // test fucntions
if( _res < 0 )
{
LOG_RAW( "Sensor error code %d\r\n", _res );
}
// delay_1ms( 500 );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
案例现象:
上电后,梁山派接收 WT-31N 主动输出数据并解析,未阻塞因此数据刷新较快.
移植成功示例文件: