I wrote a sample pwm function in C for beaglebone black. Whenever I make a function call in other modules or in main(), I end up in segmentation fault. Kindly help where I am ma
There are several issues with this code - some of which are already described in the comments.
input_no
is both passed into the function as well as defined within the function.count
which is not modified in the body of either loop. Additionally, the condition in the first of these loops is always true regardless of the value of count
.fopen
calls is never checked. If any of these calls fail, then subsequent file operations are called with null file pointers.count
is not defined or initialized anywhere in this code. Is it defined globally?fopen
is made outside the body of the switch statement - it'd be best to move its corresponding close call outside as well.I have just successfully enabled 4 PWM outputs on BeagleBone Black using C, so I can hopefully give you some legit advices.
Using files under /sys/devices/ocp.3/
directory (known as the Device Tree Overlay) for PWM is not a good idea for two reasons:
pwm_test_P8_13.xx
, a potential cause for segmentation fault since you don't check for fopen status. However, fopen does not allow wildcard in the specified path. My workaround, which was not clean at all, was to call echo /sys/devices/ocp.3/pwm_test_P8_13.*/
with popen to retrieve the correct full path for the PWM pin directory.dmesg | tail
, you may see the following message:
[ 1406.652632] ehrpwm 48304200.ehrpwm: Period value conflicts with channel 1
[ 1406.660047] pwm_test pwm_test_P8_19.11: pwm_config() failed
As such, I used the files under /sys/class/pwm/
instead. You still need to write am33xx_pwm
and the PWM pins you plan to use to the file /sys/devices/bone_capemgr.9/slots
. Then, you go to directory /sys/class/pwm/
, write digit (0-7) to the file export
, then modify the file under generated directory pwm?
, where ?
is the digit written to export
.
The following table shows each digit and their corresponding pin(s):
Here is the tutorial I referred to.
Hope this helps!