
目前以STM8S003F芯片做作为主机MCU 控制从机Elmos524.09超声波雷达芯片,做一款汽车倒车雷达系统;在开发时遇到了一点问题: 主机与从机之间通过特定的IO引脚进行通讯,通过引脚低电平时间的长短进行数据交流。
目前主机可以正常的通过IO引脚向从机发送指令,从机也可以正常的返回相应的数据,且在IO引脚上的示波器也检测出了相应的波形;
但是问题在于,在从机返回相应的数据波形以后,主机在检测引脚电平变化(也就是读取数据时),始终无法获取相应的电平信息,通过IAR编译器的DEBUG功能时。发现芯片在检测无法检测到电平的上升沿,以至于程序超时。系统采用us级的计数方式,示波器波形、硬件电路设计、接收函数代码在图片和附件中;
求大佬指点!! u16 receive_status_data(GPIO_TypeDef * GPIOx, GPIO_Pin_TypeDef PortPins) { uint16_t start_time, low_time; uint16_t fall_edge = 0; uint16_t rise_edge = 0; uint16_t data = 0; u16 volatile tnow=0; uint8_t bit_count = 15; GPIO_Init(GPIOx, PortPins, GPIO_MODE_OUT_PP_HIGH_FAST); Tim2_init(); start_time = TIM2_GetCounter(); // 读取10位状态数据 for (int i = 0; i < bit_count; i++) { // 等待下降沿 start_time = TIM2_GetCounter(); // while ( 0 != GPIO_ReadInputPin(GPIOx, PortPins)){ while ((GPIOx->IDR & PortPins)!=0){ tnow = TIM2_GetCounter(); if(tnow > start_time){ if((tnow - start_time) >= 2000 ){
}else {
if((0xFFFF -start_time +tnow) >=2000){ fall_edge = TIM2_GetCounter(); // 等待上升沿 GPIO_WriteHigh(GPIOA, GPIO_PIN_3); while ( (GPIOx->IDR & PortPins) == 0){ // while ((GPIOx->IDR & PortPins)==0){ tnow = TIM2_GetCounter(); if(tnow > start_time){ if((tnow - start_time) >= 2000 ){ GPIO_WriteLow(GPIOA, GPIO_PIN_3); return 0xFFFF; } }else { if((0xFFFF -start_time +tnow) >=2000){
} } rise_edge = TIM2_GetCounter(); low_time = rise_edge - fall_edge; // 低电平时间 // data_cmd.cdm=low_time; // 判断逻辑值 data_cmd.cdm=low_time; if (low_time >= 95 && low_time <= 105) { data |= (0 << (bit_count - 1 - i)); // 0 } else if (low_time >= 47 && low_time <= 52) { data |= (1 << (bit_count - 1 - i)); // 1 } else { return 0xFFFF; // 无效位 } } // enableInterrupts(); TIM2_Cmd(DISABLE); echo.encho_data= data; return data; } |
STM8 @svlreg 问题
2025西安ST工业峰会
ASM330的几个尾缀型号区别是什么
STM8AF62XX+L99PM62GXP LIN通讯的电路原理图有吗?官网提供了一套软件,没找到对应的原理图,请大家指教一下
求一个STM8S207例程
L9663驱动开发
初次接触STM8,请问在STVD中,为什么这个Struct会报错
ASM330LHB测量精度可以达到0.001g吗?可以达到多少?
L9663如何使用上行缓冲区发送同步脉冲
STMS005K6T6 如何采集内部参考电压。
捕获是由硬件完成的,好处是准确且及时,计算也方便。
楼主的代码看起来像是通过IO 查询方式。类似于采样。
这种方式在速度较慢的信号上粗略判断是可以的,比如红外接收。
但是快速信号就不适用了,代码执行时间,中断时间等都会带来较大的偏差。
所以建议使用定时器捕获方式,可以查查手册相应功能介绍。