ClassName и ClassInstance не были объявлены в этой области

Я пытаюсь запрограммировать Atmel SAM D21 микроконтроллер с использованием C ++ в Атмел Студио. Я пытаюсь создавать периодические аппаратные прерывания, используя один из встроенных таймеров.

я создал Timer4 класс для установки таймера из main.cpp, Я пытался создать Timer4 экземпляр называется MyTimer4 в основной функции, но это говорит

'Timer4' was not declared in this scope
'MyTimer4' was not declared in this scope

Я видел много подобных обсуждений, указывающих на неправильный / циркулярный #includes. Но, похоже, я не вижу той же самой проблемы самостоятельно. Есть идеи?


main.cpp

#include "timerSAMD21.h"#include "sam.h"
void SampleADC(void)
{

}

int main(void)
{
SystemInit();

Timer4 MyTimer4;

MyTimer4.setRate(1000);
MyTimer4.onEvent(SampleADC);
MyTimer4.start;
}

timerSAMD21.h

#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H

#include "tc.h"#include "tc4.h"#include "gclk.h"
typedef void (*voidFuncPtr)(void);

class Timer4
{

public:

Timer4() {};
void setRate(int frequency);
void start(void);
void end(void);
void onEvent(voidFuncPtr funcOnEvent);

private:

void configure(int frequency);
void enable(void);
void disable(void);
void reset(void);
};

#endif

timerSAMD21.cpp

#include "timerSAMD21.h"
voidFuncPtr callback = NULL;

void Timer4::setRate(int frequency) {
configure(frequency);
}

void Timer4::start(void) {
enable();
}

void Timer4::end(void) {
disable();
reset();
}

void Timer4::configure(int frequency) {
//Configuration code here. Removed for Stack Overflow.
}

void Timer4::enable(void){
REG_TC4_CTRLA |= TC_CTRLA_ENABLE;  //Enable timer
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}

void Timer4::disable(void) {
REG_TC4_CTRLA &= ~TC_CTRLA_ENABLE;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}

void Timer4::reset(void) {
REG_TC4_CTRLA = TC_CTRLA_SWRST;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
while (TC4->COUNT8.CTRLA.bit.SWRST);

}

void Timer4::onEvent(voidFuncPtr funcOnEvent){
callback = funcOnEvent;
}

#ifdef __cplusplus
extern "C" {
#endif

void IRQHandlerTimer4(void) {
if (callback != NULL)
{
callback();
}

REG_TC4_INTFLAG = TC_INTFLAG_MC0;
}

#ifdef __cplusplus
}
#endif

1

Решение

(Примечание: сделать ответ, чтобы вычеркнуть его из списка оставшихся без ответа вопросов. Майлз, похоже, решил не отвечать, и я не считаю эту проблему опечаткой.)

Способ, которым вы пытаетесь предотвратить повторное включение вашего заголовка, заключается в том, что он делает содержимое заголовка видимым только в том случае, если сторожевой макрос уже определен, что, конечно, никогда не происходит.

Чтобы это исправить, измените

#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H

в

#ifndef TIMERSAMD21_H
#define TIMERSAMD21_H

Сначала содержимое заголовка будет отображаться при первом включении.
Затем он определит защитный макрос, который предотвратит повторную компиляцию содержимого заголовка в том же модуле перевода, то есть в кодовом файле.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector