本帖最后由 lovzx 于 2024-3-15 16:13 编辑
简介
感谢安信可的活动,白嫖到了RD-03E雷达模组,RD-03E雷达模组资料连接 Rd-03 系列模组 | 安信可科技 (ai-thinker.com),拿到后就开始找资料开始准备,刚开始是在小安派上写的代码,后来用的时候发现小安派没有多板载LED灯,也没有多余的IO来外接设备,最后想起来了好久没动过的CH32V303开发板,接下来就是准备点亮LED
准备
- WCH-link
- 母-母杜邦线若干
- RD-03E雷达模块
- CH32V303VCT6-EVT-R0开发板
烧录RD-03E固件
刷机方式:这几天水群学习到了好多,目前最多的就是通过板载的四个下载触电下载,可以选择直接焊接插座的方式,也可以选择用杜邦线公头怼上去按压的方式下载,具体文档可以参考rd-03e使用文档.pdf (ai-thinker.com)
还有一种就是按照GD23的烧录方式,上电的时候把boot0电平拉高就可以通过usb方式下载了,排针旁边就是usb插座的位置
我这里使用的是DAP烧录方式
烧录器准备:
将WCH-Link设置成DAP模式,如下图所示,选择DAP模式后点击右边的Set按钮
RD-03E数据格式
rd-03e精准测距用户手册中文版.pdf (ai-thinker.com)手册里面有说明RD-03E是通过串口输出的方式,采用小端序格式,每一帧数据是7个字节,前两位是0xAA 0xAA,第三位是状态码,第4-5位是距离,最后两位是0x55 0x55,所以需要判断前面两字节和后面两字节是否匹配0xAA 0xAA和0x55 0x55就可以了
硬件连接
ch32v303有8个uart接口,RD-03E接入到板载的uart2,uart1用来连接电脑查看日志,板载LED连接到PC6上
代码如下
- #include "debug.h"
- #include "ring_buffer.h"
- static Ring_Buffer_Type rbType;
- static u8 rb_buffer[128];
- void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- void led_init() {
- //设置led引脚为PC6,同时需要用杜邦线把LED1或者LED2连接到PC6引脚,这样就可以通过PC6来控制LED了
- GPIO_InitTypeDef ledGPIO = { 0 };
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- ledGPIO.GPIO_Pin = GPIO_Pin_6;
- ledGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
- ledGPIO.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &ledGPIO);
- GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);
- }
- u8 status = -1;
- void led_switch(uint8_t open) {
- if (open != status) {
- GPIO_WriteBit(GPIOC, GPIO_Pin_6, (open == 0) ? (Bit_SET) : (Bit_RESET));
- status = open;
- }
- }
- //初始化uart2
- void USART2_Init() {
- GPIO_InitTypeDef gpio = { 0 };
- USART_InitTypeDef uart = { 0 };
- NVIC_InitTypeDef nvic = { 0 };
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- /**
- * A2 TX
- * A3 RX
- */
- gpio.GPIO_Pin = GPIO_Pin_2;
- gpio.GPIO_Speed = GPIO_Speed_50MHz;
- gpio.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &gpio);
- gpio.GPIO_Pin = GPIO_Pin_3;
- gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &gpio);
- uart.USART_BaudRate = 256000;
- uart.USART_WordLength = USART_WordLength_8b;
- uart.USART_StopBits = USART_StopBits_1;
- uart.USART_Parity = USART_Parity_No;
- uart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- uart.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(USART2, &uart);
- //注册uart2中断
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
- nvic.NVIC_IRQChannel = USART2_IRQn;
- nvic.NVIC_IRQChannelPreemptionPriority = 1;
- nvic.NVIC_IRQChannelSubPriority = 1;
- nvic.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&nvic);
- USART_Cmd(USART2, ENABLE);
- }
- //uart2中断
- void USART2_IRQHandler(void) {
- if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
- //接收数据
- u8 read = USART_ReceiveData(USART2);
- //清除中断
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);
- //保存到ring buffer中
- Ring_Buffer_Write_Byte(&rbType, read);
- }
- }
- int main(void) {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- SystemCoreClockUpdate();
- Delay_Init();
- //初始化UART1
- USART_Printf_Init(256000);
- //初始化接收ring buffer
- Ring_Buffer_Init(&rbType, rb_buffer, sizeof(rb_buffer), NULL, NULL);
- //初始化uart2
- USART2_Init();
- printf("SystemClk:%d\r\n", SystemCoreClock);
- printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID());
- printf("This is printf example\r\n");
- //初始化led
- led_init();
- u8 len = 0;
- u8 buf[7] = { 0 };
- u8 count = 0;
- u8 read = 0;
- u16 distance = 0;
- while (1) {
- //获取接收到的数据长度
- len = Ring_Buffer_Get_Length(&rbType);
- for (u8 i = 0; i < len; i++) {
- //读取接收数据
- Ring_Buffer_Read_Byte(&rbType, &read);
- //第一个字节不是0xAA舍弃,从头计数
- if (count == 0 && read != 0xAA) {
- continue;
- }
- //第二个字节不是0xAA,从头计数
- if (count == 1 && read != 0xAA) {
- count = 0;
- buf[0] = 0x00;
- continue;
- }
- buf[count] = read & 0xff;
- count++;
- //拿到了一帧的数据长度
- if (count >= 7) {
- count = 0;
- //检查最后两个字节是不是0x55,防止数据错误
- if (0x55 == read && 0x55 == buf[5]) {
- //小端序,第5个字节是距离的高8位
- distance = buf[3] | buf[4] << 8;
- printf("distance:%#x,%#x, %d\n", buf[3], buf[4], distance);
- if (distance >= 80) {
- //关灯
- led_switch(0);
- } else if (distance < 60 && distance > 20) {
- //开灯
- led_switch(1);
- }
- }
- }
- }
- Delay_Ms(50);
- }
- }
复制代码
效果如下
【安信可RD-03E雷达模块点亮LED灯】 https://www.bilibili.com/video/B ... bcdc04c8f8502594aa2
|