블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

공지사항

최근에 올라온 글

gcc 컴파일러로 프로그램 작성하는 중에,
리스트파일을 확인해보니,
함수가 여기저기 조각 조각 널려있는게 아닌가?
원래 있어야할 위치에 없고, 말그대로, 조각 조각 널려져 있었다.
-O3 옵션을 주었다.
예)
void func1(int a)
{
    ...
void func1(int a)  <<---똑같은 함수명(코드는 다름. 호출변수등에 따라 달라지는듯)
{
    ...
void func2()
{
    ...
}
    ...


결론
===========
최적화 옵션을 주면, inline 표시를 안해도, 컴파일러가, 함수를 적당한 위치에,
함수를 용도에 맞게 조각 조각 내서(또는 통째로), 끼워넣어준다.
이는 함수 호출과 리턴할때 필요한 코드를 없애, 속도를 빠르게하고, 코드사이즈를 작게하는 효과가 있다.
최적화 옵션을 주어 컴파일한다면, 굳이 inline 표시를 안해도 될듯 싶다.
(그러나, inline 옵션을 주면, inline이 꼭 필요한 함수는 거의 대부분(?) inline 적용해줄것이다.)

Posted by 안녕1999
, |

'i'는 'include'의 약자인듯함.
prefix는 '접두어', '미리 준비된' 등으로 해석하면 될듯함.
-iprefix 옵션은 include 디렉토리를 설정하는듯 함.


https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

 -iprefix prefix

Specify prefix as the prefix for subsequent -iwithprefix options. If the prefix represents a directory, you should include the final ‘/’. 

gcc 폴터에 있는 lib 폴더를 삭제하니, 컴파일 오류가 남.


arm-none-eabi-gcc: error: CreateProcess: No such file or directory

-iprefix XXXXXXXX\bin\../lib/gcc/arm-none-eabi/2.1.2/
-isysroot XXXXXXXX\bin\../arm-none-eabi


Posted by 안녕1999
, |

ARM mcu 관련 소스를 WIN32에서 돌릴 수 있도록, 크로스컴파일 작업중에 다음의 에러 발생

stdint-gcc.h(60) : error C2061: syntax error : identifier 'int_least8_t'


/* 7.8.1.2 Minimum-width integer types */


typedef __INT_LEAST8_TYPE__ int_least8_t;

typedef __INT_LEAST16_TYPE__ int_least16_t;

typedef __INT_LEAST32_TYPE__ int_least32_t;

typedef __INT_LEAST64_TYPE__ int_least64_t;

typedef __UINT_LEAST8_TYPE__ uint_least8_t;

typedef __UINT_LEAST16_TYPE__ uint_least16_t;

typedef __UINT_LEAST32_TYPE__ uint_least32_t;

typedef __UINT_LEAST64_TYPE__ uint_least64_t;


/* 7.8.1.3 Fastest minimum-width integer types */


typedef __INT_FAST8_TYPE__ int_fast8_t;

typedef __INT_FAST16_TYPE__ int_fast16_t;

typedef __INT_FAST32_TYPE__ int_fast32_t;

typedef __INT_FAST64_TYPE__ int_fast64_t;

typedef __UINT_FAST8_TYPE__ uint_fast8_t;

typedef __UINT_FAST16_TYPE__ uint_fast16_t;

typedef __UINT_FAST32_TYPE__ uint_fast32_t;

typedef __UINT_FAST64_TYPE__ uint_fast64_t;


2가지 종류의 typedef 이 있다.

추측 : 컴파일 옵션중에, 속도최적화, 코드사이즈 최적화 등의 옵션에 따라, 형을 달리 선언할듯 싶다.


윗쪽에 아래 항목 추가

#ifdef WIN32

typedef char __INT_LEAST8_TYPE__;

typedef short __INT_LEAST16_TYPE__;

typedef long __INT_LEAST32_TYPE__;

typedef __int64 __INT_LEAST64_TYPE__;

typedef unsigned char __UINT_LEAST8_TYPE__;

typedef unsigned short __UINT_LEAST16_TYPE__;

typedef unsigned long __UINT_LEAST32_TYPE__;

typedef unsigned __int64 __UINT_LEAST64_TYPE__;


typedef char __INT_FAST8_TYPE__;

typedef short __INT_FAST16_TYPE__;

typedef long __INT_FAST32_TYPE__;

typedef __int64 __INT_FAST64_TYPE__;

typedef unsigned char __UINT_FAST8_TYPE__;

typedef unsigned short __UINT_FAST16_TYPE__;

typedef unsigned long __UINT_FAST32_TYPE__;

typedef unsigned __int64 __UINT_FAST64_TYPE__;


typedef long __INTMAX_TYPE__;

typedef unsigned long __UINTMAX_TYPE__;


#ifndef int32_t

#define int32_t long

#endif

#ifndef uint32_t

#define uint32_t unsigned long

#endif

#endif

Posted by 안녕1999
, |

디버그모드에서 ASM코드를 보니, 3번째 코드가 가장 간결하다.
물론, 릴리즈모드에서는 어떻게 바뀔지 알 수 없다.


msg[4]=p[i];//1

msg[5]=p[i+1];//2

msg[6]=p[i+2];//3

msg[7]=p[i+3];//4

msg[8]=p[i+4];//5

msg[9]=p[i+5];//6


  msg[4]=*p;p++;//1

msg[5]=*p;p++;//2

msg[6]=*p;p++;//3

msg[7]=*p;p++;//4

msg[8]=*p;p++;//5

msg[9]=*p;p++;//6


  msg[4]=p[0];//1

msg[5]=p[1];//2

msg[6]=p[2];//3

msg[7]=p[3];//4

msg[8]=p[4];//5

msg[9]=p[5];p+=6;//6


Posted by 안녕1999
, |

ARM Cortex-Bit-banding

C언어,ARM / 2016. 12. 5. 23:30

주의:본문은 검증되지 않았습니다.


비트-밴딩(Bit-banding)

---------------------------------------------------------

- 메모리를 절약하기위해, BOOL같은 변수는 1비트만 사용할 수 있게 해주는 방식.

- C컴파일러의 bool, BOOL등은 int형등으로 컴파일이 된다.

- 1비트변수를 사용하려면, 아래 주소를 액세스해야한다.

  #define문을 사용하여 변수를 할당해야함을 의미한다.



실질적으로는 아래 그림과 같이 구성된다.

32비트 주소를 액세스하면, 1비트만 해당된다.


데이터쉬트등의 pdf문서에서는 아래와 같이 복잡한 수식(?)을 늘어 놓는다.

bit_word_offset = (byte_offset x 32) + (bit_number x 4) 

bit_word_addr = bit_band_base + bit_word_offset 


Bit-banding 메모리는 1Mbyte나 사용할 수 있으나, 실제로는 얼마되지 않는다.

내가 사용하는 칩은 얼마나 사용할 수 있을까?

STM32F205RCT6TR칩을 예로들어보면, 100k의 RAM을 가지고있다.

사실상 모든 RAM영역을 bit-banding하여 사용할 수 있음을 의미한다.


C언어로 변수할당하여 사용하는 변수와, C언어로 변수할당이 되었는지, 안되었는지 알 수 없는 RAM을 무작적, 직접 액세스할 수는 없다.

그래서, C언어로 bit-banding할 변수를 할당해놓고, 위의 복잡한(?)공식을 통해, RAM을 직접 액세스하면,

1비트단위로 액세스가 가능하다는 이야기이다.


C언어에서도 구조체(struct)로 1비트단위 액세스가 쉽게 된다.(struct bit field)

그러나, 이방식은 8~32비트에서 n비트만을 추출/삽입하는 코드가 들어간다.

그래서 비트필드 변수를 읽고, 쓰는작업은 느리다.

그러나, bit-banding을 사용하면, C언어의 비트필드보다 훨씬 더 빠르다는것이다.

(약 2~4배정도 빠를것으로 예상)


일단 비트밴딩할 변수를 할당하고, 해당 변수의 각 비트를 주소를 정해주어야 한다.

예) 아래는 예시이므로, 직접 확인해보기 바랍니다.

byte a;

#define RAM_START_ADDR    0x20000000

#define BIT_BANDING_START_ADDR    0x22000000

#define RAM_BIT_BANDING_GAP    (BIT_BANDING_START_ADDR-RAM_START_ADDR)

#define a0    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+0))

#define a1    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+1))

#define a2    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+2))

...

#define a7    (*(RAM_BIT_BANDING_GAP+((&a)-RAM_START_ADDR)*8+7))


a=0;

a1=1;

if(a==0x02)

{

printf("OK");

}

else

{

printf("err");

}



문제점

---------------------------

- 크로스컴파일이 안된다?

  가능은 하다. 단, 실제변수 영역보다 8배 더 많은 영역을 비트-밴딩 영역으로 할당해야한다.

  또한, 일반변수 액세스와, 비트밴딩 변수 영역이 다르므로, 2가지 방식으로 액세스가 불가능하다.

  물론, 비트밴딩 함수/매크로를 만들어주면 되긴하다.

  그러나, 그렇게되면, 모든 변수의 대입에 함수를 사용해야하고,

  소스 코드가 너무 커지고, 복잡해지는 문제(?)가 발생한다.


cbi,sbi,gbi등을 이용한다면?

---------------------------------------------------------------------------

- cbi등의 매크로를 개조하여, 해당주소-비트의 bit-banding주소를 얻어서, 액세스하면, 쉽게 사용가능하다.

  또한 실제 동작코드도 작아지고(?), 속도도 매우 빨라지게 된다.

- 레지스터에는 적용할 수 없어, 속도가 떨어지는 문제가 발생한다.

아래는 예문 코드이므로, 동작하지 않습니다.

#define RAM_START_ADDR 0x20000000

#define BIT_BANDING_START_ADDR 0x22000000

#define BIT_BANDING_GAP (BIT_BANDING_START_ADDR-RAM_START_ADDR)

#define BIT_BAND8(a,i) *((byte*)(&(a)-RAM_START_ADDR+BIT_BANDING_START_ADDR)+(i))


#define sbi(a,i) BIT_BAND8(a,i)=1

#define cbi(a,i) BIT_BAND8(a,i)=0

#define gbi(a,i) BIT_BAND8(a,i) 



주변장치 액세스할때 bit-banding은?

------------------------------------------------------------------------------------------

한번에 원하는 비트를 on/off할 수 있어 좋으나,

한번에 여러비트를 설정해야하는 경우도 많다. 이경우에는 더 느릴 수 도 있다.


결론

----------------------

Bit-banding은 매우 훌륭한 기능이나, 

요즘 ARM Cortex칩들의 RAM이 부족하지는 않다.

과거의 8051이나, ATMega칩에 비해, 몇배나 더 많아졌다.

속도 또한 매우 빨라졌다.

굳이 bit-banding을 사용할 이유가 없다.

1) 메모리(RAM)가 정말 부족하고, 속도가 매우 중요한 경우

2) 속도가 매우 중요한 경우(주변장치 액세스)





가.정의 - 혼자 연구하는 C/C++ by WinApi

soen.kr/lecture/ccpp/cpp1/13-4-1.htm
비트 구조체는 비트들을 멤버로 가지는 구조체이며 비트 필드(bit field)라고도 부른다. 잘 알다시피 비트는 기억의 최소 단위이며 0 또는 1중 하나를 기억한다.

CLIEL LAB :: [C, C++] 비트필드(Bit Field)

lab.cliel.com › Programming › C C++
2010. 4. 27. - struct bitfield{ unsigned char a : 1; unsigned char b : 1; unsigned char c : 1; unsigned char d : 1; unsigned char e : 1; unsigned char f : 1;

C++ 비트 필드 - MSDN - Microsoft

https://msdn.microsoft.com/ko-kr/library/ewwyfdbe.aspx
Visual Studio 2017 RC에 대한 최신 설명서는 Visual Studio 2017 RC 설명서를 참조하세요. 클래스와구조체는 정수 형식보다 작은 저장 공간을 차지하는 멤버를 ...

C 비트 필드 - MSDN - Microsoft

https://msdn.microsoft.com/ko-kr/library/yszfawxh.aspx
구조체 또는 공용 구조체의 멤버에 대한 선언자 이외에, 구조체 선언자는 "비트 필드"라는 지정한 비트 수가 될 수 있습니다. 길이는 필드 이름의 선언자에서 콜론으로 ...

Bit Fields in C

https://www.tutorialspoint.com/.../c_bit_fields.htm
이 페이지 번역하기
Suppose your C program contains a number of TRUE/FALSE variables grouped in a structurecalled status, as follows − struct { unsigned int widthValidated; ...

비트필드 (Bit-field) - 프로그래밍 언어 - 골드피처

goldpitcher.co.kr/pages/viewpage.action?pageId=3715
2007. 11. 6. - 일반적인 구조체에서 구조체 구성요소는 C가 지원하는 데이터 형태로만 나누어지는데 비해 비트필드는 비트 단위로 구성요소를 나눌 수 있기 ...


Posted by 안녕1999
, |

아트멜사는 ATMega128을 비롯하여, 공전의 히트 제품을 출시하여, ARM cortex시리즈가 나오기 몇년전까지만해도,

엄청난 인기를 끌었다.

보통 AVR칩, AVR컴파일러등으로 불렀다.

(비디오 기록장치인 AVR과 관련이 없다.)


EEPROM을 내장하고, 적당한 성능에, 적당한 가격과, 무료컴파일러 지원이라는 시스템으로,

많은 사용자를 만들어냈다.

그당시에는 대부분의 컴파일러는 유료였고, 크렉하여 사용하던 시절이다.


현재의 대세인 ARM cortex시리즈와 비교해보면, AVR칩은 8비트에 16MHz이 저사양(?) cpu이고,

ARM cortex는 32비트에 보통 48MHz이상을 대부분 지원한다.

또한, 가격을 대폭 낮추어, 2016년 현재에는 AVR칩이 더 비싼 경우도 있다.

(수요가 줄어서, 가격이 올라간것도 이유)


어쨌든, 2016년에는 ARM cortex가 대세이다.

많은 칩제조회사들이 ARM코어를 사다가 칩을 제조하며,

이들 칩들은 대부분 호환이 가능하다.


가격

========

ARM coretex는 수많은 제조사들이 경쟁하여, 가격이 매우 낮아졌다.

AVR칩은 수요감소로 인해, 가격이 올라가는 추세이다.



소스코드 호환성

================

 ARM coretex는 소스코드 조금만 손보면, 대부분의 칩에서 동작이 가능하다는 엄청난 메리트가 있다.

소스레벨에서는 어느정도 호환 가능하나, 사실상, 그냥 컴파일되는 경우는 없다.

또한, 32비트 CPU라서, 윈도우환경에서 개발하여, 포팅하는것도, 더욱 쉬워졌다.


AVR컴파일러는 1~2종류라고 봐도 된다.

2가지 컴파일러중 한가지에서 돌아가는 소스코드이다.



컴파일러 비교

==============

AVR컴파일로는 무료이나, ARM cortex 컴파일러는 gcc로 툴체인 구성하지않는한, 대부분 유료이다.

물론, 무료 컴파일러도 있으나, 많이 사용하지 않는다.


AVR컴파일러는 대표적인것이 2가지가 있다.

ARM컴파일러는 칩종류도 많고, 컴파일러 종류도 많다.


ARM은 소스문법에 따른 버그가 적으나,

AVR은 최적화시, 소스코드 작성을 어떻게 하느냐에따라, 알수없는 버그가 많은 편이다.

잘동작하는코드, 한두줄만 수정해도, 엉뚱한 상황이 벌어지는 경우가 생각보다 많다.

그냥 코드를 새로 다시 작성하다보면, 해결되는 경우도 있다.

코드의 순서를 어떻게 하느냐에 따라 문제가 생길 수 도 있고, 아닐 수 도 있다.




칩의 버그

=========

ARM칩은 각 제조사마다, 칩의 버그가 있는 경우가 있다.

아무래도, 초반이니 있을 수 있는 버그이나, 칩의 종류가 많기때문에, 해당버그는 수정되지 않고, 칩이 단종될 가능성도 있다.

예) STM사의 어떤칩은 UART인터럽트가 중간에 꺼져버린다.(호출이 안된다.)


AVR은 칩의 종류가 사실상 많지 않고, 10년넘게 사용되어, 많은 버그가 수정된 상태이다.




다음 프로젝트에 사용할 CPU는?

================================

당연히, ARM coretex이다.

AVR은 알수없는 컴파일러 문제가, 개발자들을 상당히 괴롭힌다.

이번에도 거의 다된 상태에서, 이상하게 동작을 한경우이다.

최적화 옵션을 끄니, 더 황당한 짓을 하기도 했다.

오히려, Os옵션으로 최적화 했을때, 그래도, 비교적 정상적인 동작을 했다.(어이 없음)

(물론, 윈도우에서 크로스컴파일 에뮬레이션까지 다해본 코드이다.)

Posted by 안녕1999
, |

AVR, ARM등의 CPU프로그램을 작성할때,

1) 프로그램 작성

2) 다운로드

3) 테스트

4) 1번 부터, 될때까지 무한 반복.


문제는 다운로드 시간이 1초든, 10초든, 시간이 걸린다는 점입니다.

다운로드가 마우스클릭만으로 되는 경우는 드물고,

CPU 리셋을 하고, 다운로드하는 과정이 적게는 수십초~몇분까지도 걸립니다.

프로그램코드가 크다면, 다운로드 시간은 더 많이 걸립니다.


오타 하나 고치려고, 수정하고, 다운로드하고, 테스트하는 시간이 생각보다 많이 소모됩니다.


그래서, 윈도우환경에서 프로그램코드를 검증하고, 나중에 CPU에 다운로드해서, 테스트해보는 방법이 빠를 수 도 있습니다.

윈도우 환경에서는 많은 메모리와, VC++ 같은 우수한 컴파일러 환경을 사용할 수 있습니다.

문제는 윈도우 환경에서 동작하기위해, 코드를 각각 작성해야 하므로, 약 1.5배 정도의 코드를 작성해야 합니다.


C언어의 장점은 함수만 동일하게 작성하면, 어떤 환경이든, 대부분 동작이 된다는 것입니다.

물론, 하드웨어 환경도 비슷하게 꾸며주어야 합니다.

예) EEPROM_write() => WIN_EEPROM_File_Write()


보통 아래와 같이 매크로를 사용하여, 함수를 각각 만들어 줍니다.

void LCD_putch(byte c)

{

#ifdef WIN32

printf("%c",c);

#else

LCD_send_data(c);

#endif

}


UART통신, EEPROM, LCD, KEY등도 각각 함수를 만들어 줍니다.

물론, 윈도우 환경에서 사용할 함수를 만드는 작업이 쉽지않고, 시간도 많이 걸립니다.

그러나, 잘 많들어 놓으면, CPU에 다운로드하고, 테스트하는 시간이 획기적으로 줄어들어, 전체 개발속도가 향상될 수 있습니다.

Posted by 안녕1999
, |

부트로더 주소설정방법

LinkerScript.ld


SECTIONS

{

  .boot_loader :

  {

    . = ALIGN(4);

    KEEP(*(.boot_loader)) /* Startup code */

    . = 0x4000;

  } >FLASH


   /* The startup code goes first into FLASH */

  .isr_vector :

  {

    . = ALIGN(4);

    KEEP(*(.isr_vector)) /* Startup code */

    . = ALIGN(4);

  } >FLASH





Generate binary file

Generate hex file

main.o  :

section               size         addr

.boot_loader         16384    134217728 <<====0x8000000

.isr_vector            388    134234112 <<====0x8004000

.text                43480    134234500

.ARM.attributes         41            0



부트로더가 없다면, 실행되지 않는다. 부트로더에서 호출해주어야 실행된다.








SECTIONS

{

  .boot_loader :

  {

    . = ALIGN(4);

    KEEP(*(.boot_loader)) /* Startup code */

    . = 0x0000;

  } >FLASH


   /* The startup code goes first into FLASH */

  .isr_vector :

  {

    . = ALIGN(4);

    KEEP(*(.isr_vector)) /* Startup code */

    . = ALIGN(4);

  } >FLASH




Generate binary file

Generate hex file

main.o  :

section               size         addr

.boot_loader             0    134217728 <<===0x8000000

.isr_vector            388    134217728 <<===0x8000000

.text                43480    134218116

.ARM.attributes         41            0

.init_array              8    134261596


Posted by 안녕1999
, |

In-Application Programming (IAP)


부트로더 개념.

PC에서 프로그램을 다운로드 및 실행할 수 있다.



벡터 테이블이 2개인것에 주목.

jump (unconditional branching)명령으로 2번째 프로그램(윗쪽, 사용자 프로그램)을 실행




AN3965 

STM32F40x/STM32F41x in-application programming using the USART


AN4657

STM32 in-application programming (IAP) using the USART 


RM0090  Reference manual

STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced ARM®-based 32-bit MCUs


RM0090






STM32 - FLASH write




검색결과

IAP (In-Application Programming), internal flash erase/write | mbed

https://developer.mbed.org/.../iap-in-application-programming-in...
이 페이지 번역하기
2015. 7. 3. - Sample code for how to erase/write LPC1768, LPC11U24, LPC1114, LPC812 and LPC824 internal flash memory. This program uses IAP call ...

In-Application Programming (IAP) Code Example | www.LPCware.com

https://www.lpcware.com/.../application-programming-iap-code-e...
이 페이지 번역하기
2012. 9. 27. - For those in need of IAP demo code / example code, here's simple code ... Command codes for IAP ... Prepare flash sector(s) for erase / writing

problem with IAP-based internal flash programming. | www.LPCware ...

https://www.lpcware.com/.../problem-iap-based-internal-flash-pro...
이 페이지 번역하기
2013. 6. 26. - 댓글 3 - ‎작성자 2
I'm working with "SimpleCortex" board, and have been stumbling on an issue with flashprogramming using the IAP functions.

IAP flash programming - put program to RAM - Keil

www.keil.com/forum/.../iap-flash-programming-put-program-to-...
이 페이지 번역하기
2010. 11. 9. - 댓글 10 - ‎작성자 3
I have developed C code for programming flash using IAP, and I cameto point when I can successful programming sectors 1 to 17 of ...
게시물 5개
2013년 7월 7일
게시물 5개
2013년 1월 7일
게시물 4개
2007년 11월 27일

[PDF]AN3965 - STMicroelectronics

www.st.com/resource/en/application_note/dm00036049.pdf
이 페이지 번역하기
2011. 10. 12. - The STM32F4xx microcontroller can run user-specific firmware to perform IAP of the microcontroller-embedded Flash memory. This feature ...

[PDF]STM32 in-application programming (IAP) using the USART

www.st.com/resource/en/application_note/dm00161366.pdf
이 페이지 번역하기
2015. 4. 27. - An STM32 microcontroller can run user-specific firmware to perform IAP of the Flashmemory embedded in the microcontroller. This feature can ...

flash programming problem - Simplecortex

www.brc-electronics.nl/.../565-flash-programming-problem?...0
이 페이지 번역하기
2013. 6. 25. - I'm trying to use the IAP (in-application-programming) commands to write to the internal flash on the LPC1769. Generally speaking things seem ...

rfLPC: Flash memory In-Application Programming (IAP) - GitHub Pages

hauspie.github.io/rflpc/doc/group__iap.html
이 페이지 번역하기
Flash memory sector-address mapping. More... int, rflpc_iap_get_sector_from_address (const void *address). Flash memory address-sector mapping. More.

microcontroller - Writing to and reading data from Flash using IAP ...

electronics.stackexchange.com/.../writing-to-and-reading-data-fro...
이 페이지 번역하기
2015. 5. 6. - Here you can see functions I'm using to store data into Flash, but I'm getting data erased after power reset, so it's still in RAM not in Flash.

[PDF]AN10835 LPC2000 secondary bootloader for code update using IAP

www.nxp.com/documents/application_note/AN10835.pdf
이 페이지 번역하기
2009. 5. 26. - LPC2000, Secondary bootloader, IAP, Code update. Abstract ... chip flash via UART with 1K XMODEM protocol, SD/MMC with file system ...


Posted by 안녕1999
, |

인터럽트로 UART데이터를 보낼때, 일부 데이터가 전송이 안되는 경우가 발생했다.

원인은 확인할 수 없었고,

아래에 비슷한(?) 글이 있다.

https://community.nxp.com/thread/341862

요약 : USART_IT_TXE 가 발생하지 않는 경우가 있다.


USART_IT_TXE 발생시, 데이터를 널어주는 방식이었으나,

일부 전송이 안되는 문제로,

USART_IT_TC 인터럽트도 발생이 되지 않았다.

위 링크의 글대로, USART_IT_TXE로 보내고, 남는것은 메인루프에서 폴링방식으로 검사해서 전송되도록 했다.

Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함