inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

바닥부터 시작하는 STM32 드론 개발의 모든 것

LPS22HH_Get_Temp함수 질문입니다.!ㅎㅎ

382

우연같이

작성한 질문수 8

0

1. LPS22HH 의 Get_Temp함수에선 ICM20602와 다르게 

Readbytes함수를 호출해서 (unsigned char*) 형태로 조금 다른데

이뜻은 unsigned char 로 형변환하여 구조체 멤버변수에 저장하는건가요??ㅎㅎ

2. Get_Temp함수와 Get3Axis 함수에서 

Readbytes 함수를 호출할때 장치주소를 한번만 쓰시는데 그 이유가 궁금하고

그 뜻은 구조체 멤버변수에 배열형태로 주소가 이어져있기때문에 가능한건가요??

따로 다른 IC를 쓸때 참고하려고 여쭤봅니다.ㅎㅎ

드론-개발 iot

답변 2

0

우연같이

답변 감사드립니다!

몇가지 궁금점 해소가 안된것이 있어서 질문드립니다.

1.gyro 함수는 <<쉬프트연산을 하는데 temp함수는 unsigned char*형태로 형변환하기 때문에 

<<쉬프트연산이 필요 없다는 말씀이시죠?

2.unsigned char*변수가 주소를 증가시키며 데이터를 수신하는것은 알겠으나

장치주소는 서로 다른데 한번만 써도 되는지 궁금합니다!

Readbytes함수를 써도 장치주소 Sendbyte는 한번만 쓰여있어서 궁금하여 여쭤봅니다!ㅎㅎ

0

ChrisP

1. icm-20602 수신 함수는 쉬프트 연산을 하지만 lps22hh 함수는 쉬프트 연산을 하지 않고도 순서대로 저장되는 이유는 (정확히 말씀드리면) 데이터 저장 순서가 달라서 그렇습니다.

리틀엔디언과 빅엔디언의 차이인데, icm-20602는 빅엔디언으로 데이터를 보내주기 때문에, 낮은번지부터 순서대로 받으면 high 바이트와 low 바이트 순서가 뒤바뀌어 있습니다. 따라서 비트연산등을 통해 그 엇갈려있는 순서를 원래대로 바꿔서 저장해주어야 합니다. (리틀엔디언으로 저장해야 하기 때문)

lps22hh는 데이터를 보내줄 때부터 리틀엔디언으로 보내주기 때문에 바이트 순서를 바꿔줄 필요 없이 순차적으로 읽어와서 저장해주면 됩니다.

※ 포인터와 리틀엔디언, 빅엔디언을 공부하시면 도움이 될 겁니다.

2. 레지스터 주소를 증가시키며 데이터를 수신하기 위해서는 레지스터의 주소가 연속되어있어야 합니다.

TEMP_OUT_L  0x2B부터 연속적으로 두바이트를 읽어오는 것과, TEMP_OUT_L 과 TEMP_OUT_H를 따로따로 한바이트씩 읽어오는것은 같은 효과겠지요. (두 레지스터의 주소가 연속되어있기 때문)

이와 마찬가지로 자이로 데이터 레지스터의 주소도 연속되어있기 때문에 시작주소부터 순차적으로 6바이트를 읽어오면 3축 자이로의 값을 모두 읽어오는 것과 같습니다.

0

우연같이

친절한 답변 감사드립니다 ㅎㅎ 많은 도움이 됐네요

리틀엔디언으로 저장해야하는 이유는 stm이 그런방식이라 그런건가요?

0

ChrisP

도움이 됐다니 다행입니다!

네 맞습니다. 저도 좀 찾아보니 STM32 byte order는 Little endian만을 지원하는 것 같고,  ARM Cortex M계열은 Dynamic endianness switching 을 지원하지 않는다고 어떤 분이 글을 올려놓은게 있네요. 이 경우 칩 제조사의 Endian 방식을 따르라고 되어있다고 합니다.

https://electronics.stackexchange.com/questions/183021/stm32f103c8xx-big-or-small-endian

STM32는 Little endian을 지원하는 것 같고, 보통 대부분의 MCU의 경우 Little endian을 따릅니다. 저도 아직 Big endian 포맷을 따르는 MCU는 본적이 없고요.

그럼 앞으로도 계속 궁금해하시고 공부하시면서 개발하시기 바랍니다~

0

ChrisP

https://stackoverflow.com/questions/41194895/how-to-change-endianess-settings-in-cortex-m3

이것도 한번 보시면 좋을 것 같습니다.

M3와 M4 는 또 다를 수 있기 때문에, 가장 확실한 건 칩 제조사의 스펙매뉴얼을 확인해보는것 같네요~

0

우연같이

넵 친절한 답변 감사합니다!ㅎㅎ

0

ChrisP

안녕하세요!

1. temperature 변수는 int16_t* 포인터 변수이고 ReadBytes() 함수의 세번째 매개변수는 unsigned char* 포인터 변수입니다. 형태가 다르기 때문에 형변환을 해주어야 에러없이 빌드됩니다.

2. ReadBytes 내부에서 unsigned char* 변수가 가리키는 주소를 1씩 증가시키면서 데이터를 수신하도록 되어있기 때문에 시작주소를 전달합니다.

해당 질문은 C언어의 포인터와 함수, 배열에 관한 내용이므로 자세한 내용은 C언어의 해당 파트를 공부하시면 도움이 됩니다!

비행승인 문의드립니다

0

32

0

드론의 M4 모터가 느리게 작동합니다.

0

56

2

STM32CubeIDE 관련해서 질문이 있습니다.

0

88

2

while문 루프 속도

0

57

2

변수 선언

0

47

2

FS-i6를 꺼도 LED 토글되는 이유

0

64

2

Fs-i6 i-bus 수신 데이터 이상

0

106

3

3-4. UBX 위도 경도 정보 Terminal에서 깨짐 현상

0

84

2

3-4. LED 토글 안됨

0

46

1

3-1. M8N GPS 강의 통신 연결 관련 문의

0

75

1

2-3. LPS22HH 강의 수행값이 아두이노 IDE Plotter 및 Terminal에서 인식 안됨

0

75

2

6-4 SwC 2000

0

100

2

6-4 ESC Calibration

0

65

1

esc, 모터 교체

0

108

2

부저 소리가 안납니다.

0

130

2

비행 질문

0

61

1

7-5. offset

0

72

2

sysmem.c

0

69

2

전체 제어의 주기를 1KHz로 설정한 이유가 궁금합니다.

0

86

2

부품 구매 관련 문의

0

62

1

PID 게인 문제

0

79

3

3d telemetry cp210x 연결

0

117

2

8-1. 3DR Telemetry HAL_UART_Receive_IT(&huart1, &uart1_rx_data, 1); 관련 문의

0

69

2

PID제어 질문

0

120

2