错误消息:找不到外围位置的引脚映射:Nucleo-F429ZI 上的 0x8009B0B
Error Message: pinmap not found for peripheral Location: 0x8009B0B on Nucleo-F429ZI
当我将它加载到我的电路板上时,我得到一个 pinmap not found for peripheral 错误。
我对这个问题做了一些研究 (One of the pages I visited),我想我理解了这个问题,
然而,我使用的引脚完全支持我要求他们做的事情。这个问题只是在我将我的代码从面向过程的代码转换为面向对象的代码之后才出现(我需要这样做才能正确地实现调度)。
我觉得这与我如何在构造函数成员初始化列表中初始化它们有关,因为我不完全理解它是如何工作的(我对 C++ 还很陌生)。
我的程序还有其他 classes,但是它们遵循与我的 UpdateOutput class.
相同的结构
提前感谢您的任何建议。
int main() {
printf("inside main");
DigitalOut led1(LED1);
AnalogOut Vout(A0);
UpdateOutput wave;
SensorData inputs;
Timer time;
enum waves {OFF = 0, SINE, TRIANGLE, SAW, SQUARE};
int waveType = OFF;
float sonarCorrection = inputs.calibrateSonar();//makes a measurement of the acatual run time of the sonar code
float topFrequency = 1047.0f; //the highest frequency the synth will play
float upperSonarThreshold = 1000.0f; //the furthest distance the sonar will register
float lowerSonarThreshold = 100.0f; //the closest distance the sonar will measure
float period = 2272.73f;
//replace with:
//float period = inputs.getFrequency(float lowerThreshold, float upperThreshold, int correction, float topFrequency);
//after bug fixes have been applied
led1 = 1; //turn on led1 to show code is running properly
time.reset();
time.start();
int tmr = time.read_us();
//test loop before thredding is applied
while(true)
{
waveType = SINE; //keep synth producing a sine wave for testing
tmr = time.read_us();
switch(waveType)
{
case OFF:
Vout = 0.0f;
break;
case SINE:
Vout = wave.sinWave(tmr , period);
break;
case TRIANGLE:
Vout = wave.triangleWave(tmr , period);
break;
case SAW:
Vout = wave.sawWave(tmr, period);
break;
case SQUARE:
Vout = wave.squareWave(tmr, period);
break;
default:
waveType = TRIANGLE;
break;
}//end of wave type switch case
}
}
更新输出 class:
class UpdateOutput{
public:
//constructor for class, with member initializer list
UpdateOutput(): runLed(LED2), clipLed(LED3), dac(D13)
{}
float sinWave(int tmr, float period);
float sawWave(int tmr, float period);
float triangleWave(int tmr, float period);
float squareWave(int tmr, float period);
private:
//class attributes
DigitalOut runLed;
DigitalOut clipLed;
AnalogOut dac;
//extern float frequency(float lowerThreshold, float upperThreshold, int correction);
bool waveState = 0;
//float lastVout;
};
UpdateOutputs 中的函数示例 class
float UpdateOutput::squareWave(int tmr, float period){
float Vout = 0.0f;
//float period5 = period/1.587401052;
float resultingWave;
float x = (float)(tmr % (int)period)/period;
if (x > 0.5f){
resultingWave = 1.0f;
}
else{
Vout = 0.0f;
}
Vout = (resultingWave/WAVE_DEVIDOR)+(0.25f); //translate wave to work between 0 and 1 rather than -1 and 1
if (Vout > 1){
clipLed = 1;
Vout = 1.0f;
}
else if (Vout < 0.0f){
clipLed = 1;
Vout = 0.0f;
}
//printf("Vout = %5.3f\n\r", Vout);
return Vout;
}//end of squareWave
您正在使用 AnalogOut Vout(A0);
作为 main()
中的 DAC 输出。也许您打算直接在 class>
中更新 UpdateOutput::dac
A0
在 PinNames.h while PeripheralPinMaps.h 中分配 PA_3
有:
//*** DAC ***
MSTD_CONSTEXPR_OBJ_11 PinMap PinMap_DAC[] = {
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2
{NC, NC, 0}
};
所以是AnalogOut Vout(A0);
是无效的。 D13
分配给 UpdateOutput::dac
并且它是 PA_5
的别名但是是正确的。
您可以将 AnalogOut Vout(A0)
更改为 AnalogOut Vout(D13);
,但我怀疑您正在或打算更新波形发生器函数本身的 UpdateOutput::dac
,而不是分配它们的 [=34] =]值。
当我将它加载到我的电路板上时,我得到一个 pinmap not found for peripheral 错误。 我对这个问题做了一些研究 (One of the pages I visited),我想我理解了这个问题, 然而,我使用的引脚完全支持我要求他们做的事情。这个问题只是在我将我的代码从面向过程的代码转换为面向对象的代码之后才出现(我需要这样做才能正确地实现调度)。
我觉得这与我如何在构造函数成员初始化列表中初始化它们有关,因为我不完全理解它是如何工作的(我对 C++ 还很陌生)。
我的程序还有其他 classes,但是它们遵循与我的 UpdateOutput class.
相同的结构提前感谢您的任何建议。
int main() {
printf("inside main");
DigitalOut led1(LED1);
AnalogOut Vout(A0);
UpdateOutput wave;
SensorData inputs;
Timer time;
enum waves {OFF = 0, SINE, TRIANGLE, SAW, SQUARE};
int waveType = OFF;
float sonarCorrection = inputs.calibrateSonar();//makes a measurement of the acatual run time of the sonar code
float topFrequency = 1047.0f; //the highest frequency the synth will play
float upperSonarThreshold = 1000.0f; //the furthest distance the sonar will register
float lowerSonarThreshold = 100.0f; //the closest distance the sonar will measure
float period = 2272.73f;
//replace with:
//float period = inputs.getFrequency(float lowerThreshold, float upperThreshold, int correction, float topFrequency);
//after bug fixes have been applied
led1 = 1; //turn on led1 to show code is running properly
time.reset();
time.start();
int tmr = time.read_us();
//test loop before thredding is applied
while(true)
{
waveType = SINE; //keep synth producing a sine wave for testing
tmr = time.read_us();
switch(waveType)
{
case OFF:
Vout = 0.0f;
break;
case SINE:
Vout = wave.sinWave(tmr , period);
break;
case TRIANGLE:
Vout = wave.triangleWave(tmr , period);
break;
case SAW:
Vout = wave.sawWave(tmr, period);
break;
case SQUARE:
Vout = wave.squareWave(tmr, period);
break;
default:
waveType = TRIANGLE;
break;
}//end of wave type switch case
}
}
更新输出 class:
class UpdateOutput{
public:
//constructor for class, with member initializer list
UpdateOutput(): runLed(LED2), clipLed(LED3), dac(D13)
{}
float sinWave(int tmr, float period);
float sawWave(int tmr, float period);
float triangleWave(int tmr, float period);
float squareWave(int tmr, float period);
private:
//class attributes
DigitalOut runLed;
DigitalOut clipLed;
AnalogOut dac;
//extern float frequency(float lowerThreshold, float upperThreshold, int correction);
bool waveState = 0;
//float lastVout;
};
UpdateOutputs 中的函数示例 class
float UpdateOutput::squareWave(int tmr, float period){
float Vout = 0.0f;
//float period5 = period/1.587401052;
float resultingWave;
float x = (float)(tmr % (int)period)/period;
if (x > 0.5f){
resultingWave = 1.0f;
}
else{
Vout = 0.0f;
}
Vout = (resultingWave/WAVE_DEVIDOR)+(0.25f); //translate wave to work between 0 and 1 rather than -1 and 1
if (Vout > 1){
clipLed = 1;
Vout = 1.0f;
}
else if (Vout < 0.0f){
clipLed = 1;
Vout = 0.0f;
}
//printf("Vout = %5.3f\n\r", Vout);
return Vout;
}//end of squareWave
您正在使用 AnalogOut Vout(A0);
作为 main()
中的 DAC 输出。也许您打算直接在 class>
UpdateOutput::dac
A0
在 PinNames.h while PeripheralPinMaps.h 中分配 PA_3
有:
//*** DAC *** MSTD_CONSTEXPR_OBJ_11 PinMap PinMap_DAC[] = { {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 {NC, NC, 0} };
所以是AnalogOut Vout(A0);
是无效的。 D13
分配给 UpdateOutput::dac
并且它是 PA_5
的别名但是是正确的。
您可以将 AnalogOut Vout(A0)
更改为 AnalogOut Vout(D13);
,但我怀疑您正在或打算更新波形发生器函数本身的 UpdateOutput::dac
,而不是分配它们的 [=34] =]值。