Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ATmega328p-在';挥发性';_C_Arduino_Embedded_Avr_Atmega32 - Fatal编程技术网

C ATmega328p-在';挥发性';

C ATmega328p-在';挥发性';,c,arduino,embedded,avr,atmega32,C,Arduino,Embedded,Avr,Atmega32,我正在为我的ATmega328p开发一个OTA更新的自定义引导加载程序。我从Arduino的Optiboot引导加载程序代码中获得帮助,对于USART部分,我编写了一个自定义头文件,用于处理USART通信部分。下面是代码(基本上检查代码以测试逻辑)- bootuart.h #ifndef _BOOT_UART_H #define _BOOT_UART_H #include <avr/io.h> #if (SOFT_UART == 0) #if (UART == 0)

我正在为我的ATmega328p开发一个OTA更新的自定义引导加载程序。我从Arduino的Optiboot引导加载程序代码中获得帮助,对于USART部分,我编写了一个自定义头文件,用于处理USART通信部分。下面是代码(基本上检查代码以测试逻辑)-

bootuart.h

#ifndef _BOOT_UART_H
    #define _BOOT_UART_H
#include <avr/io.h>

#if (SOFT_UART == 0)
  #if (UART == 0)
    #if defined(UDR0)
      #define UART_SRA UCSR0A
      #define UART_SRB UCSR0B
      #define UART_SRC UCSR0C
      #define UART_SRL UBRR0L
      #define UART_UDR UDR0
    #elif defined(UDR)
      #define UART_SRA UCSRA
      #define UART_SRB UCSRB
      #define UART_SRC UCSRC
      #define UART_SRL UBRRL
      #define UART_UDR UDR
    #elif defined(LINDAT)
      #error UART == 0, but no LINDAT support in prog
    #else
      #error UART == 0, but no UART0 on device
    #endif
  #elif (UART == 1)
    #if !defined(UDR1)
      #error UART == 1, but no UART1 on device
    #endif
    #define UART_SRA UCSR1A
    #define UART_SRB UCSR1B
    #define UART_SRC UCSR1C
    #define UART_SRL UBRR1L
    #define UART_UDR UDR1
  #elif (UART == 2)
    #if !defined(UDR2)
      #error UART == 2, but no UART2 on device
    #endif
    #define UART_SRA UCSR2A
    #define UART_SRB UCSR2B
    #define UART_SRC UCSR2C
    #define UART_SRL UBRR2L
    #define UART_UDR UDR2
  #elif (UART == 3)
    #if !defined(UDR3)
      #error UART == 3, but no UART3 on device
    #endif
    #define UART_SRA UCSR3A
    #define UART_SRB UCSR3B
    #define UART_SRC UCSR3C
    #define UART_SRL UBRR3L
    #define UART_UDR UDR3
  #endif
#endif

#ifdef __cplusplus
extern "C" {
#endif
    void writeUSART(uint8_t);
#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
extern "C" {
#endif
    uint8_t readUSART(void);
#ifdef __cplusplus
}
#endif

#endif
我已经检查了很多关于这个问题的其他链接,但是没有一个有用。对于StackOverflow中的1个问题,根据答案,我检查了我的#define是否与代码中包含的libs文件中的任何其他标识符都不匹配。但问题依然存在

附言:我甚至尝试过将#define identifiers名称更改为其他标识符名称,但都没有成功。此外,我还尝试了ATMEL studio的代码。没有好处

有人能指出我的代码有什么问题吗?因为如果它在Optiboot中工作,那么它在这里也应该工作,这就是我的感觉。

任何帮助都将不胜感激。提前感谢。

更换一些(不是全部)后,您将获得以下信息:

#if !defined(SOFTUART)
    #define SOFTUART 0
#endif
#if !defined(UART)
    #define UART 0
#endif
#if !defined(SINGLESPEED)
    #define SINGLESPEED 0
#endif

#include <avr/io.h>
#include "bootuart.h"


UART_SRA = _BV(U2X0); //Double speed mode USART0
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
UART_SRL = (uint8_t)BAUD_SETTING;

int main(void)
{ 
  while(1){
   writeUSART(readUSART());
  }
  return 0;
}
#如果!已定义(软UART)
#定义软UART 0
#恩迪夫
#如果!已定义(UART)
#定义UART 0
#恩迪夫
#如果!已定义(单速)
#定义单速0
#恩迪夫
#包括
#包括“bootuart.h”
UART_SRA=_BV(U2X0)//双速模式USART0
UART_SRB=_BV(RXEN0)| u BV(TXEN0);
UART_SRC=_BV(UCSZ00)| u BV(UCSZ01);
UART_SRL=(uint8_t)波特率设置;
内部主(空)
{ 
而(1){
writeUSART(readUSART());
}
返回0;
}
您可能知道,除了函数之外,您不能做任何事情。您必须将其放入主块,或使其成为在主函数中调用的设置函数:

void setup() {

    #if (SOFTUART == 0)
        #if defined(__AVR_ATmega8__) || defined (__AVR_ATmega8515__) || \
            defined (__AVR_ATmega8535__) || defined (__AVR_ATmega16__) ||   \
            defined (__AVR_ATmega32__)
            #if (SINGLESPEED == 0)
                UCSRA = _BV(U2X); //Double speed mode USART
            #endif //singlespeed
            UCSRB = _BV(RXEN) | _BV(TXEN);  // enable Rx & Tx
            UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);  // config USART; 8N1
            UBRRL = (uint8_t)BAUD_SETTING;
        #else // mega8/etc
            #ifdef LINUART
                //DDRB|=3;
                LINCR = (1 << LSWRES); 
                //LINBRRL = (((F_CPU * 10L / 32L / BAUD_RATE) + 5L) / 10L) - 1; 
                LINBRRL=(uint8_t)BAUD_SETTING;
                LINBTR = (1 << LDISR) | (8 << LBT0); 
                LINCR = _BV(LENA) | _BV(LCMD2) | _BV(LCMD1) | _BV(LCMD0); 
                LINDAT=0;
            #else
                #if (SINGLESPEED == 0)
                    UART_SRA = _BV(U2X0); //Double speed mode USART0
                #endif
                UART_SRB = _BV(RXEN0) | _BV(TXEN0);
                UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
                UART_SRL = (uint8_t)BAUD_SETTING;
            #endif // LINUART
        #endif // mega8/etc
    #endif // softUART

} // setup()

int main() {
  setup();
  while (1) {


  } // while
} // main()
void setup(){
#如果(软uart==0)
#如果已定义(uu AVR_ATmega8_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuumega8_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\
已定义(uu AVR_ATmega8535_uuuuuu)|已定义(u AVR_ATmega16_uuuuuu)|\
已定义(_AVR_ATmega32__;)
#如果(单速==0)
UCSRA=_BV(U2X);//双速模式USART
#endif//singlespeed
UCSRB=_BV(RXEN)|_BV(TXEN);//启用接收和发送
UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);//配置USART;8N1
UBRRL=(uint8)波特率设置;
#else//mega8/等
#ifdef LINUART
//DDRB |=3;

LINCR=(1您需要使用-E选项编译它,并查看宏是如何展开的。感谢您的建议。它确实有效。但是您能告诉我为什么我们不能在外部(全局)进行初始化吗我们必须确保它是在主函数调用的函数中。任何引用链接都是有用的。现在我意识到,我已经做了很多年了,但是以前从来没有知道过这样的规则。嗯,因为IO文件是C++,你可以用构造函数创建一个类,并用这个对象的全局实例创建。它将在main启动之前在init部分调用构造函数。根据,也可以在C中调用构造函数-但我从未测试过这一点。但它从来都不是在函数之外执行代码。
bootuart.h:8:24: error: expected unqualified-id before 'volatile'

       #define UART_SRA UCSR0A

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:82:5: note: in expansion of macro 'UART_SRA'

     UART_SRA = _BV(U2X0); //Double speed mode USART0

     ^~~~~~~~

bootuart.h:8:24: error: expected ')' before 'volatile'

       #define UART_SRA UCSR0A

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:82:5: note: in expansion of macro 'UART_SRA'

     UART_SRA = _BV(U2X0); //Double speed mode USART0

     ^~~~~~~~

bootuart.h:8:24: error: expected ')' before 'volatile'

       #define UART_SRA UCSR0A

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:82:5: note: in expansion of macro 'UART_SRA'

     UART_SRA = _BV(U2X0); //Double speed mode USART0

     ^~~~~~~~

bootuart.h:9:24: error: expected unqualified-id before 'volatile'

       #define UART_SRB UCSR0B

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:84:4: note: in expansion of macro 'UART_SRB'

    UART_SRB = _BV(RXEN0) | _BV(TXEN0);

    ^~~~~~~~

bootuart.h:9:24: error: expected ')' before 'volatile'

       #define UART_SRB UCSR0B

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:84:4: note: in expansion of macro 'UART_SRB'

    UART_SRB = _BV(RXEN0) | _BV(TXEN0);

    ^~~~~~~~

bootuart.h:9:24: error: expected ')' before 'volatile'

       #define UART_SRB UCSR0B

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:84:4: note: in expansion of macro 'UART_SRB'

    UART_SRB = _BV(RXEN0) | _BV(TXEN0);

    ^~~~~~~~

bootuart.h:10:24: error: expected unqualified-id before 'volatile'

       #define UART_SRC UCSR0C

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:85:4: note: in expansion of macro 'UART_SRC'

    UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);

    ^~~~~~~~

bootuart.h:10:24: error: expected ')' before 'volatile'

       #define UART_SRC UCSR0C

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:85:4: note: in expansion of macro 'UART_SRC'

    UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);

    ^~~~~~~~

bootuart.h:10:24: error: expected ')' before 'volatile'

       #define UART_SRC UCSR0C

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:85:4: note: in expansion of macro 'UART_SRC'

    UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);

    ^~~~~~~~

bootuart.h:11:24: error: expected unqualified-id before 'volatile'

       #define UART_SRL UBRR0L

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:86:4: note: in expansion of macro 'UART_SRL'

    UART_SRL = (uint8_t)BAUD_SETTING;

    ^~~~~~~~

bootuart.h:11:24: error: expected ')' before 'volatile'

       #define UART_SRL UBRR0L

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:86:4: note: in expansion of macro 'UART_SRL'

    UART_SRL = (uint8_t)BAUD_SETTING;

    ^~~~~~~~

bootuart.h:11:24: error: expected ')' before 'volatile'

       #define UART_SRL UBRR0L

                        ^

E:\SPIDER\OTA_Programming_Module\Misc\check\check.ino:86:4: note: in expansion of macro 'UART_SRL'

    UART_SRL = (uint8_t)BAUD_SETTING;

    ^~~~~~~~

exit status 1
expected unqualified-id before 'volatile'
#if !defined(SOFTUART)
    #define SOFTUART 0
#endif
#if !defined(UART)
    #define UART 0
#endif
#if !defined(SINGLESPEED)
    #define SINGLESPEED 0
#endif

#include <avr/io.h>
#include "bootuart.h"


UART_SRA = _BV(U2X0); //Double speed mode USART0
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
UART_SRL = (uint8_t)BAUD_SETTING;

int main(void)
{ 
  while(1){
   writeUSART(readUSART());
  }
  return 0;
}
void setup() {

    #if (SOFTUART == 0)
        #if defined(__AVR_ATmega8__) || defined (__AVR_ATmega8515__) || \
            defined (__AVR_ATmega8535__) || defined (__AVR_ATmega16__) ||   \
            defined (__AVR_ATmega32__)
            #if (SINGLESPEED == 0)
                UCSRA = _BV(U2X); //Double speed mode USART
            #endif //singlespeed
            UCSRB = _BV(RXEN) | _BV(TXEN);  // enable Rx & Tx
            UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);  // config USART; 8N1
            UBRRL = (uint8_t)BAUD_SETTING;
        #else // mega8/etc
            #ifdef LINUART
                //DDRB|=3;
                LINCR = (1 << LSWRES); 
                //LINBRRL = (((F_CPU * 10L / 32L / BAUD_RATE) + 5L) / 10L) - 1; 
                LINBRRL=(uint8_t)BAUD_SETTING;
                LINBTR = (1 << LDISR) | (8 << LBT0); 
                LINCR = _BV(LENA) | _BV(LCMD2) | _BV(LCMD1) | _BV(LCMD0); 
                LINDAT=0;
            #else
                #if (SINGLESPEED == 0)
                    UART_SRA = _BV(U2X0); //Double speed mode USART0
                #endif
                UART_SRB = _BV(RXEN0) | _BV(TXEN0);
                UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
                UART_SRL = (uint8_t)BAUD_SETTING;
            #endif // LINUART
        #endif // mega8/etc
    #endif // softUART

} // setup()

int main() {
  setup();
  while (1) {


  } // while
} // main()