本帖最后由 哈哈 于 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灯灭。
测距固件得到的数据感觉和真实距离有些偏差,不过可以通过该模组的上位机参数调整来修正距离。
|