in these days i'm trying to learn something about "ChibiOS's world" and I am using an STM32F401 Nucleo-64.
I've already tried very simple projects, now i would like to learn something more about pwm. That's what i'd like to do:
Push user button->generation of pwm signal with variable duty cycle->the green led switch on slowly;
That's what i do:
Code: Select all
#include "ch.h"
#include "hal.h"
BaseSequentialStream * chp = (BaseSequentialStream *) &SD2;
static uint32_t value;
static bool button_pressed = FALSE;
//PWM
static void pwmpcb(PWMDriver *pwmp) {
(void)pwmp;
if(value)
palSetPad(GPIOA, GPIOA_LED_GREEN);
}
static void pwmc1cb(PWMDriver *pwmp) {
(void)pwmp;
palClearPad(GPIOA, GPIOA_LED_GREEN);
}
//configuration
static PWMConfig pwmcfg = {
1000000,
1000,
pwmpcb,
{
{PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb},
{PWM_OUTPUT_DISABLED, NULL},
{PWM_OUTPUT_DISABLED, NULL},
{PWM_OUTPUT_DISABLED, NULL}
},
0,
0
};
static THD_WORKING_AREA(waThd1, 512);
static THD_FUNCTION(Thd1, arg) {
(void) arg;
chRegSetThreadName("user");
while(TRUE) {
//
if(palReadPad(GPIOC, GPIOC_BUTTON)) {
chThdSleepMilliseconds(50);
//
if(!palReadPad(GPIOC, GPIOC_BUTTON)) {
//
button_pressed = TRUE;
}
}
chThdSleepMilliseconds(1);
}
}
static THD_WORKING_AREA(waThd2, 512);
static THD_FUNCTION(Thd2, arg) {
unsigned ii;
(void) arg;
chRegSetThreadName("Led");
pwmStart(&PWMD1, &pwmcfg);
if(button_pressed) {
for (ii = 0.01; ii <10 ; ii+0.1) {
while(TRUE) {
value = ii * 10000;
if(value< 100){
value= 0;
pwmDisableChannel(&PWMD1, 0);
palClearPad(GPIOA, GPIOA_LED_GREEN);
}
else if(value> 9900){
value = 10000;
pwmDisableChannel(&PWMD1, 0);
palSetPad(GPIOA, GPIOA_LED_GREEN);
}
else{
pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1,value));
pwmEnableChannelNotification(&PWMD1, 0);
pwmEnablePeriodicNotification(&PWMD1);
}
chThdSleepMilliseconds(1);
}
}
}
}
int main(void) {
halInit();
chSysInit();
//
palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
//
sdStart(&SD2, NULL);
chThdCreateStatic(waThd1, sizeof(waThd1), NORMALPRIO + 1, Thd1, NULL);
chThdCreateStatic(waThd2, sizeof(waThd2), NORMALPRIO - 1, Thd2, NULL);
while (TRUE) {
chThdSleepMilliseconds(500);
}
}
The code doesn't work, I hope someone can help me.
Thank you.