Ik will een class maken voor software pwm maar loop tegen een tweetal problemen aan. Wanneer ik de vector stl gebruik dan geeft de compiler direct een memory error. Ik dacht eerst dan er iets anders aan de hand was maar als ik de code compileer met gcc op een linux box dan is het resultaat 78kb groot. De geplande STM32 heeft maar 64k flash beschikbaar. Ik zoek dus een andere opslag methode die klein en van variabele grootte is, ipv. een vector of fixed size array.
Het tweede probleem, ik kan geen lijst van poorten meegeven aan de constructor van de class, zo dus:
c code:
class SoftPWM pwm( { PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9 } );
Heb ik dat verkeerd gecodeerd of is dit gewoon niet mogelijk?
Het werkt wel als ik het in meerdere stappen doe:
c code:
uint8_t PWM_ports[] = { PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9 };
class SoftPWM pwm( PWM_ports );
Hieronder de nog lang niet complete code, slechts een eerste aanzet om wat dingen te testen.
c code:
#include <cstdint>
//#include <vector>
#define MAX_PORTS 32
class SoftPWM {
public:
SoftPWM( uint8_t *PWM_ports );
void AddPort( uint8_t PWM_port );
private:
int iPortCount=0;
//vector<uint8_t> PWM_ports;
uint8_t PWM_ports[MAX_PORTS];
//vector<uint32_t> PWM_dutycycle;
uint32_t PWM_dutycycle[MAX_PORTS];
};
SoftPWM::SoftPWM( uint8_t *PWM_ports ) {
for( int i=0; i<sizeof(PWM_ports); i++ ) {
AddPort( PWM_ports[i] );
}
}
void SoftPWM::AddPort( uint8_t PWM_port ) {
//PWM_ports.push_back(PWM_port);
PWM_ports[iPortCount] = PWM_port;
PWM_dutycycle[iPortCount] = 0;
pinMode(PWM_port, OUTPUT);
iPortCount++;
}
void setup() {
//class SoftPWM pwm( { PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9 } );
uint8_t PWM_ports[] = { PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9 };
class SoftPWM pwm( PWM_ports );
pwm.AddPort( PA0 );
}
void loop() {
}
[Bericht gewijzigd door Henry S. op vrijdag 27 september 2019 00:10:22 (0%)