你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S003无法检测到引脚电平

[复制链接]
没你好果汁喝 提问时间:2025-4-2 10:58 / 未解决

目前以STM8S003F芯片做作为主机MCU 控制从机Elmos524.09超声波雷达芯片,做一款汽车倒车雷达系统;在开发时遇到了一点问题: 主机与从机之间通过特定的IO引脚进行通讯,通过引脚低电平时间的长短进行数据交流。 目前主机可以正常的通过IO引脚向从机发送指令,从机也可以正常的返回相应的数据,且在IO引脚上的示波器也检测出了相应的波形; 但是问题在于,在从机返回相应的数据波形以后,主机在检测引脚电平变化(也就是读取数据时),始终无法获取相应的电平信息,通过IAR编译器的DEBUG功能时。发现芯片在检测无法检测到电平的上升沿,以至于程序超时。系统采用us级的计数方式,示波器波形、硬件电路设计、接收函数代码在图片和附件中; 求大佬指点!!c99021bd9df8c3f26db61512b0ff49a.jpgk5.png1.png 接收代码:

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 ){

return 0xFFFF;
}

}else { if((0xFFFF -start_time +tnow) >=2000){
return 0xFFFF; } }
}

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){

return 0xFFFF;
}

}

} 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;

}

收藏 评论1 发布时间:2025-4-2 10:58

举报

1个回答
butterflyspring 回答时间:昨天 16:33
判断信号脉宽最好的方式是利用定时器的捕获方式。

捕获是由硬件完成的,好处是准确且及时,计算也方便。
楼主的代码看起来像是通过IO 查询方式。类似于采样。
这种方式在速度较慢的信号上粗略判断是可以的,比如红外接收。
但是快速信号就不适用了,代码执行时间,中断时间等都会带来较大的偏差。
所以建议使用定时器捕获方式,可以查查手册相应功能介绍。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版