C言語分かる人教えてください。
■ このスレッドは過去ログ倉庫に格納されています
typedef struct
{
__IO uint16_t CR1;
uint16_t RESERVED0;
__IO uint16_t CR2;
uint16_t RESERVED1;
__IO uint16_t SMCR;
uint16_t RESERVED2;
__IO uint16_t DIER;
uint16_t RESERVED3;
__IO uint16_t SR;
uint16_t RESERVED4;
__IO uint16_t EGR;
uint16_t RESERVED5;
__IO uint16_t CCMR1;
uint16_t RESERVED6;
__IO uint16_t CCMR2;
uint16_t RESERVED7;
__IO uint16_t CCER;
uint16_t RESERVED8;
__IO uint16_t CNT;
uint16_t RESERVED9;
__IO uint16_t PSC;
uint16_t RESERVED10;
__IO uint16_t ARR;
uint16_t RESERVED11;
__IO uint16_t RCR;
uint16_t RESERVED12;
__IO uint16_t CCR1;
uint16_t RESERVED13;
__IO uint16_t CCR2;
uint16_t RESERVED14;
__IO uint16_t CCR3;
uint16_t RESERVED15;
__IO uint16_t CCR4;
uint16_t RESERVED16;
__IO uint16_t BDTR;
uint16_t RESERVED17;
__IO uint16_t DCR;
uint16_t RESERVED18;
__IO uint16_t DMAR;
uint16_t RESERVED19;
} TIM_TypeDef;
#define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
#define TIM2 ((TIM_TypeDef *) TIM2_BASE)
ライブラリ読んで勉強しているんだけど、ちょっと教えてください! #define TIM2 ((TIM_TypeDef *) TIM2_BASE)
初心者なのでここからすでに意味が分かりません。
TIM2という定義は、TIM_TypeDefという構造体のポインタとTIM2_BASEのアドレスをどう計算しているの? TIM2は構造体何ですか?それとも構造体のポインタなんですか TIM2はただのアドレス
その内容はAPB1PERIPH_BASEと一致してる >>6
ありがとうございます!
すみません、ちょっと考えさせてください。 C言語の初心者がライブラリを読むのは悪手だと思うよ
ライブラリはたいていマクロ地獄だから本質的なプログラムが見えにくい >>6
なんとなく分かりました。
((TIM_TypeDef *) TIM2_BASE)
ここではTIM_TypeDef型の構造体を作成して、そのアドレスにTIM2_BASEの(APB1PERIPH_BASE + 0x0000)を指定している、という感じでしょうか? >>8
悪手でしたでしょうか・・・
これマイコンのライブラリなのですが、欲しい情報がなかなか無く、泣く泣くライブラリを読んでいる、といったところです。 >>9
構造体は作成してない
(TIM_TypeDef*)という部分は、「TIM2_BASEという数値をどのように見るか?」という事を指定しているだけ
TIM2_BASEはただの数値なので、int型と見てもいいし何ならdouble型と見てもいいけど、ここではTIM_TypeDef*型と見る事にする、と言っている >>12
多分コード直読みしても厳しいからマイコンのデータシートとかマニュアル見た方が良さそう
ボード名 リファレンスとかで検索かけたら出てくるよ >>9
まぁでも実用上はその理解でも問題ないかも
正しい説明は>>13だけども
>>13くらいは当たり前と思えるくらいにはC言語を勉強した方がいい 後はSTM32CubeIDEって統合開発環境があるからそれ使ってそのボードに適したソースコードを生成してみるといいと思うわ
既にやってたらすまんな >>13
構造体を作成しているわけでは無いのですね。
もう少し考えてみます。
例えば
TIM2->CNT = 0x00123456;
と記述した場合でも構造体は作成されませんか? >>18
されない
TIM2の表すアドレスにCNTの表す「幅」を加えて得られるアドレス位置に0x123456を書き込んでるだけ
しかし察するにABP1PERIPH_BASEは既に作成されている構造体の先頭アドレスの事だろうから
TIM2の指す先は既に存在してる構造体の位置になってるはず >>15
ヘルプファイルはあるのですが、すべて英語だったんで見るの諦めました。
そちら呼んだほうが早いかもしれませんね。
>>17
ありがとうございます。
HALですよね。
AVRっていうマイコンでレジスタを叩くのが楽だったのでSTM32でも直接レジスタ叩きたかったんです。 >>19
なるほど!
考えかたの糸口が見えてきました。
ありがとうございます。 プレCっぽいフォーマットと
シンボル名でだいたい何しようとしてんのか想像つくけど
一応ヘッダ名はなに? >>22
ヘッダ名というのがよく分からなくて申し訳ないですが
stm32f10x.h
でいいでしょうか? >>23
IO処理用やね
マップされたレジスタ群の入出力用の型で
アドレス空間にマップされたレジスタ群を
C文法で操作しやすいようにその型へハメこんでるだけやな
それが用意されてるってことはアドレス直打ちのコードだと
コンパイル時に事故おこるかもしれんからそれ使ったほうがええっぽいな
CR1とかCR2とかそのまんまのネーミングやしw ■ このスレッドは過去ログ倉庫に格納されています