| 本帖最后由 哈哈 于 2024-3-15 20:23 编辑 
 
 Rd-03E是由深圳市安信可科技有限公司开发的雷达模组,搭载矽典微的S3KM111L芯片。S3KM111L 是一种基于 FMCW 雷达收发器技术的集成单片机毫米波传感器 SoC,它工作在 24 GHz 的 K 波段,每个单频扫描的调制带宽高达 1 GHz。本次测试任务使用的是测距固件,而Rd-03E出厂烧录的是手势识别固件,因此我们需要给模组烧录测距的固件,之后再去编程完成本次测评。
 一、固件烧录
 
 官方文件中的信息:Rd-03E 支持 keil 5 IDE 烧录 hex 文件,CMSIS-DAP、J-Link (V9 以上版本)等烧录器下载程序。烧录前请确保已经安装 GiqaDevice.GD32E23x_DFP.1.0.1.pack 和 ARM.CMSIS.5.7.0.pack 或更新版本的 CMSIS pack。
 
 本人使用的工具是 keil + st-link 来进行固件烧录。因为手里只有st-link
  。 烧录步骤:
 1.首先我们需要保证keil支持 GiqaDevice.GD32E23x_DFP.1.0.1.pack 该芯片包,该芯片包有两种安装方法,离线安装和在线安装。具体操作大家可以网上了解了解。
 2.创建基于 GD32E230K8 芯片的keil工程,创建完后,将官方发布的测距固件.hex文件放到obj文件夹里面。然后点击魔术棒,点output一栏,在可执行文件名字处填入 .hex 文件名字。(.hex也填入)
 
     
 3.配置调试工具为st-link debug。
 4.点击下载,将固件烧录进去。
 二、ch32v307的工程创建
 
 控制板是沁恒微电子发布的评估板应用于 CH32V3097 芯片的开发,IDE 使用 MounRiver 编译器,可选择使用板载或独立的WCH-Link 进行仿真和下载,并提供了芯片资源相关的应用参考示例及演示。本工程主要使用串口接收数据包,为方便,直接将其普通工程的debug.c文件修改,打开串口UASRT1的接收以及中断。
 
 void USART_Printf_Init(uint32_t baudrate)
 {
 GPIO_InitTypeDef  GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
 
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
 USART_InitStructure.USART_BaudRate = baudrate;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
 
 
 NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
 
 
 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
 USART_Init(USART1, &USART_InitStructure);
 USART_Cmd(USART1, ENABLE);
 }
 
 三、程序编写
 下面是中断接收数据包的函数,参考了交流群中大佬的代码,使用状态机来完成接收。
 void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 
 //串口1中断函数,接受rdo3E数据
 /*中断读取数据包的时候,调试时,VOFA+要一个一个字节的发送。*/
 void USART1_IRQHandler(void)
 {
 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
 {
 
 
 RX_temp = USART_ReceiveData(USART1);
 //USART_SendData(USART1, RX_temp);
 if( RX_temp == 0xAA )
 {
 RX_State = 1;       //进入下一状态
 RX_count = 0;
 }
 else if( RX_State == 1 )
 {
 RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
 }
 if( RX_count >= 4 )
 {
 RX_count--;
 RX_State = 2;    //进入第二状态
 }
 else if( RX_State == 2 )
 {
 if( RX_temp == 0x55 )
 {
 RX_State = 0;
 RX_flag = 1; //成功接受1数据包
 }
 if(RX_flag == 1)
 {
 range=RX_BUF[2];
 range=(range<<8)|RX_BUF[1];//将小端格式下的距离数据如0X90 0X01转换成0X190
 
 
 if( RX_BUF[0] == 0x02 )
 {
 led_flag = 1; //该flag判断是否为运动还是微动
 }
 else {
 led_flag = 2;
 }
 }
 }
 USART_ClearITPendingBit(USART1, USART_IT_RXNE);      //清除中断标志位
 }
 }
 下面是主函数中的处理
 int main(void)
 {
 //u8 i = 0;
 
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
 SystemCoreClockUpdate();
 Delay_Init();
 led_init();
 USART_Printf_Init(256000);
 printf("SystemClk:%d\r\n",SystemCoreClock);
 printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
 printf("This is printf example\r\n");
 GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
 GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
 while(1)
 {
 Delay_Ms(1);
 if( led_flag == 1)
 {
 led_flag = 0;
 GPIO_WriteBit(GPIOA, GPIO_Pin_1,Bit_RESET);
 printf("finish one data_package!!!!!!");
 }
 else if( led_flag == 2 ){
 GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
 }
 if((range>0X0000)&&(range<=0X0064))
 {
 GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_RESET);
 }
 else {
 GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
 }
 }
 }
 
 
 四、测评结果。
 靠近时,LED灯亮,离开时,LED灯灭。
 
 测距固件得到的数据感觉和真实距离有些偏差,不过可以通过该模组的上位机参数调整来修正距离。
 
 
 
 
 
 
 
 
 |