인프런 커뮤니티 질문&답변

우연같이님의 프로필 이미지
우연같이

작성한 질문수

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

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

작성

·

256

0

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

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

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

2. Get_Temp함수와 Get3Axis 함수에서 

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

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

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

답변 2

0

우연같이님의 프로필 이미지
우연같이
질문자

답변 감사드립니다!

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

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

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

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

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

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

ChrisP님의 프로필 이미지
ChrisP
지식공유자

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

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

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

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

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

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

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

우연같이님의 프로필 이미지
우연같이
질문자

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

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

ChrisP님의 프로필 이미지
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는 본적이 없고요.

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

ChrisP님의 프로필 이미지
ChrisP
지식공유자

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

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

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

우연같이님의 프로필 이미지
우연같이
질문자

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

0

ChrisP님의 프로필 이미지
ChrisP
지식공유자

안녕하세요!

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

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

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

우연같이님의 프로필 이미지
우연같이

작성한 질문수

질문하기