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

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;

}

点评

可以采用韦根方式试试  发表于 2025-4-3 15:44
收藏 评论3 发布时间:2025-4-2 10:58

举报

3个回答
butterflyspring 回答时间:2025-4-2 16:33:00
判断信号脉宽最好的方式是利用定时器的捕获方式。

捕获是由硬件完成的,好处是准确且及时,计算也方便。
楼主的代码看起来像是通过IO 查询方式。类似于采样。
这种方式在速度较慢的信号上粗略判断是可以的,比如红外接收。
但是快速信号就不适用了,代码执行时间,中断时间等都会带来较大的偏差。
所以建议使用定时器捕获方式,可以查查手册相应功能介绍。


也可以参考其他帖子,用两个引脚来测量。这样只需在第二个捕获标标志来临时,
开始计算差值。 注意最好定时器计数周期能覆盖最长电平,否则定时器更新中断需要高位计数。
没你好果汁喝 回答时间:2025-4-7 10:12:09

butterflyspring 发表于 2025-4-2 16:33
判断信号脉宽最好的方式是利用定时器的捕获方式。</p>
<p>捕获是由硬件完成的,好处是准确且及时,计算也方便。

感谢!听了您的回答以后受益良多!

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版