2025年06月15日
- kojima295
- 6月15日
- 読了時間: 10分
更新日:6月18日
おはようございます。
・・・
恐れ入ります。
本日は、部屋の片づけを行う必要がございます。
技術講座は、本日午後から開始いたします。
チョット、雑談でも致しましょうか。
int main(void)
{
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();
/* Default: LED is off */
DL_GPIO_setPins(
GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
while (1) {
/*
* Call togglePins API to flip the current value of the LED. This
* API causes the corresponding HW bits to be flipped by the GPIO HW
* without need for additional R-M-W cycles by the processor.
*/
delay_cycles(DELAY);
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
}
}さて、、、

初期化関数「SYSCFG_DL_init」関数をF10ボタンを押下することにより、実行したとします。
ここで、44行目に行くはずです。
実際に、F10ボタンを押してみましょう。

おかしい・・・
44行目に矢印が移動致しませんでした。
その代わり、関数「DL_GPIO_setPin」の中身に移動致しました
これは、一体何が起きたのか?
2269行目・・・
__STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)ここから、マジでプロの世界に飛び込むことになります。

上記は、矢印が
SYSCFG_DL_init();にある時、F11キーを押して、わざと上記関数内に移動した状態です。
よく見てください!!
何か、違いませんか?
SYSCONFIG_WEAK void SYSCFG_DL_init(void)__STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)よ~~く、見てください!!
SYSCONFIG_WEAK__STATIC_INLINEいいですか、ここはプロとアマチュアの違いの世界となります!
関数名の前に、何か記述されている文字が異なります!!
なんだこれは、と、、、
上記を読んでわかりますか?
なかなか難しいことを解説しています。
マイコンのメモリは限られています。
特に、安価なマイコンの場合、メモリ容量が殆どございません。
ここはメチャ難しい部分です。
エンジニア中級者でもよく間違える!
今はまだ、AIが何を言っているのか分からないと思います。
しかし、これから学習を進めていくことで、必ず理解できるようになります!
何故、F10キーを押したときの動きが違うのか、、、
これについては、今の段階では考える必要はございません。
しかし、エンジニア上級に到達するためには必要となる部分です。
今は、考えず先に進みましょう!!
で、、、
/**
* @brief Set a group of GPIO pins
*
* @param[in] gpio Pointer to the register overlay for the peripheral
* @param[in] pins Pins to set high. Bitwise OR of @ref DL_GPIO_PIN.
*/
__STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)
{
gpio->DOUTSET31_0 = pins;
}これは何か?
関数内に命令が一つだけ記述されています。
gpio->DOUTSET31_0 = pins;これはね、、、C言語と言う文法を知っている必要がある。
しかも、その文法を知っているだけでは意味を理解できない・・・
他の知識も必要となります!!
ココは難しいので、解説いたします。
でね、これは「構造体」と呼ばれるものを使用しています。
「構造体」って何?
この解説をうまくできたとしたら、、、私はマジでプロ中のプロの講師になれると思います。
__STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)上記に「GPIO_Regs* gpio」と書かれてある部分がございます。
typedef struct {
uint32_t RESERVED0[256];
__IO uint32_t FSUB_0; /* !< (@ 0x00000400) Subsciber Port 0 */
__IO uint32_t FSUB_1; /* !< (@ 0x00000404) Subscriber Port 1 */
uint32_t RESERVED1[15];
__IO uint32_t FPUB_0; /* !< (@ 0x00000444) Publisher Port 0 */
__IO uint32_t FPUB_1; /* !< (@ 0x00000448) Publisher Port 1 */
uint32_t RESERVED2[237];
GPIO_GPRCM_Regs GPRCM; /* !< (@ 0x00000800) */
uint32_t RESERVED3[510];
__IO uint32_t CLKOVR; /* !< (@ 0x00001010) Clock Override */
uint32_t RESERVED4;
__IO uint32_t PDBGCTL; /* !< (@ 0x00001018) Peripheral Debug Control */
uint32_t RESERVED5;
GPIO_CPU_INT_Regs CPU_INT; /* !< (@ 0x00001020) */
uint32_t RESERVED6;
GPIO_GEN_EVENT0_Regs GEN_EVENT0; /* !< (@ 0x00001050) */
uint32_t RESERVED7;
GPIO_GEN_EVENT1_Regs GEN_EVENT1; /* !< (@ 0x00001080) */
uint32_t RESERVED8[13];
__IO uint32_t EVT_MODE; /* !< (@ 0x000010E0) Event Mode */
uint32_t RESERVED9[6];
__I uint32_t DESC; /* !< (@ 0x000010FC) Module Description */
uint32_t RESERVED10[64];
__O uint32_t DOUT3_0; /* !< (@ 0x00001200) Data output 3 to 0 */
__O uint32_t DOUT7_4; /* !< (@ 0x00001204) Data output 7 to 4 */
__O uint32_t DOUT11_8; /* !< (@ 0x00001208) Data output 11 to 8 */
__O uint32_t DOUT15_12; /* !< (@ 0x0000120C) Data output 15 to 12 */
__O uint32_t DOUT19_16; /* !< (@ 0x00001210) Data output 19 to 16 */
__O uint32_t DOUT23_20; /* !< (@ 0x00001214) Data output 23 to 20 */
__O uint32_t DOUT27_24; /* !< (@ 0x00001218) Data output 27 to 24 */
__O uint32_t DOUT31_28; /* !< (@ 0x0000121C) Data output 31 to 28 */
uint32_t RESERVED11[24];
__IO uint32_t DOUT31_0; /* !< (@ 0x00001280) Data output 31 to 0 */
uint32_t RESERVED12[3];
__O uint32_t DOUTSET31_0; /* !< (@ 0x00001290) Data output set 31 to 0 */
uint32_t RESERVED13[3];
__O uint32_t DOUTCLR31_0; /* !< (@ 0x000012A0) Data output clear 31 to 0 */
uint32_t RESERVED14[3];
__O uint32_t DOUTTGL31_0; /* !< (@ 0x000012B0) Data output toggle 31 to 0 */
uint32_t RESERVED15[3];
__IO uint32_t DOE31_0; /* !< (@ 0x000012C0) Data output enable 31 to 0 */
uint32_t RESERVED16[3];
__O uint32_t DOESET31_0; /* !< (@ 0x000012D0) Data output enable set 31 to 0 */
uint32_t RESERVED17[3];
__O uint32_t DOECLR31_0; /* !< (@ 0x000012E0) Data output enable clear 31 to 0 */
uint32_t RESERVED18[7];
__I uint32_t DIN3_0; /* !< (@ 0x00001300) Data input 3 to 0 */
__I uint32_t DIN7_4; /* !< (@ 0x00001304) Data input 7 to 4 */
__I uint32_t DIN11_8; /* !< (@ 0x00001308) Data input 11 to 8 */
__I uint32_t DIN15_12; /* !< (@ 0x0000130C) Data input 15 to 12 */
__I uint32_t DIN19_16; /* !< (@ 0x00001310) Data input 19 to 16 */
__I uint32_t DIN23_20; /* !< (@ 0x00001314) Data input 23 to 20 */
__I uint32_t DIN27_24; /* !< (@ 0x00001318) Data input 27 to 24 */
__I uint32_t DIN31_28; /* !< (@ 0x0000131C) Data input 31 to 28 */
uint32_t RESERVED19[24];
__I uint32_t DIN31_0; /* !< (@ 0x00001380) Data input 31 to 0 */
uint32_t RESERVED20[3];
__IO uint32_t POLARITY15_0; /* !< (@ 0x00001390) Polarity 15 to 0 */
uint32_t RESERVED21[3];
__IO uint32_t POLARITY31_16; /* !< (@ 0x000013A0) Polarity 31 to 16 */
uint32_t RESERVED22[23];
__IO uint32_t CTL; /* !< (@ 0x00001400) FAST WAKE GLOBAL EN */
__IO uint32_t FASTWAKE; /* !< (@ 0x00001404) FAST WAKE ENABLE */
uint32_t RESERVED23[62];
__IO uint32_t SUB0CFG; /* !< (@ 0x00001500) Subscriber 0 configuration */
uint32_t RESERVED24;
__IO uint32_t FILTEREN15_0; /* !< (@ 0x00001508) Filter Enable 15 to 0 */
__IO uint32_t FILTEREN31_16; /* !< (@ 0x0000150C) Filter Enable 31 to 16 */
__IO uint32_t DMAMASK; /* !< (@ 0x00001510) DMA Write MASK */
uint32_t RESERVED25[3];
__IO uint32_t SUB1CFG; /* !< (@ 0x00001520) Subscriber 1 configuration */
} GPIO_Regs;上記が「GPIO_Regs」構造体です。
さて、ここで殆どの方が脱落してしまいます。。。
理解することが物凄く難しいんです。
何故なら、マイコンの内部構造が分かっていないと、、、
理解できないからです。
私は、1967年6月5日に生まれました。
世界初のマイコンである「intel 4004」は、1971年に誕生致しました。
これは「4ビットマイコン」です。
何が言いたいのかと言えば、私の成長と共にマイコンも成長した・・・
私は、マイコンの初期の状態から知っていると言う訳です。
したがって、マイコンの中身も知っている。
今は、中身が隠されてしまっています!
実は、これが皆さんとの大きな違いとなっています。
で、いよいよ本番となるのですが・・・
これから、皆さんと共に「マイコン」自体を作成致します!!
マイコンの中身を作成するという意味です。
4ビットマイコンを作成致します。
ちなみに「シュシュ」「ブレスレット」などは別枠で同時に解説を続けます。
実は、これは壮大な計画で、、、
もし、皆さんがこの内容を理解出来たら、、、
日本及びアメリカの製造業は間違いなく復活致します!!
あの・・・誰も見てはいらっしゃらないのですが、、、
簡単に言えば、皆さんがコンピュータ・ジャイアントである「昔のApple社」や「昔のソニー」を立ち上げるようなものです。。。
世界を変える画期的な製品が次々に生まれることになるでしょう。
4ビットマイコンを設計する。
かつて、インテル社が世界初のマイコン「intel 4004」を開発したように・・・
このマイコンを使用しアップル社などが誕生した!
・・・
続きは本日午後から開始いたします。
よろしくお願い致します。
・・・
午後になりました!
講座を再開させます。
まず、4ビットマイコンについて・・・
と、その前に、、、
「1ビットマイコン」を作成致します!!
実は、この「1ビットマイコン」を4個繋げると4ビットマイコン。
そして、8個繋げると8ビットマイコンになります!
ただ、8個繋げるのは結構大変なので、4個繋げる・・・
つまり、4ビットマイコンを創ってみようという考えです。
したがって、原型となる「1ビットマイコン」を作成してみます。
最初に「1ビットレジスタ」と言うモノを創ります。
何だそれ・・・と、
「レジスタ」とは記憶装置の一種です。
で、コンピュータって計算などを行うことが出来ます。
当たり前です・・・
だから、コンピュータと言うのですからね。。。
メモリにデータや命令が記録されています。
記録されているだけでは意味がなくて、読み出すことと書き込むことが出来なければならない。
で、何に対して読み込んだり、書き込んだりするのか・・・
この読み込んできたデータに対して計算を行い、この結果を書き込む必要があります。
ここは非常に難しい部分です。
そして、極めて重要です。
ゆっくり、じっくり解説を行います。
計算をするためには、一度メモリから一時的に計算するための専用メモリである「レジスタ」にデータを移動させる必要があります。
そして、複数ある「レジスタ」同士のデータを使用し、その値を使用して計算を行います。
さらに、計算した結果を、再び「レジスタ」に書き込みます。
その「レジスタ」の値をメモリに書き込み記録させるのです。
つまり、データは
メモリ ⇒ レジスタ ⇒ 【計算】 ⇒ レジスタ ⇒ メモリ
と言う順番で移動致します。
今、物凄く難しいお話をしています。
この方法は、昔あるメチャ天才である方が考え出した方法です。
天才って、こういうことを考え出すことが出来ます!
なので、基本難しいのです。
Y = X1 + X2
このような計算が必要だとします。
この「Y」や「X1」、「X2」と言うモノが「レジスタ」に相当します。
メモリには膨大なデータが記録されています。
あまりにも膨大すぎて、どのデータを使用すればよいのか分かりません。
そこで、メモリにあるデータを「番地」と言うモノで管理致します。
0番地、1番地、2番地、・・・ 沢山・・・
例えば、514番地!
514番地には「5」と言うデータが入っているとする。
104番地には「2」と言うデータが入っているとする。
もう一度言います。
メモリには膨大なデータがございます。
この中から、計算に使用するデータを選択する必要があるんです。
どのように選択するのかと言えば「番地」と言うモノを使用する。
まず「番地」を指定して、この中にあるデータを「X1レジスタ」に入れる。
もう一つの「番地」を指定して、この中にあるデータを「X2レジスタ」に入れる。
あとは、この「レジスタ」に記録されているデータを使用し、計算を行う。
例えば「足し算」です。
Y = X1 + X2
結果を「Yレジスタ」に入れる。
「Yレジスタ」のデータを、メモリ上にある特定の「番地」に書き込む!
ちなみに・・・
「Y = X1 + X2」と言うのは、「X1とX2を足し合わせた結果をYに代入する」と言う意味です。
メチャ難しいよ!!
こうすれば、膨大なデータがあるメモリの中から特定のデータ値を使用して、計算を行い、結果を再びメモリに返すことが出来る。
天才って、怖いよね!!
この天才の名前は「フォン・ノイマン」とおっしゃいます。
宇宙計画のアポロ計画も、この方が中心になり実行されました!
(間違い:フォン・ブラウンが中心人物です)
で、これからコレを電子回路として創り上げます!!
これが、コンピュータの心臓部となります!
覚悟してください!
でも、必ず出来ますからね!
これが出来るよう、ご指導させていただきます。
・・・
チョット、部屋の掃除の続きを行う必要がございます。
一旦、ここで通信を切ります。
・・・
掃除ですが、大変です!!
部屋が散らかりまくっています。
少しだけ、講義を先に進めましょう。
ダメだ、部屋が散らかりすぎです。
今日の講義は、ココまでと致します。
また、明日お会いいたしましょう。
よろしくお願い致します。
・・・
ごめんなさい。
ようやく、部屋の片づけが完了致しました。
ほんの少しだけ、先に進めてみましょう!
今から「レジスタ」を設計致します。
これを設計するために「フリップ・フロップ」と言う部品を使用いたします。
実は、2個の部品しか使用致しません。
しかし、その仕組みを理解することは、物凄く難しい!
何しろ、天才中の天才が考え出した方法です。
難しいったら、ありゃしない!!
このレジスタの仕組みさえ理解できれば、あとは簡単なんです。
一番難しいのが「レジスタ」です。
いかに天才が、この問題を解決したのか、、、
皆さんと共に考えてみましょう!!
以下のYOUTUBEは、物凄く難しい内容を取り扱っています。
いいですか、物凄く難しい!
しかし、一度最後まで見てください。
ココでは、非常に重要な内容を皆さんに伝えています!!
これを、一つ一つ分かりやすくかみ砕いていきます!
いいですか、皆さんには「国の製造業を復活させる責任」が伴っています。
「そんなことできない!」なんてことはありません。
必ずできます!
私にできることは、極めて小さいですが、、、できる限り分かりやすくご説明いたします。
明日、皆さんは上記のYOUTUBEの内容を理解できるようになります。
一旦、ここで本日の講義を完了させます。
明日、またお逢い致しましょう。
・・・
少々雑談を致しましょう。


コメント