Gib*_*ian 2 c embedded-linux beagleboneblack
我用 C 语言为 beaglebone black 编写了一个示例 pwm 函数。每当我在其他模块或 main() 中进行函数调用时,我都会遇到分段错误。请帮助我犯错的地方以及如何处理这个问题。下面是代码。
int trigger_pwm_output(unsigned input_no )
{
FILE *pwm,*duty,*period,*run;``
uint16_t input=0;
uint8_t input_no=0,input_state=0;
unsigned int duty_cycle =500000;
pwm = fopen("/sys/devices/bone_capemgr.9/slots", "w");
fseek(pwm,0,SEEK_SET);
fprintf(pwm,"am33xx_pwm");
fflush(pwm);
switch(input_no)
{
case 0:
fprintf(pwm,"bone_pwm_P8_13");
fflush(pwm);
period = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/period", "w");
fseek(period,0,SEEK_SET);
fprintf(period,"%d",500000);
fflush(period);
duty = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/duty", "w");
fseek(duty,0,SEEK_SET);
run = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/run", "w");
fseek(run,0,SEEK_SET);
fprintf(run,"%d",0);
fflush(run);
fseek(run,0,SEEK_SET);
count++;
do
{
duty_cycle += 10;
fprintf(duty,"%d",duty_cycle);
}while(count > 0) || (count < 10));
fflush(duty);
fprintf(run,"%d",1);
fflush(run);
fclose(pwm);
fclose(duty);
fclose(period);
fclose(run);
break;
case 1:
fprintf(pwm,"bone_pwm_P8_19");
fflush(pwm);
period = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/period", "w");
fseek(period,0,SEEK_SET);
fprintf(period,"%d",500000);
fflush(period);
duty = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/duty", "w");
fseek(duty,0,SEEK_SET);
run = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/run", "w");
fseek(run,0,SEEK_SET);
fprintf(run,"%d",0);
fflush(run);
fseek(run,0,SEEK_SET);
--count;
do
{
duty_cycle += 10;
fprintf(duty,"%d",duty_cycle);
}while(count <10);
fflush(duty);
fprintf(run,"%d",1);
fflush(run);
fclose(pwm);
fclose(duty);
fclose(period);
fclose(run);
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
`
我刚刚使用 C 在 BeagleBone Black 上成功启用了 4 个 PWM 输出,所以我希望可以给你一些合理的建议。
/sys/devices/ocp.3/为 PWM使用目录下的文件(称为设备树覆盖)不是一个好主意,原因有两个:
pwm_test_P8_13.xx,由于您不检查 fopen 状态,因此可能会导致分段错误。但是,fopen 不允许在指定路径中使用通配符。我的解决方法根本不干净,是echo /sys/devices/ocp.3/pwm_test_P8_13.*/使用popen调用以检索 PWM 引脚目录的正确完整路径。dmesg | tail,您可能会看到以下消息:
[1406.652632]ehrpwm 48304200.ehrpwm:周期值与通道 1 冲突
[1406.660047] pwm_test pwm_test_P8_19.11: pwm_config() 失败
因此,我改用了下面的文件/sys/class/pwm/。您仍然需要将am33xx_pwm您计划使用的 PWM 引脚写入文件/sys/devices/bone_capemgr.9/slots。然后,你去的目录/sys/class/pwm/,写数字(0-7)的文件export,然后修改生成的目录下的文件pwm?,其中?的数字写入export。下表显示了每个数字及其对应的引脚:

这是我参考的教程。
希望这可以帮助!