<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>各周辺機能(ペリフェラル)詳細 | 即戦力モノづくり!エンジニアへの道標</title>
	<atom:link href="https://depfields.com/category/learning/embedded/peripheral-detail/feed/" rel="self" type="application/rss+xml" />
	<link>https://depfields.com</link>
	<description>組み込み（マイコン）スキルを楽しんで学びながら身につけて短期間で効率よく自由自在に扱えるようになりたいと思いませんか？</description>
	<lastBuildDate>Tue, 11 Jul 2023 11:02:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.1</generator>

<image>
	<url>https://depfields.com/wp-content/uploads/2020/07/cropped-favicon-1-32x32.png</url>
	<title>各周辺機能(ペリフェラル)詳細 | 即戦力モノづくり!エンジニアへの道標</title>
	<link>https://depfields.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>独立型ウォッチドッグタイマ【STM32のIWDG詳細】</title>
		<link>https://depfields.com/iwdg/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iwdg</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 02:45:00 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[IWDG]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2894</guid>

					<description><![CDATA[<p>ウォッチドッグタイマとは 独立型ウォッチドッグタイマ 関数実行例：　IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 関数実行例：　IWDG_SetPrescaler(IWDG_ [&#8230;]</p>
<p>The post <a href="https://depfields.com/iwdg/">独立型ウォッチドッグタイマ【STM32のIWDG詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img fetchpriority="high" width="640" height="480" src="https://depfields.com/wp-content/uploads/2020/06/dog-2367797_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/dog-2367797_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/dog-2367797_640-300x225.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>




<h2 class="wp-block-heading">ウォッチドッグタイマとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ウォッチドッグタイマとはプログラムが暴走・フリーズしてしまったときに、これを検出してプログラムを終了させてリセットかける機能のことです。プログラムの異常を見張る役目のため<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ウォッチドッグ（番犬）タイマ</span></strong>と呼ばれています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PCで何らかの影響でアプリケーションプログラムが突然フリーズすることはよくあると思います。これは何らかのはずみで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">プログラムが無限ループに入ってしまい</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外からの操作を受け付けることができなくなる</span></strong>、つまり固まってしまう状態になってしまっているのです。こうなればPCの場合は強制的に電源を再投入して再起動するしかないのですが、組み込み機器ではそうはいきません。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで、ウォッチドッグタイマ機能を使用して問題が発生した異常時にプログラムを終了し、自動的に強制リセットかけます。ウォッチドッグタイマ機能が異常を検出するのではなく、正常であればカウンタ値をクリアされるところをクリアされずに<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>タイムアウトに達してしまうことで異常とみなし</strong>、</span>プログラムを終了させ強制リセットをかけるのです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>趣味の電子工作では必要ないかもしれませんが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">24時間稼働の産業機器や医療機器などでは必要な機能</span></strong>です。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/iwdg.jpg" alt="" class="wp-image-2896" width="377" height="223" srcset="https://depfields.com/wp-content/uploads/2020/06/iwdg.jpg 376w, https://depfields.com/wp-content/uploads/2020/06/iwdg-300x177.jpg 300w" sizes="(max-width: 377px) 100vw, 377px" /><figcaption>独立ウォッチドッグタイマ</figcaption></figure>



<h2 class="wp-block-heading">独立型ウォッチドッグタイマ</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンではウォッチドッグタイマの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロックはLSI内部クロックを使用</span></strong>しています。システムクロックは外部HSEまたは内部HISから供給したものですので、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">独立したクロック</span></strong>で、万一システムクロックにトラブルが発生しても影響を受けずに問題を検出できます。このため、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">独立型ウォッチドッグ</span></strong>と呼ばれています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タイマは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ダウンカウンタ</span></strong>となっていて、カウント値クリア直後の設定値からスタートしてダウンカウントしていきます。カウント値が途中でクリアされずにアンダーフローに達するとマイコンは強制リセットされます。そのため、アンダーフローつまり<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タイムアウトに達する前にカウンタ値をクリアする必要</span></strong>があります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/iwdg-setting.jpg" alt="" class="wp-image-2897" width="646" height="273" srcset="https://depfields.com/wp-content/uploads/2020/06/iwdg-setting.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/iwdg-setting-300x127.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/iwdg-setting-768x325.jpg 768w" sizes="(max-width: 646px) 100vw, 646px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実際のプログラムおける設定を解説していきます。<br>プログラム起動直後、独立型ウォッチドッグはデフォルトでレジスタへの書き込みは禁止ですので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">IWDG_WriteAccessCmd関数</span></strong>で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">書き込みアクセス許可</span></strong>します。引数は、<strong>IWDG_WriteAccess_Enableでアクセス許可、IWDG_WriteAccess_Disableでアクセス禁止</strong>です。</p>
</div></div></div>



<p>関数実行例：　IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次にウォッチドッグタイマのクロック分周比を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">IWDG_SetPrescaler関数</span></strong>で設定します。関数の引数は4から256まで7通りあります。下表はLSIが40kHzであるときに分周比による設定できる時間をまとめたものです。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="584" height="255" src="https://depfields.com/wp-content/uploads/2020/06/iwdg-prescaler.jpg" alt="" class="wp-image-2898" srcset="https://depfields.com/wp-content/uploads/2020/06/iwdg-prescaler.jpg 584w, https://depfields.com/wp-content/uploads/2020/06/iwdg-prescaler-300x131.jpg 300w" sizes="(max-width: 584px) 100vw, 584px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>LSIは内部クロックですので多少の周波数のばらつきはありますが約2500msにウォッチドッグタイマを設定したい場合は分周比32を指定します。</p>
</div></div></div>



<p>関数実行例：　IWDG_SetPrescaler(IWDG_Prescaler_32);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>カウント数の設定はIWDG_SetReload関数で指定します。関数の引数は0x0から0xFFF(4095)の範囲内で、3000を指定します。</p>
</div></div></div>



<p>関数実行例：　IWDG_SetReload(3000);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ウォッチドッグタイマのカウンタ値クリアは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">IWDG_ReloadCounter関数</span></strong>で行います。設定したカウンタ値（3000で約2500ms）で強制リセットとなりますので、この期間以内、例えば100ms間隔で実施するTaskD内で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウンタクリアを行います</span></strong>。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウンタクリア</span></strong>はウォッチドッグの機能を考えると<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">優先度の最も低いタスクで実施する</span></strong>ことが好ましいです。正常運転中は最低優先度のTaskDでもほぼ設定周期100msで実施されますのでカウンタクリアはできますが、何らか異常が発生してフリーズしている場合はTaskDが実施されずカウンタクリアはできず、ウォッチドッグタイマはタイムアウトに到達して強制リセットに至ります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/iwdg-action.jpg" alt="" class="wp-image-2903" width="463" height="243"/><figcaption>IWDG動作の様子</figcaption></figure>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/iwdg/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/b11a08c789631eacce8a55ac08b7de523f55fb74ba87d03b57cabddfd282fa24.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Independent Watchdog timer of STM32 | Most Powerful Bible to Become an Embedd...</div></div><div class="lkc-url">https://en.depfields.com/iwdg/</div><div class="lkc-excerpt">What is a watchdog timer?A watchdog timer is a function that detects when a program has runaway or frozen, terminates the program, and resets it. It is called a watchdog timer because of its role in watching for program abnormalit</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/iwdg/">独立型ウォッチドッグタイマ【STM32のIWDG詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DMA(Direct Memory Access)【STM32のDMA詳細】</title>
		<link>https://depfields.com/dma/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dma</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2020 15:16:30 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[AD変換]]></category>
		<category><![CDATA[USART]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2807</guid>

					<description><![CDATA[<p>DMAは初心者・入門者には必須のスキルではありませんが、DMAを使用するとCPUの負担が減るため、CPU能力を他の処理に回せ、省電力に寄与できますので実務では求められることもあるでしょう。この章ではADコンバータの複数チ [&#8230;]</p>
<p>The post <a href="https://depfields.com/dma/">DMA(Direct Memory Access)【STM32のDMA詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="426" src="https://depfields.com/wp-content/uploads/2020/06/board-2440249_640-1.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/board-2440249_640-1.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/board-2440249_640-1-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">DMAは初心者・入門者には必須のスキルではありませんが、DMAを使用するとCPUの負担が減るため、CPU能力を他の処理に回せ、省電力に寄与できますので実務では求められることもあるでしょう。この章では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADコンバータの複数チャネルデータ</span></strong>をDMAでメモリに転送する例や<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART送受信</span></strong>にDMAを使用した例で解説しています。</p>







<h2 class="wp-block-heading">STM32のDMA転送</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%, rgba(255, 253, 107, 0.7) 0px);" class="vk_highlighter"><b>DMA</b></span>(<strong>D</strong>irect <strong>M</strong>emory <strong>A</strong>ccess)とは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">直接メモリアクセス</span></strong>と呼ばれるもので通常、データはCPUを介してメモリに転送するのに対して、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA転送</span></strong>を行うと<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CPUを介さず</span></strong>にADコンバータ、シリアル通信など<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ペリフェラルのレジスタデータをメモリに転送</span></strong>します。</p>
</div></div></div>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" width="410" height="288" data-id="2810" src="https://depfields.com/wp-content/uploads/2020/06/cpu-data-transfer.jpg" alt="" class="wp-image-2810" srcset="https://depfields.com/wp-content/uploads/2020/06/cpu-data-transfer.jpg 410w, https://depfields.com/wp-content/uploads/2020/06/cpu-data-transfer-300x211.jpg 300w" sizes="(max-width: 410px) 100vw, 410px" /><figcaption>CPUによるデータ転送</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="421" height="280" data-id="2811" src="https://depfields.com/wp-content/uploads/2020/06/dma-data-transfer.jpg" alt="" class="wp-image-2811" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-data-transfer.jpg 421w, https://depfields.com/wp-content/uploads/2020/06/dma-data-transfer-300x200.jpg 300w" sizes="(max-width: 421px) 100vw, 421px" /><figcaption>DMAによるデータ転送</figcaption></figure>
</figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>CPUの代わりになるものがDMAコントローラと呼ばれるものでSTM32マイコンでは最高で2個内蔵されています。STM32F10xではDMA1とDMA2の2個のコントローラがあり<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">AHBに接続</span></strong>されています。<br>各DMAには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">それぞれ複数のチャネル</span></strong>があり<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ペリフェラルごとにあらかじめ指定</span></strong>されています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma1-channel.jpg" alt="" class="wp-image-2813" width="780" height="287" srcset="https://depfields.com/wp-content/uploads/2020/06/dma1-channel.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/dma1-channel-300x110.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/dma1-channel-768x282.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /><figcaption>ペリフェラルからDMA1に発せられるDMA要求チャネル</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma2-channel.jpg" alt="" class="wp-image-2814" width="631" height="297" srcset="https://depfields.com/wp-content/uploads/2020/06/dma2-channel.jpg 644w, https://depfields.com/wp-content/uploads/2020/06/dma2-channel-300x141.jpg 300w" sizes="(max-width: 631px) 100vw, 631px" /><figcaption>ペリフェラルからDMA2に発せられるDMA要求チャネル</figcaption></figure>



<h2 class="wp-block-heading">複数チャネルADCのDMAによるデータ転送</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADC1のCH1とCH2の変換値取得にDMAを使用する例をあげて解説します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/adc-dma-transfer.jpg" alt="" class="wp-image-2816" width="596" height="323" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-dma-transfer.jpg 596w, https://depfields.com/wp-content/uploads/2020/06/adc-dma-transfer-300x163.jpg 300w" sizes="(max-width: 596px) 100vw, 596px" /><figcaption>ADCのDMAによるデータ転送</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="621" height="632" src="https://depfields.com/wp-content/uploads/2020/06/adc-dma-setting.png" alt="" class="wp-image-10073" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-dma-setting.png 621w, https://depfields.com/wp-content/uploads/2020/06/adc-dma-setting-295x300.png 295w" sizes="(max-width: 621px) 100vw, 621px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　使用するDMAにクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC1はDMA要求がDMA1のCH1に発せられるので使用するDMA1にクロックを供給</span></strong>します。DMAはAHBに接続していますのでAHBに供給します。</p>
</div></div></div>



<p>設定例： RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1にクロック供給</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第1引数は下表に示すAHBに接続するペリフェラルを指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/ahb-peripheral.jpg" alt="" class="wp-image-2818" width="388" height="336" srcset="https://depfields.com/wp-content/uploads/2020/06/ahb-peripheral.jpg 420w, https://depfields.com/wp-content/uploads/2020/06/ahb-peripheral-300x260.jpg 300w" sizes="(max-width: 388px) 100vw, 388px" /><figcaption>AHBに接続するペリフェラル用クロック供給関数へのマクロ</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>クロック供給関数RCC_AHBPeriphClockCmdの第2引数が<strong>ENABLEで供給開始、DISABLEで供給停止</strong>となります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　DMA1_CH1初期設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADC1はDMA1のチャネル1を使用しているので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA1_CH1の初期設定を実行</span></strong>します。はじめの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_Deinit関数</span></strong>は<strong>リセット直後の初期状態に戻すもの</strong>で一応実行しておきます。関数の引数には<strong>設定対象のDMAのチャネル(DMA<em>x</em>_Channel<em>y</em>)を指定</strong>(<em>x</em>:1-2, <em>y</em>:1-7)します。</p>
</div></div></div>



<p>DMA1の初期化関数設定例： DMA_Init(DMA1_Channel1, &amp;DMA_InitStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>初期化は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_Init関数を実行</span></strong>します。関数の第1引数には<strong>DMA_Dinit関数と同じものを指定</strong>し、第2引数は<strong>構造体メンバ</strong>になっていて以下に示します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="658" height="81" src="https://depfields.com/wp-content/uploads/2020/06/dma-member1.jpg" alt="" class="wp-image-2820" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member1.jpg 658w, https://depfields.com/wp-content/uploads/2020/06/dma-member1-300x37.jpg 300w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>変換データを格納するペリフェラル側の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">データレジスタ（ADC_DR）のアドレスを指定</span></strong>します。<br>これはペリフェラルライブラリstm32f10x.h内で定義されている<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC1のアドレスのレジスタ名(DR)で指定</span></strong>しておきます。実際のアドレスはレファレンスマニュアルに記載しているもの((uint32_t)0x4001244C)で直接指定してもよいです。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="656" height="82" src="https://depfields.com/wp-content/uploads/2020/06/dma-member2.jpg" alt="" class="wp-image-2822" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member2.jpg 656w, https://depfields.com/wp-content/uploads/2020/06/dma-member2-300x38.jpg 300w" sizes="(max-width: 656px) 100vw, 656px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>変換データを格納する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">メモリ側のアドレス</span></strong>を指定します。この例では<strong>配列変数ADCConvertedValue[2]</strong>のアドレスとして<strong>&amp;ADCConvertedValueと指定</strong>しています。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="652" height="126" src="https://depfields.com/wp-content/uploads/2020/06/dma-member3.jpg" alt="" class="wp-image-2825" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member3.jpg 652w, https://depfields.com/wp-content/uploads/2020/06/dma-member3-300x58.jpg 300w" sizes="(max-width: 652px) 100vw, 652px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">データの転送方向を指定</span></strong>します。ACコンバータの変換値レジスタからメモリの場合はDMA_DIR_PeripheralSRTを指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="652" height="166" src="https://depfields.com/wp-content/uploads/2020/06/dma-member4.jpg" alt="" class="wp-image-2826" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member4.jpg 652w, https://depfields.com/wp-content/uploads/2020/06/dma-member4-300x76.jpg 300w" sizes="(max-width: 652px) 100vw, 652px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMAチャネルの優先度</span></strong>はDMA_Priorith_High(高)を指定しておきます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma-member5.jpg" alt="" class="wp-image-2828" width="658" height="82" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member5.jpg 662w, https://depfields.com/wp-content/uploads/2020/06/dma-member5-300x38.jpg 300w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">転送するデータ数</span></strong>を指定します。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">2チャネル分</span></strong>であれば<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">2</span></strong>となります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="663" height="121" src="https://depfields.com/wp-content/uploads/2020/06/dma-member6.png" alt="" class="wp-image-10069" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member6.png 663w, https://depfields.com/wp-content/uploads/2020/06/dma-member6-300x55.png 300w" sizes="(max-width: 663px) 100vw, 663px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="651" height="111" src="https://depfields.com/wp-content/uploads/2020/06/dma-member7.jpg" alt="" class="wp-image-11471" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member7.jpg 651w, https://depfields.com/wp-content/uploads/2020/06/dma-member7-300x51.jpg 300w" sizes="(max-width: 651px) 100vw, 651px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>DMA_PeripheralInc</strong>と<strong>DMA_MemoryInc</strong>はデータ転送時に<strong>転送ごとにメモリのアドレスを自動的に増やしてくれます</strong>。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="657" height="140" src="https://depfields.com/wp-content/uploads/2020/06/dma-member8.jpg" alt="" class="wp-image-2831" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member8.jpg 657w, https://depfields.com/wp-content/uploads/2020/06/dma-member8-300x64.jpg 300w" sizes="(max-width: 657px) 100vw, 657px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="652" height="136" src="https://depfields.com/wp-content/uploads/2020/06/dma-member9.jpg" alt="" class="wp-image-2832" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member9.jpg 652w, https://depfields.com/wp-content/uploads/2020/06/dma-member9-300x63.jpg 300w" sizes="(max-width: 652px) 100vw, 652px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>DMA_PeripheralDataSizeとDMA_MemoryDataSizeはそれぞれ<strong>ペリフェラルとメモリのデータビット長を指定</strong>します。ADCの扱うデータ長は16ビットなので<strong>HalfWord</strong>を指定しています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma-member10.jpg" alt="" class="wp-image-2833" width="648" height="116" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member10.jpg 658w, https://depfields.com/wp-content/uploads/2020/06/dma-member10-300x54.jpg 300w" sizes="(max-width: 648px) 100vw, 648px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>サーキュラモードを指定すると指定チャネル数のデータが指定メモリのアドレスへ自動転送を繰り返します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma-member11.jpg" alt="" class="wp-image-2834" width="658" height="118" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-member11.jpg 667w, https://depfields.com/wp-content/uploads/2020/06/dma-member11-300x54.jpg 300w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ペリフェラルとメモリ間の転送でなく、メモリ上のあるアドレスからメモリ上の別アドレスへ転送する場合に有効にします。今回は使用しません。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>各メンバの指定が終了しましたので、初期化関数<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_Init(DMA1_Channel1, &amp;DMA_InitStructure)</span></strong>を実行します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　DMA1の有効化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまででDMAの初期化ができましたのでここで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_Cmd関数を実行</span></strong>して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMAを有効化</span></strong>します。</p>
</div></div></div>



<p>DMA有効化関数実行例：　DMA_Cmd(DMA1_Channel1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のDMAのチャネル(DMA<em>x</em>_Channel<em>y</em>))を指定</strong>(<em>x</em>:1-2, <em>y</em>:1-7)し、第2引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　DMA1要求の有効化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここまでで、DMAの初期設定は完了し、有効化したのでスタンバイ状態です。実際にデータの転送を始めるには各ペリフェラルからDMA転送開始させるための<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA要求の有効化</span></strong>を行う必要があります。サンプル例ではADコンバータのADC1のチャネル1とチャネル2の変換と同時に転送を開始続けるために<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_DMACmd関数を実行</span></strong>します。</p>
</div></div></div>



<p>DMA要求の有効化関数の実行例：ADC_DMACmd(ADC1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のADコンバータ(ADC1-3：マイコンによります)を指定</strong>し、第2引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これでADコンバータでの2チャンネル分の変換と同時に指定したメモリへ変換値が自動的に繰り返し転送されます。</p>
</div></div></div>



<h2 class="wp-block-heading">シリアル通信のDMA転送</h2>



<h3 class="wp-block-heading">文字列受信DMA転送</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>DMAをつかったUSART通信の受信プログラムは比較的に単純です。<br>ここでは受信データ6文字分をDMAによりシリアル通信受信レジスタからメモリに自動転送する例を解説します</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-receive.jpg" alt="" class="wp-image-2858" width="566" height="260" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-receive.jpg 676w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-receive-300x138.jpg 300w" sizes="(max-width: 566px) 100vw, 566px" /><figcaption>シリアル通信DMA受信</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="658" height="792" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting1.png" alt="" class="wp-image-10075" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting1.png 658w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting1-249x300.png 249w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　データ格納変数など準備&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>シリアルUSART通信の受信においてここでは<strong>DMAで<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">6文字分転送する設定（6文字の文字列）</span></strong>にするため、変数など準備します。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">配列RxData[]に受信文字を格納</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　DMA1(USART3_RX)にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART3受信はDMA要求がDMA1のCH3に発せられるので使用するDMA1にクロックを供給</span></strong>します。DMAはAHBに接続していますのでAHBに供給します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　DMA1_CH3(USART3_RX)のIRQ割り込み</span><span style="background-color: #003300; color: #ffffff;">設定</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>今回はDMAで受信データがメモリに転送完了したときに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みを使用</span></strong>するため<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">優先度を設定します（優先度0)</span></strong>。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　DMA1_CH3初期設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>DMAの初期設定をします。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">転送先のメモリRxData[]のアドレス</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">転送数(RX_BUFFER)</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">転送データは1文字8bitなのでDataSizeはByte</span></strong>としています。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">受信はサーキュラモード</span></strong>としています。こうするとデータを受信してバッファが一杯になったところで最初にもどるリングバッファとなります。<br>パラメータを構造体メンバに設定してからADCの時と同様に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_Init関数を実行</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMAの転送が完了した時点で割り込み処理</span></strong>を行いたいために転送完了割り込みを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA_ITConfig関数で有効化</span></strong>します。</p>
</div></div></div>



<p>DMA転送完了割り込み有効化実行例：DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第1引数には<strong>設定対象のDMAのチャネル(DMA<em>x</em>_Channel<em>y</em>))を指定(x:1-2, y:1-7)</strong>し、第2引数は<strong>割り込み発生要因</strong>、第3引数は<strong>ENABLEで割り込み有効、DISABLEで割り込み無効</strong>となります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="488" height="139" src="https://depfields.com/wp-content/uploads/2020/06/dma-it.jpg" alt="" class="wp-image-2873" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-it.jpg 488w, https://depfields.com/wp-content/uploads/2020/06/dma-it-300x85.jpg 300w" sizes="(max-width: 488px) 100vw, 488px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　DMA1の有効化</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>設定終了後、DMA_Cmd関数を実行してDMAを有効化します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　USART3の設定およびDMA1(USART3_RX)要求の有効化</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>USART3の初期設定をしてから、DMA転送開始させるための<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DMA要求の有効化</span></strong>します。USARTのDMA要求は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_DMACmd関数で実行</span></strong>します。関数の第1引数には<strong>設定対象のUSART</strong>を指定し、第2引数には<strong>設定対象のDMA要求</strong>を、第3引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="485" height="282" src="https://depfields.com/wp-content/uploads/2020/06/usart-dmacmd.jpg" alt="" class="wp-image-2875" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dmacmd.jpg 485w, https://depfields.com/wp-content/uploads/2020/06/usart-dmacmd-300x174.jpg 300w" sizes="(max-width: 485px) 100vw, 485px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これより、シリアルUSART3で受信が発生するたびにデータが自動でメモリRxData[]に転送されます。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="608" height="319" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting2.jpg" alt="" class="wp-image-2854" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting2.jpg 608w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-rx-setting2-300x157.jpg 300w" sizes="(max-width: 608px) 100vw, 608px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑦　通常アプリ内の処理&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>受信割り込みが発生してから所望の文字列を取得したりする処理はアプリケーション内に作成します。<br>この例では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みが発生したときだけ判別フラグrx_flagが1</span></strong>になるので、判別に応じて処理を行います。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑧　DMA割り込みハンドラ&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>DMAで転送が完了すると割り込みが発生し、割り込みハンドラDMA1 Channel3 USART3_RXが起動します。この割り込みハンドラが起動したときに、割り込み要因が転送完了であるかどうかを判別するために、<strong>DMA_GetITStatus</strong>関数を実行して確認します。</p>
</div></div></div>



<p>DMA割り込み有効化関数実行例：　DMA_GetITStatus(DMA1_IT_TC3);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここでも割り込みフラグは<strong>DMA_ClearITPengingBit</strong>関数で割り込みビットフラグをクリア（0にする）しておきます。割り込み処理としては、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み判別フラグrx_flagを1に設定</span></strong>すると、アプリケーション内で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">判別フラグが1のときだけ受信処理を実行</span></strong>できます。</p>
</div></div></div>



<p>DMA割り込みフラグ(ペンディングビット)クリア関数実行例：　DMA_ClearITPendingBit(DMA1_IT_TC3);</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma-it-flag.jpg" alt="" class="wp-image-2877" width="471" height="137" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-it-flag.jpg 483w, https://depfields.com/wp-content/uploads/2020/06/dma-it-flag-300x88.jpg 300w" sizes="(max-width: 471px) 100vw, 471px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>もちろん、厳密に割り込み時点に処理をしたい場合は割り込みハンドラ内に処理を記述しますが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">あまり大きく重い処理はしないように注意</span></strong>します。</p>
</div></div></div>





<h3 class="wp-block-heading">文字列送信DMA転送</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>DMAを使用した文字列送信は割り込みを使用していない基本的なものを例にあげて解説します。<br>シンプルな送信プログラムですが、DMAの働きがよくわかります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず転送する<strong>文字列を格納する配列TxData[]を準備</strong>します。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字数（配列数）</span></strong>つまりDMAに指定するBuffer_Sizeは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信の都度文字列に応じて指定</span></strong>します。受信の場合と異なるところは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">変換モードが連続のサーキュラモードではなくノーマルモードを指定</span></strong>しているところです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この場合は送信ごとに転送するデータ数を管理するレジスタDMA_CNDTRxの値として転送分の文字数(DMA_BufferSize)を指定する必要があります。このレジスタは転送がはじまるとインクリメント（増加）していき、指定値に達すると0に戻ります。サーキュラモードの場合はこれを繰り返すのですが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ノーマルモードでは何もしないとレジスタ値は0のまま</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこでサンプルプログラムでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信のたびにDMAを初期化して転送サイズを指定</span></strong>しています。慣れてくるとこのレジスタ値だけを指定すればよいので、<strong>DMA1_Channel2 -&gt; CNDTR= <span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">BufferSize</span></strong>のように<strong>レジスタに直接設定</strong>することもできます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>レジスタを直接操作すると無駄がなくなるので、プログラムはより軽く速く効率がよくなります。ただし、直感的に理解しにくくはなりますが。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-transmit.jpg" alt="" class="wp-image-2865" width="503" height="321" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-transmit.jpg 511w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-transmit-300x191.jpg 300w" sizes="(max-width: 503px) 100vw, 503px" /><figcaption>シリアル通信DMA送信</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting1.jpg" alt="" class="wp-image-2885" width="489" height="434" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting1.jpg 520w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting1-300x266.jpg 300w" sizes="(max-width: 489px) 100vw, 489px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="686" height="501" src="https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting2.png" alt="" class="wp-image-10087" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting2.png 686w, https://depfields.com/wp-content/uploads/2020/06/usart-dma-tx-setting2-300x219.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　設定パラメータ、関数等の宣言&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>設定パラメータ等を宣言します。通信プログラムでは送受信を処理する部分は関数にまとめておいてから、アプリ内で任意のタイミングで使うことが多いため、作成する関数の宣言をしておきます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②③</span><span style="background-color: #003300; color: #ffffff;">　設定パラメータ、関数等の宣言&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するペリフェラルにクロックを供給し、GPIOをはじめ、初期化しておきます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④</span><span style="background-color: #003300; color: #ffffff;">　アプリケーション内の通常処理&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>アプリケーションプログラム本体で文字列送信を実行しています。サンプルでは単に登録した文字を無限に表示するものですが、DMAとシリアル送信が機能している動作が確認できます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤</span><span style="background-color: #003300; color: #ffffff;">　よく使う処理の関数化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>今回作成した送信関数および送信関数内で使用するDMA初期化部も関数化しています。送信関数を実行し、DMA転送を開始するたびにDMA_Cmd関数を実行しています。<strong>DMA_GetFlagStatus関数</strong>を利用してDMAによる転送が完了するまで待機しています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/dma-flag.jpg" alt="" class="wp-image-2891" width="466" height="161" srcset="https://depfields.com/wp-content/uploads/2020/06/dma-flag.jpg 494w, https://depfields.com/wp-content/uploads/2020/06/dma-flag-300x104.jpg 300w" sizes="(max-width: 466px) 100vw, 466px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここまでで、DMAによる転送を行ったシリアル送信の解説をしてきましたが、ここでも転送完了で待機しているためこのままではあまり実用的ではありません。DMA転送を使用する場合は、CPUの負担を減らさなければあまり意味がないため、もうひと工夫必要です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div style="background: #00ccff; padding: 5px 10px; color: #ffffff; border-radius: 10px 10px 0 0;"><strong>コラム</strong></div>
<div style="background: #ffffea; padding: 10px; border: 2px solid #00ccff; border-radius: 0 0 10px 10px;">
<p>実際の教材を使用したアプリケーションプログラムにおいては<strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">実用的なノウハウがつまっています</span></strong>ので、ぜひご覧いただき、さらに発展させてみてください。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/dma/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/9bdbab6fa5ea930a97b2fdc3312224e7eb6141191b4befc1b48057faef269401.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">DMA (Direct Memory Access) [DMA details of STM32] | Most Powerful Bible to Be...</div></div><div class="lkc-url">https://en.depfields.com/dma/</div><div class="lkc-excerpt">Although DMA is not an essential skill for beginners or novice users, it may be required in practice because DMA reduces the CPU load, allowing CPU capacity to be used for other processing and contributing to power savings. In this chapter</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/dma/">DMA(Direct Memory Access)【STM32のDMA詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>シリアル通信SPI【STM32のSPI詳細】</title>
		<link>https://depfields.com/spi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spi</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2020 07:18:18 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[SPI]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2756</guid>

					<description><![CDATA[<p>STM32に内蔵のペリフェラルSPIの使い方を解説しています。この章ではSPI仕様のEEPROMへのデータの読み込および書き込を例に解説しています。 シリアル通信SPIとは SPI通信初期化手順 目的：使用するSPIはS [&#8230;]</p>
<p>The post <a href="https://depfields.com/spi/">シリアル通信SPI【STM32のSPI詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="358" src="https://depfields.com/wp-content/uploads/2020/06/internet-4546508_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/internet-4546508_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/internet-4546508_640-300x168.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/internet-4546508_640-320x180.jpg 320w" sizes="(max-width: 640px) 100vw, 640px" /></div>


<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">STM32に内蔵のペリフェラルSPIの使い方を解説しています。この章ではSPI仕様のEEPROMへのデータの読み込および書き込を例に解説しています。</p>







<h2 class="wp-block-heading">シリアル通信SPIとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">シリアル通信SPI</span></strong>は<strong>同期型シリアル通信</strong>の一つです。<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>クロック(SCLK)</strong>、<strong>入力MOSI</strong>、<strong>出力MISO</strong>、<strong>チップセレクト(CS)の4本の信号線</strong></span>で通信を行います。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPIに接続されるデバイスには<strong>マスタ</strong>と<strong>スレーブ</strong>があります。1つのマスタデバイスに<strong>共通のバスで複数のスレーブデバイスを接続</strong>でき、<strong>通信時にチップセレクト（CS）で通信対象のデバイスを選択</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-connection.jpg" alt="" class="wp-image-2758" width="351" height="417" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-connection.jpg 349w, https://depfields.com/wp-content/uploads/2020/06/spi-connection-252x300.jpg 252w" sizes="(max-width: 351px) 100vw, 351px" /><figcaption class="wp-element-caption">シリアルSPI通信</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI通信はデバイスにより通信フォーマットは様々ですが、チップセレクト（CS）信号で通信対象のデバイスを選択し、通常は<strong>8ビット（1バイト）データを一単位としてコマンドやアドレスなどを送信（書き込み）し、デバイスレジスタからの応答データを受信（読み込み）します</strong>。I2C通信と比べると配線は4本で多いですが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">通信の仕組みがシンプルで高速</span></strong>なのが特徴です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32のSPIコントローラはマスタおよびスレーブのどちらも対応できますが、ここではEEPROM(Rohm社製BR25G640-3)を使用したSPIマスタの解説をします。SPIはマスタが主導で、<strong>命令を実行するたびにクロックを発生</strong>させて8ビットデータをやりとりします。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom.jpg" alt="" class="wp-image-2759" width="333" height="246" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom.jpg 349w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-300x222.jpg 300w" sizes="(max-width: 333px) 100vw, 333px" /><figcaption class="wp-element-caption">SPI型EEPROM接続回路</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPROMの命令モードは<strong>下記6種類</strong>です。このうちステータスレジスタの読み出し命令を与えた時のタイムチャートをみてみます。このEEPROMでは書き込み（MISO）はクロック(SCLK)の立ち上がりエッジに同期してデバイス内部に取り込まれ、読み込み（MOSI）はクロック(SCLK)の立下りエッジに同期してデバイス内部に取り込まれます。<strong>1バイト（8ビット）単位のリードステータスレジスタ(RDSR)コマンドコードを送信すると次の1バイト（8ビット）単位でステータスデータが返ってきます</strong>。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>メモリデータの読み書きの場合にはリード（READ）やライト（WRITE）コマンドコードをデータ格納用メモリのアドレス（2バイト）を上位と下位の1バイトずつ分けたものとセットで送受信します。この例のEEPROMのアドレスは2バイトですが、デバイスにより異なる場合があります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-command.jpg" alt="" class="wp-image-2760" width="612" height="230" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-command.jpg 705w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-command-300x113.jpg 300w" sizes="(max-width: 612px) 100vw, 612px" /></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-status-read.jpg" alt="" class="wp-image-2761" width="558" height="248" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-status-read.jpg 711w, https://depfields.com/wp-content/uploads/2020/06/spi-status-read-300x133.jpg 300w" sizes="(max-width: 558px) 100vw, 558px" /><figcaption class="wp-element-caption">ステータスレジスタ読み出し命令</figcaption></figure>



<h2 class="wp-block-heading">SPI通信初期化手順</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず、他のペリフェラルと同様に初期化を解説します。</p>
</div></div></div>



<p>目的：使用するSPIはSPI1でPB3-5を使用<br>■　チップセレクトはPE0</p>



<figure class="wp-block-image size-full"><img decoding="async" width="572" height="669" src="https://depfields.com/wp-content/uploads/2020/06/spi-setting.jpg" alt="" class="wp-image-13554" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-setting.jpg 572w, https://depfields.com/wp-content/uploads/2020/06/spi-setting-257x300.jpg 257w" sizes="(max-width: 572px) 100vw, 572px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　GPIOおよびSPI1にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">GPIOおよびSPI1にクロックを供給</span></strong>します。APB2バスに接続していますので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">APB2に供給</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　GPIOの設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI1に使用するポートはSCK,MISO,MOSIでPB3-5を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">オルタネートプッシュプル出力に指定</span></strong>します。ここではGPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE)を実行してリマップしてPB3-5およびPA15をSPI1に設定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このうちPA15はSTM32のSPI_NSSでマスタとするときは使用しません。さらに、PB3とPB4に関してはデフォルトではデバッグ用ポートの機能が割り当てられていますのでそのままでは使用できません。そこで、通常のGPIOポートに開放するためGPIO_PinRemapConfig(<strong>GPIO_Remap_SWJ_JTAGDisable, ENABLE</strong>)を実行しています。リマップでなくデフォルトのSPIを使用する場合はこの処理は不要です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">チップセレクトCS用にはPE0</span></strong>を通常のプッシュプル出力に設定しています。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　SPIの初期設定</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SPI通信の初期設定を実行</span></strong>します。まず初期化のはじめに対象のチップセレクトCS（PE0）をHレベルにしてSPI通信を受け付けないようにしておきます。</p>
</div></div></div>



<p>SPI初期化関数実行例： SPI_Init(SPI1, &amp;SPI_InitStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象の</strong>SPI(SPI1-3：マイコンによります）、第2引数は<strong>構造体メンバ</strong>になっていて以下に示します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-member1.jpg" alt="" class="wp-image-2764" width="657" height="161" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member1.jpg 724w, https://depfields.com/wp-content/uploads/2020/06/spi-member1-300x73.jpg 300w" sizes="(max-width: 657px) 100vw, 657px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_Directionメンバにはデータの方向性を指定します。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">通常は2線・全二重</span></strong>を指定します。</p>
</div></div></div>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-member2.png" alt="" class="wp-image-13730" width="658" height="129" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member2.png 841w, https://depfields.com/wp-content/uploads/2020/06/spi-member2-300x59.png 300w, https://depfields.com/wp-content/uploads/2020/06/spi-member2-768x151.png 768w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_ModeメンバにはSPIのモードを指定します。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マスタモード</span></strong>を指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-member3.jpg" alt="" class="wp-image-2766" width="654" height="123" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member3.jpg 721w, https://depfields.com/wp-content/uploads/2020/06/spi-member3-300x57.jpg 300w" sizes="(max-width: 654px) 100vw, 654px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_DataSizeメンバにはデータサイズを指定します。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">８ビットデータ</span></strong>を扱います。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-member4.jpg" alt="" class="wp-image-2767" width="661" height="198" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member4.jpg 727w, https://depfields.com/wp-content/uploads/2020/06/spi-member4-300x90.jpg 300w" sizes="(max-width: 661px) 100vw, 661px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_CPOLメンバには待機中のSCLKの信号レベルを指定します。SPI_CPHAメンバにはデータを読み込むクロックのタイミングを指定します。クロックの立ち上がりエッジでデータを読み込むためには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">待機中のSCLKの信号レベルはL</span></strong>としていて<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">最初のエッジタイミングで読み込む</span></strong>ように指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_CPOLメンバは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロックの極性</span></strong>、SPI_CPHAメンバは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロックの位相</span></strong>を意味し、これらの組み合わせで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SPIモード</span></strong>と呼ばれるSPI通信モードを設定します。スレーブ側のデバイスによっては使用できるモードが限られていますので適切に設定します。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="467" height="164" src="https://depfields.com/wp-content/uploads/2020/06/spi-transfer-mode.jpg" alt="" class="wp-image-13582" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-transfer-mode.jpg 467w, https://depfields.com/wp-content/uploads/2020/06/spi-transfer-mode-300x105.jpg 300w" sizes="(max-width: 467px) 100vw, 467px" /><figcaption class="wp-element-caption">SPI通信モード</figcaption></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="676" height="709" src="https://depfields.com/wp-content/uploads/2022/06/spi-time-chart.jpg" alt="" class="wp-image-13588" srcset="https://depfields.com/wp-content/uploads/2022/06/spi-time-chart.jpg 676w, https://depfields.com/wp-content/uploads/2022/06/spi-time-chart-286x300.jpg 286w" sizes="(max-width: 676px) 100vw, 676px" /><figcaption class="wp-element-caption">SPIタイムチャート(レファレンスマニュアルより）</figcaption></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-member5.png" alt="" class="wp-image-11178" width="678" height="254" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member5.png 726w, https://depfields.com/wp-content/uploads/2020/06/spi-member5-300x112.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_BaudRatePrescalerメンバには通信速度を設定するための<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">プリスケーラの分周比</span></strong>を指定します。例えば16分周を指定するとPCLK2が72MHzの場合はSPIに供給されるクロックは4MHzになります。EEPROMの仕様によりクロックの最高速度が定められていますので<strong>超えないものを指定</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="725" height="139" src="https://depfields.com/wp-content/uploads/2020/06/spi-member6.jpg" alt="" class="wp-image-2770" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-member6.jpg 725w, https://depfields.com/wp-content/uploads/2020/06/spi-member6-300x58.jpg 300w" sizes="(max-width: 725px) 100vw, 725px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI_FirstBitメンバにはデータ送信をMSBから行うMSBファーストかLSBから行うLSBファーストを指定します。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">通常はMSBファースト</span></strong>を指定します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　SPI1の有効化</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまででSPI通信の初期化ができましたのでSPI_Cmd関数を実行してSPI通信をを有効にします。</p>
</div></div></div>



<p>SPI初期化関数実行例： SPI_Cmd(SPI1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のSPI(SPI1-3:マイコンによります)</strong> を指定し、第2引数は<strong>ENABLEで有効</strong>、<strong>DISABLEで無効</strong>となります。</p>
</div></div></div>



<h2 class="wp-block-heading">SPI通信のバイト送受信</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPIコントローラの<strong>初期化が完了</strong>すると、アプリケーションプログラム内で<strong>任意に通信を開始することができます</strong>。共通のSPIバスに複数のデバイスを接続している場合は通信毎に対象のデバイスをCS信号で選択し、通信を実行して終了時には選択解除します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI通信において最も基本的な1バイトデータを送受信する流れをみていきましょう。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-read-write.jpg" alt="" class="wp-image-2771" width="562" height="311" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-read-write.jpg 562w, https://depfields.com/wp-content/uploads/2020/06/spi-read-write-300x166.jpg 300w" sizes="(max-width: 562px) 100vw, 562px" /><figcaption class="wp-element-caption">SPI通信のバイト送受信</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-comunication-flow.jpg" alt="" class="wp-image-2772" width="523" height="442" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-comunication-flow.jpg 630w, https://depfields.com/wp-content/uploads/2020/06/spi-comunication-flow-300x253.jpg 300w" sizes="(max-width: 523px) 100vw, 523px" /><figcaption class="wp-element-caption">SPI通信流れ</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　SPIデバイス選択（チップセレクト）</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>通信対象のSPIデバイスの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CS信号をLレベルにして選択</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　SPI送受信関数　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>1バイトデータを送受信するための手順を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SPI_Send_Receive関数</span></strong>にまとめました。データの送信を開始する前に、前回の送信が完了しているかどうかを<strong>SPI_I2S_GetFlagStatus関数</strong>の送信ステータスフラグ(<strong>SPI_I2S_FLAG_TXE)</strong>で確認します。フラグがSETになった段階で送信レジスタが空になったことになります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-status-flag.jpg" alt="" class="wp-image-2773" width="575" height="265" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-status-flag.jpg 664w, https://depfields.com/wp-content/uploads/2020/06/spi-status-flag-300x138.jpg 300w" sizes="(max-width: 575px) 100vw, 575px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信準備完了しだい<strong>SPI_I2S_SendData関数</strong>で1バイトデータを送信します。関数の第1引数は<strong>設定対象のSPI(SPI1-3:マイコンによります)</strong>を指定し、第2引数は<strong>送信する<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">1バイトデータ</span></strong>を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>データ送信すると同時に相手からデータが返ってきて受信レジスタに入るのですが入っているかどうかを<strong>SPI_I2S_GetFlagStatus関数</strong>の受信ステータスフラグ(<strong>SPI_I2S_FLAG_RXNE)</strong>で確認します。フラグがSETになった段階で受信レジスタにデータがあることになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>受信準備ができたところで<strong>SPI_I2S_ReceiveData関数</strong>を実行して受信データを取得します。この関数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SPIが最後に受信したデータを返し</span></strong>ます。関数の引数は <strong>設定対象のSPI(SPI1-3:マイコンによります)</strong> を指定します。<strong>データを読み込むと受信フラグは自動的にクリア</strong>されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPI通信はマスタ側とスレーブ側は発生したクロックに合わせてデータを同時通信します。マスタが1バイトコマンドを送信中すると同時にスレーブ側からも0x00や0xFFの1バイトデータが返されて受信レジスタに格納されます。そのため、<strong>SPI_Send_Receive関数</strong>では受信フラグをクリアして、受信データを取得する処理も含めています。送信のときは受信データの返り値は使用しません。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　SPIデバイス選択解除　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>通信完了後は通信対象のSPIデバイスの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CS信号をHレベルにして選択解除</span></strong>します。その前に、通信が完了してビジー状態でないことを<strong>SPI_I2S_GetFlagStatus関数</strong>のビジー状態フラグ(<strong>SPI_I2S_FLAG_BSY)</strong>で確認しておきます。フラグがSETである段階ではビジー状態ですので待機します。</p>
</div></div></div>



<h2 class="wp-block-heading">EEPROM書き込み</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでは1バイトデータ送受信の流れを見てきました。実際の送受信で例えばEEPROMの書き込みと読み込みでは作成した送受信関数<strong>SPI_Send_Receive関数</strong>を組み合わせてコマンド、アドレスを順次送り、その後データを送信したり、受信したりします。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="252" height="547" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write.jpg" alt="" class="wp-image-11464" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write.jpg 252w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write-138x300.jpg 138w" sizes="(max-width: 252px) 100vw, 252px" /><figcaption class="wp-element-caption">EEPROM書き込み</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write-function.jpg" alt="" class="wp-image-2776" width="594" height="576" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write-function.jpg 694w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-write-function-300x291.jpg 300w" sizes="(max-width: 594px) 100vw, 594px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPROM書き込み専用に<strong>SPI_EEPROM_writebyte関数</strong>を作成してみましょう。</p>
</div></div></div>



<p>SPI_EEPROMバイトデータ書き込み関数実行例： SPI_EEPROM_writebyte(Address, Data);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このEEPROMは<strong>アドレスが16ビット</strong>ですので、関数の第1引数は<strong>16ビットアドレス</strong>を指定し、第2引数は<strong>格納したい1バイト（8ビット）データ</strong>を指定する関数を定義します。書き込みコマンドバイト、アドレスバイト、データバイトなど複数のバイトデータを送信する一連の手順を関数内にまとめます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　デバイスアドレス　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPIで通信するデータは1バイト単位ですので、指定するアドレスを関数内で1バイト分の上位アドレスと下位アドレスに分離しておきます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　書き込み許可　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>書き込みの場合は書き込み許可に設定しておく必要があります。<strong>EEPROM_write_enable関数</strong>にまとめましたので書き込み前に実行しておきます。わざわざ関数にまとめなくてもEEPROMのイネーブルコマンドバイトWRENを<strong>SPI_EEPROM_writebyte関数内</strong>の書き込みコマンドバイトWRITEの前に送信してもかまいません。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　書き込みコマンドバイト送信　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>書き込みコマンドバイトWRITE、上位アドレス、下位アドレス、そして格納したいバイトデータの順に送信します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　ステータスレジスタによる待機　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>書き込みにはある程度時間がかかりますので、ステータスレジスタ読み込みコマンドバイトRDSRを送信して得られたステータスレジスタのビット0の状態がビジーでなくなるまで待機するようにします。<strong>Write_wait関数</strong>にまとめています。</p>
</div></div></div>



<h2 class="wp-block-heading">EEPROM読み込み</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPROMの読み込みの場合は書き込みの手順とほぼ同じですが<strong>書き込み許可のコマンド送信は必要ありません</strong>。書き込みのときと同様にアドレスを上位と下位に分離しておきます。読み込みの場合はレジスタからデータを一時メモリに取り込み関数の返り値として渡します。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="216" height="422" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read.jpg" alt="" class="wp-image-11466" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read.jpg 216w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read-154x300.jpg 154w" sizes="(max-width: 216px) 100vw, 216px" /><figcaption class="wp-element-caption">EEPROM読み込み</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read-function.jpg" alt="" class="wp-image-2778" width="562" height="261" srcset="https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read-function.jpg 660w, https://depfields.com/wp-content/uploads/2020/06/spi-eeprom-read-function-300x139.jpg 300w" sizes="(max-width: 562px) 100vw, 562px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPROM読み込み専用に<strong>SPI_EEPROM_readbyte関数</strong>を作成してみましょう。</p>
</div></div></div>



<p>SPI_EEPROMバイトデータ読み込み関数実行例： Data = SPI_EEPROM_readbyte(Address);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は読み込みたいデータを格納している<strong>16ビットアドレス</strong>を指定します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　読み込みコマンドバイト送信　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>読み込みコマンドバイトREAD、上位アドレス、下位アドレスのバイトデータの順に送信します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　ダミーバイト送信　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>データを取り出すために、なんらかのバイトデータを送信すると<strong>SPI_Send_Receiver関数</strong>が返り値として受信データが取得できますので、一時メモリretに取り組みます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　受信データ取得　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SPIデバイス選択解除をしてから一時メモリretを<strong>SPI_EEPROM_readbyte関数</strong>の返り値とすると読み込みのたびにこの関数を実行すればバイトデータが取得できます。</p>
</div></div></div>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/spi/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/fe1a0997a7a1b74b5e31ea46cb292e38b5ba7f800eb20517d80a656e51ffe68c.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Serial communication SPI[SPI details of STM32] | Most Powerful Bible to Becom...</div></div><div class="lkc-url">https://en.depfields.com/spi/</div><div class="lkc-excerpt">This section explains how to use the STM32&#039;s built-in peripheral SPI. In this chapter, reading and writing data to and from an SPI-specification EEPROM is explained as an example.What is Serial Communication SPI?Serial Commu</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/spi/">シリアル通信SPI【STM32のSPI詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>シリアル通信I2C【STM32のI2C詳細】</title>
		<link>https://depfields.com/i2c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=i2c</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Mon, 08 Jun 2020 07:01:09 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2707</guid>

					<description><![CDATA[<p>STM32に内蔵のペリフェラルI2Cの使い方を解説しています。この章ではI2C仕様のEEPROMへのデータの読み込および書き込を例に解説しています。 シリアル通信I2Cとは I2C通信初期化手順 目的：使用するI2CはI [&#8230;]</p>
<p>The post <a href="https://depfields.com/i2c/">シリアル通信I2C【STM32のI2C詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="453" src="https://depfields.com/wp-content/uploads/2020/06/2760625_s.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/2760625_s.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/2760625_s-300x212.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">STM32に内蔵のペリフェラルI<sup>2</sup>Cの使い方を解説しています。この章ではI<sup>2</sup>C仕様のEEPROMへのデータの読み込および書き込を例に解説しています。</p>







<h2 class="wp-block-heading">シリアル通信I<sup>2</sup>Cとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">シリアル通信I<sup>2</sup>C</span></strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">同期型の双方向通信</span></strong>です。Philips社が提唱したシリアル通信方式です。信号線が2本だけでそのうちの一本が<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">データを双方向でやり取りする信号線SDA</span></strong>（Serial Data Line）で、他方が同期用<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロック信号線SCL</span></strong>(Serial Clock Line)です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>特徴としては<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マスタ</span></strong>側と<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">スレーブ</span></strong>側に分かれ、マスタ側が通信をすべてコントロールしています。I<sup>2</sup>C では一つのバスに複数のスレーブを接続することができます。バスは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">オープンドレインで接続</span></strong>されているため<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">プルアップ抵抗（電源電圧が3.3Vのとき、2.2k程度）が必要</span></strong>です。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-connection.jpg" alt="" class="wp-image-2709" width="264" height="365" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-connection.jpg 263w, https://depfields.com/wp-content/uploads/2020/06/i2c-connection-217x300.jpg 217w" sizes="(max-width: 264px) 100vw, 264px" /><figcaption>シリアルI2C通信</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>Cでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">1文字（1バイト）ずつ送受信し</span></strong>,1バイト転送毎に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">受信側からACK（アクノリッジ）信号を返送</span></strong>し、互いに確認を取りながら（ハンドシェイク）転送を行います。マスタが受信を終了させたい時点でACKを返さないNACK（ノットアクノリッジ）とします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>その後ストップコンディションを生成して通信を終了させます。I<sup>2</sup>Cデバイスは個々にスレーブアドレスを持っていて、スレーブデバイス内の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">指定アドレスのレジスタやメモリとアクセスしてデータのやり取り</span></strong>をします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここではI<sup>2</sup>C通信仕様のEEPROMを使用したデータの送受信を実際のプログラムで解説していきます。<br><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I<sup>2</sup>C通信を使った送受信はルールが規格できまったものであるためメーカーなどが作成したサンプルプログラムなどを参考に、ある程度決まった形式のものを使用するのが無難</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず、他のペリフェラルと同様に初期化を解説します。</p>
</div></div></div>



<h2 class="wp-block-heading">I<sup>2</sup>C通信初期化手順</h2>



<p>目的：使用するI<sup>2</sup>CはI<sup>2</sup>C1でGPIOはPB6とPB7<br>■　I<sup>2</sup>Cモードで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ACK有効</span></strong><br>■　ACKを返すアドレス長は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">7ビット</span></strong><br>■　<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロックスピードは200000でデューティ比は1：1</span></strong></p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-setting.jpg" alt="" class="wp-image-2710"/></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　I<sup>2</sup>C1にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するI<sup>2</sup>C1にクロックを供給します。APB1バスに接続していますのでAPB1に供給します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　I<sup>2</sup>C1に使用するGPIO設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C1に使用するIOは送受信にPB6とPB7をオルタネートオープンドレイン出力に指定します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　I<sup>2</sup>C1の初期設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C通信の初期設定を実行します。初期化はI2C_Init関数を実行して上記のパラメータを設定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象のI<sup>2</sup>C</strong>（I2C1,I2C2）、第2引数は<strong>構造体メンバ</strong>になっていて以下に示すとおりです。</p>
</div></div></div>



<p>I<sup>2</sup>C初期化関数実行例： I2C_Init(I2C1, &amp;I2C_InitStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C_Modeメンバには<strong>I<sup>2</sup>C通信ではI<sup>2</sup>Cモードを指定</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="780" height="177" src="https://depfields.com/wp-content/uploads/2020/06/i2c-member1.jpg" alt="" class="wp-image-2713" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-member1.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/i2c-member1-300x68.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/i2c-member1-768x174.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I2C_DutyCycleメンバには通常クロックパルスデューティ比で<strong>1:1</strong>にしておきます。このメンバは高速クロックの波形整形のためのもので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロック周波数がファストモードの場合にのみ有効</span></strong>なメンバです。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-member2.jpg" alt="" class="wp-image-2714" width="803" height="148" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-member2.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/i2c-member2-300x55.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/i2c-member2-768x142.jpg 768w" sizes="(max-width: 803px) 100vw, 803px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I2C_AckメンバはACK（アクノリッジ）を返す指定にするため<strong>I2C_Ack_Enable</strong>とします。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="780" height="145" src="https://depfields.com/wp-content/uploads/2020/06/i2c-member3.jpg" alt="" class="wp-image-2715" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-member3.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/i2c-member3-300x56.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/i2c-member3-768x143.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I2C_AcknowledgeAddressメンバはスレーブアドレス幅を指定します。スレーブデバイスの仕様に従い、ここでは<strong>7ビットを指定</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="780" height="151" src="https://depfields.com/wp-content/uploads/2020/06/i2c-member4.jpg" alt="" class="wp-image-2716" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-member4.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/i2c-member4-300x58.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/i2c-member4-768x148.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I2C_ClockSpeedメンバはクロック周波数を指定します。ここでは<strong>I2C_CLOCK(200000)を指定</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>クロック周波数が<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">100kHz以下であれば標準モード</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">それ以外ではファストモードが自動的に選択</span></strong>されるようになっています。200000の場合はファストモードとなります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="753" height="90" src="https://depfields.com/wp-content/uploads/2020/06/i2c-member5.jpg" alt="" class="wp-image-9574" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-member5.jpg 753w, https://depfields.com/wp-content/uploads/2020/06/i2c-member5-300x36.jpg 300w" sizes="(max-width: 753px) 100vw, 753px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　I<sup>2</sup>C1を有効化する&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまででI<sup>2</sup>C通信の初期化ができましたので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_Cmd関数を実行</span></strong>してI<sup>2</sup>Cポートを有効にします。</p>
</div></div></div>



<p>I<sup>2</sup>C通信有効化関数実行例：　I2C_Cmd(I2C1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のI2C1かI2C2</strong>を指定し、第2引数は<strong>ENABLEで有効</strong>、<strong>DISABLEで無効</strong>となります。</p>
</div></div></div>



<h2 class="wp-block-heading">I<sup>2</sup>C仕様EEPROM書き込み</h2>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom.jpg" alt="" class="wp-image-2719" width="298" height="202" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom.jpg 302w, https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-300x204.jpg 300w" sizes="(max-width: 298px) 100vw, 298px" /><figcaption><br><a>I2C</a>型EEPROM接続回路</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C書き込みは下記のフォーマット手順に従った書き込み関数<strong>I2C_EEPROM_Write()</strong>を作成し実行します。関数内では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">コマンド</span></strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">時系列で実行</span></strong>していきます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-write-format.jpg" alt="" class="wp-image-2720" width="535" height="170" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-write-format.jpg 535w, https://depfields.com/wp-content/uploads/2020/06/i2c-write-format-300x95.jpg 300w" sizes="(max-width: 535px) 100vw, 535px" /><figcaption>データ書き込み通信フォーマット</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32のI2C通信ではデータ転送の合間に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">さまざまなイベントが発生</span></strong>しています。実際のプログラムにおいては<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">イベントの状態を確認しながら手順を進めていく</span></strong>ことになります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-write.jpg" alt="" class="wp-image-2722" width="583" height="534" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-write.jpg 725w, https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-write-300x275.jpg 300w" sizes="(max-width: 583px) 100vw, 583px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　スタートコンディションの生成&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>スタートコンディションは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_GenerateSTART関数</span></strong>を実行して生成すると<strong>自動的にマスターモードとなり、スレーブ側との通信を開始</strong>します。</p>
</div></div></div>



<p>I2C_GenerateSTART関数の実行例： I2C_GenerateSTART(I2C1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象のI<sup>2</sup>C</strong>（I2C1,I2C2）、第2引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<p>I2C_CheckEvent関数の実行例： while(!I2C_CheckEvent(I2C1, <strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_EVENT_MASTER_MODE_SELECT</span></strong>));</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_CheckEvent関数</span></strong>を実行して、ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マスターモードになったかどうかを確認</span></strong>しています。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="753" height="428" src="https://depfields.com/wp-content/uploads/2020/06/i2c-event.jpg" alt="" class="wp-image-11461" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-event.jpg 753w, https://depfields.com/wp-content/uploads/2020/06/i2c-event-300x171.jpg 300w" sizes="(max-width: 753px) 100vw, 753px" /><figcaption>I2Cイベントコード</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　I<sup>2</sup>C通信のモード指定 </span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここでは<strong>I<sup>2</sup>C通信のモードを設定</strong>します。<strong>I2C_Send7bitAddress関数</strong>を実行して、スレーブ側（EEPROM）のアドレスとデータ方向（受信か送信）を指定します。</p>
</div></div></div>



<p>I2C_Send7bitAddress関数実行例：<br>　I2C_Send7bitAddress(I2C1, EEPROM_SLAVE_ADDRESS, I2C_Direction_Transmitter);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象のI<sup>2</sup>C</strong>（I2C1,I2C2）、第2引数は<strong>8ビットアドレスなのでスレーブアドレス<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">7ビットを左詰めにして指定</span></strong>します</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>採用している回路では<strong>EEPROMアドレス</strong>は上位4ビットが1010の固定で、下位3ビットがA0/A1/A2の指定で000の<strong>1010000</strong>(7ビット）です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これを左詰めにして<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%, rgba(255, 253, 107, 0.7) 0px);" class="vk_highlighter"><b>10100000(0xA0)（EEPROM_SLAVE_ADDRESS）</b></span>で指定します。第3引数には書き込みの場合ですのでデータ方向<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>I2C_Direction</strong>に<strong>送信(Transmitter)を指定</strong></span>します。ここでも<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_CheckEvent関数を実行</span></strong>して、ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信（トランスミッタ）モードになったかどうかを確認</span></strong>しています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-direction.jpg" alt="" class="wp-image-2726" width="776" height="127" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-direction.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/i2c-direction-300x49.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/i2c-direction-768x125.jpg 768w" sizes="(max-width: 776px) 100vw, 776px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　EEPROMデータを格納するアドレス2バイト分を指定</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>Cスレーブ側（EEPROM）に書き込むデータを格納するアドレス2バイト分を指定します。<strong>I2C_SendData</strong>関数を実行して上位、下位に分けて指定します。</p>
</div></div></div>



<p>I2C_SendData関数実行例：<br>　I2C_SendData(I2C1, (uint8_t)((Address &amp; 0xFF00) &gt;&gt; 8)); //上位アドレス<br>　I2C_SendData(I2C1, (uint8_t)(Address &amp; 0x00FF)); //下位アドレス</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象のI2C</strong>（I2C1,I2C2）、第2引数は<strong>データを格納する2バイトアドレスを指定</strong>します。アドレス指定の範囲は各EEPROMの容量によりますのでデータシートで確認して<strong>使用できる範囲で指定</strong>します。</p>
</div></div></div>



<p>I2C_CheckEvent関数の実行例：<br>　while(!I2C_CheckEvent(I2C1, <strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_EVENT_MASTER_BYTE_TRANSMITTED</span></strong>);</p>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　EEPROMに</span><span style="background-color: #003300; color: #ffffff;">書き込みデータ（2バイト）を送信&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPRONに書き込みたいデータをデータレジスタに転送します。③のアドレス転送時と同様でデータの上位と下位に分けて転送します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　ストップコンディション生成</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ストップコンディションは<strong>I2C_GenerateSTOP関数</strong>を実行して生成します。関数の第1引数は<strong>設定対象のI<sup>2</sup>C</strong>（I2C1,I2C2）、第2引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;I<sup>2</sup>C_EEPROM_Poll関数</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>EEPROMへの書き込みは前述した書き込み関数を実行してストップコンディションを生成してから開始します。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EEPROMへの書き込みにはある程度時間がかかる</span></strong>ため、連続してデータを書き込むにはデータ転送が完了したことを確認してから次のデータを書き込まなければなりません。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この処理に関してはSTM32メーカーにより作成した<strong>I2C_EEPROM_Poll関数</strong>がありますので<strong>そのまま使用</strong>します。EEPROM書き込みの際には<strong>I2C_EEPROM_Write関数</strong>とセットで実行します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-poll.jpg" alt="" class="wp-image-2730" width="641" height="225" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-poll.jpg 699w, https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-poll-300x105.jpg 300w" sizes="(max-width: 641px) 100vw, 641px" /></figure>



<div style="background: #ffffea; padding: 15px; border: 1px solid #1a66ff; border-radius: 10px; word-break: break-all;">
<p>DATA(16ビット)をEEPROMアドレスADDRESS（2バイト）に送信する実行例：<br>　<strong>I2C_EEPROM_Write</strong>(DATA, ADDRESS)；<br>　<strong>I2C_EEPROM_Poll</strong>();</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h2 class="wp-block-heading">I<sup>2</sup>C仕様EEPROM読み込み</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C読み込みは下記のフォーマット手順に従った読み込み関数<strong>I2C_EEPROM_Read()</strong>を作成し実行します。この関数ではEEPROMの特定のデータが格納しているアドレスを指定するとデータを返します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-read-format.jpg" alt="" class="wp-image-2731" width="646" height="163" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-read-format.jpg 656w, https://depfields.com/wp-content/uploads/2020/06/i2c-read-format-300x76.jpg 300w" sizes="(max-width: 646px) 100vw, 646px" /><figcaption>データ読み込み通信フォーマット</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read1.jpg" alt="" class="wp-image-9544" width="584" height="443" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read1.jpg 730w, https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read1-300x228.jpg 300w" sizes="(max-width: 584px) 100vw, 584px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>読み込みの場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I<sup>2</sup>Cバスが事前に空いているかどうかを確認してから手順を始めます</span></strong>。<br>①から③までは書き込み関数の場合と同じです。ここで読み込みたいデータが格納しているアドレスを指定します。<strong>ここまではアドレスを指定するために送信モード</strong>で行っていました。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read2.jpg" alt="" class="wp-image-9545" width="615" height="523" srcset="https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read2.jpg 697w, https://depfields.com/wp-content/uploads/2020/06/i2c-eeprom-read2-300x255.jpg 300w" sizes="(max-width: 615px) 100vw, 615px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　スタートコンディション生成（再スタート）</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここから指定したアドレスのデータを<strong>受信するための切替</strong>に<strong>スタートコンディションを再度生成</strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　I<sup>2</sup>C通信のモード指定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>I<sup>2</sup>C通信モードを受信にするために<strong>I2C_Send7bitAddress関数</strong>を実行して、②と同様に第2引数はスレーブアドレスを、第3引数には読み込みの場合ですのでデータ方向I2C_Directionに<strong>受信(Receiver)を指定</strong>します。ここでも<strong>I2C_CheckEvent関数</strong>を実行して、ここでは受信（レシーバ）モードになったかどうかを確認しています。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥ 　読み込みデータを受信&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>データ受信の準備ができたところで<strong>I2C_CheckEvent関数</strong>を実行して、受信レジスタにデータ転送完了の確認に続いて2バイトデータを上位1バイト分、下位1バイト分の順に受信します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑦ 　ACK無効指定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この時点で受信を終了させたいのでACKを返さずにNACK（ノットアクノリッジ）とするために、<strong>I2C_AcknowledgeConfig関数でACKを無効</strong>にしています。この例では受信する2バイトデータのうち最後の1バイト（下位バイト分）を受信する前に実行してNACKを返しています。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑧ 　ストップコンディション生成&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ストップコンディションを生成します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑨ 　ACK有効指定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次回の通信に備えて<strong>ACKを有効に戻します</strong>。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑩ 　読み出しデータ処理&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> 受信した上位、下位データから2バイトデータに処理し、読み込み関数<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">I2C_EEPROM_Read</span></strong>の返り値とします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>I<sup>2</sup>Cはペリフェラルのなかでも繊細なもので、ライブラリの関数をブラックボックスとして使用するだけでは行き詰まるかもしれません。<strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">STM32レファレンスマニュアルとライブラリ関数の内容を照らし合わせて動作を確認すること</span></strong>が理解への早道でつぶしが効くようになります。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/i2c/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/f3ccaa451444b03a0e373389dc02d1c5e1261aa167290d839a1c4be08f69fb51.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Serial communication I2C[I2C details of STM32] | Most Powerful Bible to Becom...</div></div><div class="lkc-url">https://en.depfields.com/i2c/</div><div class="lkc-excerpt">This section explains how to use the STM32&#039;s built-in peripheral I2C. This chapter explains how to read and write data to an I2C-specification EEPROM as an example.What is serial communication I2C?Serial communication I2C is a</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/i2c/">シリアル通信I2C【STM32のI2C詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>シリアル通信USART【STM32のUSART詳細】</title>
		<link>https://depfields.com/usart/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usart</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Mon, 08 Jun 2020 02:19:59 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[USART]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2648</guid>

					<description><![CDATA[<p>シリアルUSART通信は将来IoTにも応用できるペリフェラルなのでできるだけ早期に習得してもらいたいものです。 USARTはペリフェラルとしては機能の設定は比較的単純なのですが、文字列を扱うもののため使いこなすにはC言語 [&#8230;]</p>
<p>The post <a href="https://depfields.com/usart/">シリアル通信USART【STM32のUSART詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="400" height="274" src="https://depfields.com/wp-content/uploads/2020/06/serial-cable.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/serial-cable.jpg 400w, https://depfields.com/wp-content/uploads/2020/06/serial-cable-300x206.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">シリアルUSART通信は将来IoTにも応用できるペリフェラルなので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">できるだけ早期に習得してもらいたい</span></strong>ものです。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">USARTはペリフェラルとしては機能の設定は比較的単純なのですが、文字列を扱うもののため使いこなすには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">C言語のプログラミングのチカラが必要</span></strong>です。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">1文字の受信から文字列送受信のDMA転送</span></strong>までステップ毎に解説しています。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">このサイトで紹介している<strong><a href="https://depfields.com/monitor-debug-apl/" target="_blank" rel="noreferrer noopener" title="シリアルモニター【STM32シリアル通信】">シリアルモニター</a></strong>を早めに導入（<strong><a href="https://depfields.com/debug/" target="_blank" rel="noreferrer noopener" title="モニターデバッグ">モニターデバッグ</a></strong>を参照）してC言語プログラミングのスキルをあげるにも役立ててください。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"></p>







<h2 class="wp-block-heading">USARTとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">UART</span></strong>(<strong>U</strong>niversal <strong>A</strong>synchronous <strong>R</strong>eceiver <strong>T</strong>ransmitter)シリアル通信は古くから使われている非同期の通信方式です。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART</span></strong>(<strong>U</strong>niversal <strong>S</strong>ynchronous &amp; <strong>A</strong>synchronous <strong>R</strong>eceiver <strong>T</strong>ransmitter)は非同期通信のUARTだけでなく、同期通信も可能とした方式です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この章では同期・非同期シリアル通信USARTのうち<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">非同期通信(UART)</span></strong>の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">解説</span></strong>をしていきます。USARTは同期通信にも対応していますがここでは取り扱いません。非同期方式は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">調歩同期式</span></strong>とも呼ばれ一般的な方式なのですが同期クロックを必要としないために、相手との通信速度がしっかり合っている必要があります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そのため、システムクロックで解説したようにペリフェラルUSARTの供給クロック、つまりマイコンの動作クロックの周波数が安定していることが必要不可欠です</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ペリフェラルにUSART通信を使用するアプリケーションではマイコンの動作クロックは安定した外部クロックを供給できる水晶振動子やセラミック振動子を使用することをおすすめします。<br>（STM32マイコンでは全二重および半二重通信に対応しています。）</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-connection.jpg" alt="" class="wp-image-2650" width="290" height="123"/><figcaption>UART(調歩同期式)通信の接続</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>調歩同期式でデータを送信する場合のフォーマットを見てみましょう。<br>通信データ（0か1のデジタル値）は<strong>開始ビット（スタートビット）</strong>と<strong>終了ビット（ストップビット）</strong>で囲んだブロックで送受信します。ブロック<strong>最初のビットを<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">スタートビット</span></strong>といい、<strong>1から0に変化することで判明</strong>します。ブロック<strong>最後のビットを送信した後に1に戻して</strong>おきます。これを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ストップビット</span></strong>といいます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>調歩同期式ではスタートビットで送信側と受信側のタイミングを合わせて通信を行います。通信データの信頼性をあげるために使われるのが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">パリティビッ</span>ト</strong>でパリティビットを使用する場合のデータ長は9ビットになります。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">設定するパラメータは通信する相手と同じ仕様</span></strong>にする必要があります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="542" height="127" src="https://depfields.com/wp-content/uploads/2020/06/data-format.jpg" alt="" class="wp-image-2651" srcset="https://depfields.com/wp-content/uploads/2020/06/data-format.jpg 542w, https://depfields.com/wp-content/uploads/2020/06/data-format-300x70.jpg 300w" sizes="(max-width: 542px) 100vw, 542px" /><figcaption>データ・フォーマット</figcaption></figure>



<h2 class="wp-block-heading">USART通信の初期化手順</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>USART通信の初期設定を実際のプログラムで解説していきます。<br>目的：設定する条件は以下のとおりです。</p>
</div></div></div>



<p>目的：使用するUSARTはUSART3でGPIOはPC10とPC11<br>■　ハードウェアフロー制御なし・パリティを使用しない<br>■　通信速度（ボーレート）は9600<br>■　ストップビットは1<br>■　送受信データビット長は8</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-setting.jpg" alt="" class="wp-image-3770" width="606" height="651"/></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　USART3にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するUSART3にクロックを供給します。APB1バスに接続していますのでAPB1に供給します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　GPIO設定１（PC10をUSART3_TXに設定）</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>USART通信の送信Txはオルタネート出力です。スピードはボーレートに合わせます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　GPIO設定２（PC11をUSART3_RXに設定）</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> USART通信の受信Rxはフローティング入力です。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　USART3の初期設定</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> USART通信の初期設定を実行します。初期化はUSART_Init関数を実行して上記のパラメータを設定します。</p>
</div></div></div>



<p>USART初期化関数実行例： USART_Init(USART3, &amp;USART_InitStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> 関数の第1引数は<strong>設定対象のUSART</strong>（USART1-5：マイコンによります）を指定し、第2引数は<strong>構造体メンバ</strong>になっていて以下に示します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="650" height="77" src="https://depfields.com/wp-content/uploads/2020/06/usart-member1.jpg" alt="" class="wp-image-2655" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member1.jpg 650w, https://depfields.com/wp-content/uploads/2020/06/usart-member1-300x36.jpg 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART_BaudRate</strong>メンバでは通信速度を指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="649" height="125" src="https://depfields.com/wp-content/uploads/2020/06/usart-member2.jpg" alt="" class="wp-image-2656" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member2.jpg 649w, https://depfields.com/wp-content/uploads/2020/06/usart-member2-300x58.jpg 300w" sizes="(max-width: 649px) 100vw, 649px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART_WordLength</strong>メンバでは通信データのビット長を指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="661" height="155" src="https://depfields.com/wp-content/uploads/2020/06/usart-member3.jpg" alt="" class="wp-image-2657" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member3.jpg 661w, https://depfields.com/wp-content/uploads/2020/06/usart-member3-300x70.jpg 300w" sizes="(max-width: 661px) 100vw, 661px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART_StopBits</strong>メンバはストップビットの指定をします。この例では1ビットを指定しています。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="662" height="133" src="https://depfields.com/wp-content/uploads/2020/06/usart-member4.jpg" alt="" class="wp-image-2658" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member4.jpg 662w, https://depfields.com/wp-content/uploads/2020/06/usart-member4-300x60.jpg 300w" sizes="(max-width: 662px) 100vw, 662px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART_Parity</strong>メンバはストップビットの指定をします。この例では使用しません。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="664" height="155" src="https://depfields.com/wp-content/uploads/2020/06/usart-member5.jpg" alt="" class="wp-image-2659" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member5.jpg 664w, https://depfields.com/wp-content/uploads/2020/06/usart-member5-300x70.jpg 300w" sizes="(max-width: 664px) 100vw, 664px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_HardwareFlowControl</span></strong>メンバはハードウェアフロー制御の設定をします。この例では使用しないので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_HardwareFlowControl_None</span></strong>を指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="662" height="117" src="https://depfields.com/wp-content/uploads/2020/06/usart-member6.jpg" alt="" class="wp-image-2660" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-member6.jpg 662w, https://depfields.com/wp-content/uploads/2020/06/usart-member6-300x53.jpg 300w" sizes="(max-width: 662px) 100vw, 662px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART_Mode</strong>メンバは対象のUSARTで有効にする機能を指定します。通常はRx,Tx共に機能させる指定をします。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　USART3を有効化する&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまででUSART通信の初期化ができましたので、USART_Cmd関数を実行して有効化します。</p>
</div></div></div>



<p>USART通信有効化関数実行例：　USART_Cmd(USART3, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のUSART</strong>（USART1-5：マイコンによります）を指定し、第2引数は<strong>ENABLEで有効、DISABLEで無効</strong>となります。</p>
</div></div></div>



<h2 class="wp-block-heading">USARTを使った通信</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>初期化を終えると、アプリケーションプログラム内でデータの送受信ができるようになります。受信の場合は<strong>ポーリング</strong>を使用して定期的に受信をチェックするか受信<strong>割り込み</strong>が発生した時にのみ受信処理を行うことをします。</p>
</div></div></div>



<h3 class="wp-block-heading">データ受信（1文字）</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>通信において相手側が送信するタイミングに合わせて受信できればよいのですが、相手がいつ送信するかはわかりません。そこで定期的に受信があったかどうかを監視し、受信があったときにだけ受信処理をおこなう<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ポーリング方式</span></strong>について解説します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>USART回路では受信があると<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">受信レジスタ</span></strong>にデータが一時保持されます。アプリケーションプログラム内で定期的に受信レジスタにデータがあるかどうかは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_GetFlagStatus関数で確認</span></strong>できます。この関数では受信に限らずUSARTのいろいろな状態をフラグで確認できます。ここでは受信データ通知フラグ<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_FLAG_RXNE</span></strong>がSET(1)であるとき受信データが受信レジスタにあることが確認できます。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="710" height="333" src="https://depfields.com/wp-content/uploads/2020/06/usart-flag.jpg" alt="" class="wp-image-11650" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-flag.jpg 710w, https://depfields.com/wp-content/uploads/2020/06/usart-flag-300x141.jpg 300w" sizes="(max-width: 710px) 100vw, 710px" /></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/polling-receive.jpg" alt="" class="wp-image-2663" width="559" height="103" srcset="https://depfields.com/wp-content/uploads/2020/06/polling-receive.jpg 559w, https://depfields.com/wp-content/uploads/2020/06/polling-receive-300x55.jpg 300w" sizes="(max-width: 559px) 100vw, 559px" /><figcaption>定期的なポーリングによるデータ受信</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ポーリングにより受信レジスタに受信データがあることが判明したあとは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_ReciveData関数</span></strong>を実行して受信データを1文字分取得します。この関数は戻り値として16ビットで定義されたものですが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">受信データは8ビット</span></strong>です。</p>
</div></div></div>



<p>USART１文字受信関数実行例：　RxData=(int8_t)USART_ReceiveData(USART3);</p>



<p>関数プロトタイプ：uint16_t USART_ReceiveData(USART_TypeDef* USARTx)</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の引数には<strong>設定対象のUSART</strong>（USART1-5：マイコンによります）を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>





<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h3 class="wp-block-heading">データ送信（1文字）</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信は任意のタイミングで行うことができます。USARTの送信レジスタに1文字分ずつデータを書き込むと自動的に送信されます。連続してデータを送信する場合は前のデータが確実に送信されたことを確認してから次のデータを送信します。この確認にも<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_GetFlagStatus関数</span></strong>を利用して送信が完了してレジスタが空になったことを確認できます。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="642" height="79" src="https://depfields.com/wp-content/uploads/2020/06/data-transmit.jpg" alt="" class="wp-image-2664" srcset="https://depfields.com/wp-content/uploads/2020/06/data-transmit.jpg 642w, https://depfields.com/wp-content/uploads/2020/06/data-transmit-300x37.jpg 300w" sizes="(max-width: 642px) 100vw, 642px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信が準備できた段階で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_SendData関数</span></strong>を実行して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信データを1文字分</span></strong>送信します。</p>
</div></div></div>



<p>USART１文字送信関数実行例：　USART_SendData(USART3,'a');//1文字'a'を送信</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のUSART</strong>（USART1-5：マイコンによります）を指定し、第2引数は送信する1文字を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>転送したデータはマイコン側から例えばPC側にシリアルケーブルを介して転送するとシリアル通信のできる<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ターミナルソフトで内容を確認</span></strong>できます。ターミナルソフトとマイコン側でシリアル通信の仕様を一致させると送受信ができるようになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>表示に文字化けなどが起こる場合は転送速度が一致していないなどが原因です。マイコンの動作クロック周波数が不安定な場合も通信に不具合が起こる可能性も考えられますで、<strong>UART通信のような非同期（調歩同期）式の場合</strong>は安定した<strong>外部クロックを使うことが前提</strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>





<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h3 class="wp-block-heading">送受信割り込み</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>前回はポーリングによる受信を行いました。ここでは受信があったときだけ処理を行う<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みによる受信処理</span></strong>と送信したいときだけ<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みを有効にして送信処理する方式</span></strong>をみていきます。割り込みを以外の設定はポーリング方式と同じなので省略しています。</p>
</div></div></div>



<p>目的：使用するUSARTはUSART3でGPIOはPC10とPC11<br>■　USART3の送受信割り込みの設定</p>



<figure class="wp-block-image size-large"><img decoding="async" width="539" height="448" src="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting1.jpg" alt="" class="wp-image-2673" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting1.jpg 539w, https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting1-300x249.jpg 300w" sizes="(max-width: 539px) 100vw, 539px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　割り込み初期化</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込み初期化関数NVICで使用する割り込みの優先順位などを設定します。標準的な設定方法でUSART3の割り込みなのでNVIC_IRQChannelは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART3_IRQn</span></strong>を指定します。<br>NVIC_IRQChannelCmdに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ENBLE</span></strong>に指定して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">IRQチャネルを有効</span></strong>にします。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　割り込み有効化</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>受信割り込みで次の割り込みに対応するためにはステータスフラグをクリアしてから<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_ITConfig関数</span></strong>で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みを有効</span></strong>にします。クリアにするには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART_ClearITPendingBit関数</span></strong>を使用します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　USART3有効化</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART3を有効化</span></strong>するといつでも割り込みによる受信を開始します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="537" height="204" src="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting2.jpg" alt="" class="wp-image-2674" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting2.jpg 537w, https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting2-300x114.jpg 300w" sizes="(max-width: 537px) 100vw, 537px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="587" height="224" src="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting3.jpg" alt="" class="wp-image-2675" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting3.jpg 587w, https://depfields.com/wp-content/uploads/2020/06/usart-interrupt-setting3-300x114.jpg 300w" sizes="(max-width: 587px) 100vw, 587px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　アプリケーション部で送信関数実行</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">専用に作成した送信関数USART_SendChar()を実行</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　送信関数</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信するデータを関数に渡してから<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信割り込みを有効</span></strong>にします。送信レジスタが空であると割り込みが発生し、USART3割り込みハンドラ<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">USART3_IRQHandler</span></strong>が呼び出されます⑥。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　送受信割り込みハンドラ</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで、割り込みの原因である送信部の処理がされて文字が送信されることになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>送信割り込みの場合</strong>は送信データをレジスタに書き込まれると<strong>割り込みフラグは自動でリセット</strong>されます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信後は割り込みを停止</span></strong>しておきます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みを使用しているので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信関数USART_SendCharを実行</span></strong>すると送信レジスタが空になるまで無駄に待たせる必要はなく自動的に処理がなされるのでCPUの効率がよくなります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この例では1文字だけを渡しているのですが、文字列として多数の文字を渡すと、割り込みによる送信の効果がより発揮されます。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/usart-itflag_en.jpg" alt="" class="wp-image-11648"/><figcaption>USART割り込みフラグ</figcaption></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>





<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h3 class="wp-block-heading">文字列の送受信応用</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでは送受信ともに1文字だけを扱ってきました。実用的な送受信通信を行うための方式にステップごと発展させていきましょう。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>1文字の送受信では8ビットの変数1つを扱いましたが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字列では配列かポインタの概念を使用</span></strong>します。文字列の取り扱いは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マイコンの知識よりむしろC言語の文字列を扱う知識が必要</span></strong>です。このサイトではC言語の解説は行いませんが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字列、ポインタ、配列、アドレス</span></strong>あたりはしっかり理解しておいてください。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>通信などのアプリケーションでは特に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字列をある程度自由自在に取り扱えるスキルが必要</span></strong>となってきます。基礎を十分理解して文字列を取り扱う関数など自分で作成できるようになるとアプリケーションの用途が広がります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字列の送受信</span>を行う</strong>例を見てみましょう。ここでは<strong>割り込みを使用しない<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ポーリング方式</span>での文字列送受信</strong>を行っています。文字列の受信、送信でそれぞれ関数を作成しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マイコンのシリアル通信での送受信は1文字単位</span></strong>で行いますので、文字列は配列か、ポインタ変数など利用して一旦メモリに格納してから順次送受信する手順になります。<br>このメモリの格納場所をここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信バッファ、受信バッファ</span></strong>と呼んでいます。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="555" height="703" src="https://depfields.com/wp-content/uploads/2020/06/usart-appli1.jpg" alt="" class="wp-image-2686" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-appli1.jpg 555w, https://depfields.com/wp-content/uploads/2020/06/usart-appli1-237x300.jpg 237w" sizes="(max-width: 555px) 100vw, 555px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　送受信に必要なペリフェラルの初期化</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ペリフェラルの初期化はこれまでのとおりですのでここでは省略します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">②　アプリケーション部で送受信関数実行</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>文字列の送受信はアプリケーション内に記述します。<br>ここではmain関数内の無限ループ内でPCのキーボードなどから入力された文字列データが登録している文字列と一致するかを判別するアプリです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>文字列を受信したことは常に受信フラグUSART_FLAG_RXNEで無限ループ内で監視しており、変化があると受信および文字列処理を開始します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">常時監視しているポーリング方式</span></strong>と呼ばれるもので<strong>CPUが働きっぱなし</strong>です。受信があったときだけ機能させCPUの負担を減らすには受信<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み</span>方式</strong>を採用します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="550" height="535" src="https://depfields.com/wp-content/uploads/2020/06/usart-appli2.jpg" alt="" class="wp-image-2687" srcset="https://depfields.com/wp-content/uploads/2020/06/usart-appli2.jpg 550w, https://depfields.com/wp-content/uploads/2020/06/usart-appli2-300x292.jpg 300w" sizes="(max-width: 550px) 100vw, 550px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">③　USART3受信関数</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>USART3_Rcv_string()</strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字列を受信する関数</span></strong>です。<br>ここではキーボード等で文字列を入力し、キャリッジ・リターン(CR)までの入力文字ブロックを文字列として1文字ずつ順次<strong>受信バッファRxBufferに格納</strong>しています。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">④　USART3送信関数</span><span style="background-color: #003300; color: #ffffff;">&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>USART3_Send_string()</strong>は<strong>文字列を送信する関数</strong></span>です。<br>ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">送信バッファTxBufferに登録格納された文字列</span></strong>をNull文字に到達するまで1文字ずつ順次送信します。割り込みを使用していないために、1文字送るたびに送信バッファが空になるまでフラグUSART_FLAG_TXE状態を確認待機する必要があります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント１</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>この例ではあるコードに文字列”ABC”を登録しておき、例えばPCとマイコン間のシリアル通信で、PC側からコードを送信したとき、マイコン側で登録コードと一致したときと、不一致のときの処理をしているものです。<strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">マイコンをその他PCなどから通信でリモート操作するときの基本的な考えに利用できます</span></strong>。C言語の配列やポインタに慣れるのにちょうどよいレベルのものですので、いろいろ条件を変更して試してみてください。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント２</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>シリアル通信でもADコンバータのときと同様に<strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">DMA</span>を使用すればより効率をあげることができます</strong>。つまり、<strong>CPUに頼らず</strong>文字列の送受信においてデータを<strong>メモリに自動転送できます</strong>ので消費電力も抑えることができます。DMA転送は文字列コードが長くなればなるほど有用です。詳細は<a href="https://depfields.com/dma/" target="_blank" rel="noopener noreferrer"><strong>DMA(Direct Memory Access)【STM32のDMA詳細】</strong></a>で解説します。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/usart/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/86616ba88cba4dd7eafb2c16fef7775b26eee45a121b854ece9a84b485a8b21f.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Serial communication USART [USART details of STM32] | Most Powerful Bible to ...</div></div><div class="lkc-url">https://en.depfields.com/usart/</div><div class="lkc-excerpt">Serial USART communication is a peripheral that can be applied to IoT in the future and should be mastered as early as possible.USART is relatively simple to set up as a peripheral, but because it handles character strings, it requires</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/usart/">シリアル通信USART【STM32のUSART詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ADコンバータ【STM32のADコンバータ詳細】</title>
		<link>https://depfields.com/adc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adc</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Sun, 07 Jun 2020 10:51:36 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[AD変換]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2595</guid>

					<description><![CDATA[<p>STM32マイコンのADコンバータはとても高機能なために、初心者・入門者は単純なものから順に理解しながらステップアップしていくのがよいと思われます。 この章では1チャンネルのアナログ入力を必要なときだけ手動で取得するシン [&#8230;]</p>
<p>The post <a href="https://depfields.com/adc/">ADコンバータ【STM32のADコンバータ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="469" src="https://depfields.com/wp-content/uploads/2020/06/podcast-4209770_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/podcast-4209770_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/podcast-4209770_640-300x220.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">STM32マイコンのADコンバータはとても高機能なために、初心者・入門者は単純なものから順に理解しながらステップアップしていくのがよいと思われます。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">この章では1チャンネルのアナログ入力を必要なときだけ手動で取得するシングルモード変換方式から複数チャネルのアナログ入力を連続して自動取得してDMA送信でメモリに転送する方式までを解説しています。</p>







<h2 class="wp-block-heading">STAM32のADコンバータ</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>マイコンにはADコンバータ（AD変換器）が内蔵されていて、アナログ信号をマイコンに取り入れてデジタル信号に変換することができます。STM32のADコンバータは12ビットの分解能でSTM32では最大3.3Vですので3.3Vを4096（=2<sup>12</sup>）分割した分解能で数値を扱うことができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32のADコンバータは変換速度もとても速く高性能で一つのADコンバータ回路で複数のチャネルの切り替えできる高機能なものです。複数のADコンバータをもつものもあり、単にAD変換値を取得するだけでも数種類の方法があります。この章ではこのSTM32マイコンの多機能なADコンバータの使い方について解説していきます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>すべての機能を使いこなすのではなく必要に応じて応用の幅を広げていけばいいと思います。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">これも一度、使い方を知って理解できればあとはアプリケーションに応用するだけ</span></strong>です。</p>
</div></div></div>



<p></p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/analog-input.jpg" alt="" class="wp-image-2598" width="304" height="115" srcset="https://depfields.com/wp-content/uploads/2020/06/analog-input.jpg 303w, https://depfields.com/wp-content/uploads/2020/06/analog-input-300x114.jpg 300w" sizes="(max-width: 304px) 100vw, 304px" /><figcaption>ADコンバータを使ったアナログ信号入力</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADコンバータはアナログ信号を扱うので、少し<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">アナログ回路を意識して使用する</span></strong>必要があります。アナログ信号をデジタル信号に変換するのにサンプリングホールドというコンデンサをつかったアナログ変換回路をもっていて変換時に電流が流れやすいほどコンデンサにチャージ（蓄電）する時間が短くてすむので高速に変換できるものです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADコンバータに接続するアナログセンサなどには内部抵抗というものをもっていてこの抵抗が小さいほど電流が流れやすいのでより高速の変換ができます。この内部抵抗は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">出力インピーダンス</span></strong>とも呼ばれるもので、ADコンバータを使用する際には知っておく必要があります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">インピーダンス</span></strong>は直流を含む交流回路の抵抗ですが、ここでは直流の内部抵抗に置き換えて説明します。図中でADコンバータの回路においては出力インピーダンスRoと入力機器の入力インピーダンスRiの関係はRo&lt;&lt;Riが好ましいです。入力側のRiは固定のもので考えると、出力機器側のインピーダンスRoが小さいほど負荷電流iによる電圧降下の影響も小さく、入力機器側に電流も流しやすくなるからです。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/impedance.jpg" alt="" class="wp-image-2599" width="250" height="203"/><figcaption>入出力機器のインピーダンス</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32のデータシートによるとADコンバータと接続する機器の出力インピーダンスとAD変換にかかる時間は下表になります。これはADコンバータの供給クロックが14MHzであるときの接続できるインピーダンス最大値を示しています。この表から<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">インピーダンスが小さいほどAD変換にかかる時間が短い</span></strong>ことがわかります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/conversion-time-and-impedance.jpg" alt="" class="wp-image-2600" width="409" height="238" srcset="https://depfields.com/wp-content/uploads/2020/06/conversion-time-and-impedance.jpg 409w, https://depfields.com/wp-content/uploads/2020/06/conversion-time-and-impedance-300x175.jpg 300w" sizes="(max-width: 409px) 100vw, 409px" /><figcaption>出力インピーダンスとAD変換時間</figcaption></figure>



<h2 class="wp-block-heading">シングルモードで都度変換</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず、STM32マイコンのADコンバータの概要をまとめてから実際のプログラムを例に解説をしていきます。<br>STM32マイコンのADコンバータの設定は<strong>高機能なだけに他のペリフェラルに比べても設定項目も多い</strong>ですが、はじめに理解してさえしてしまえばあとはモジュールとしてブロック化しアプリケーションに活かすだけです。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/adc-setting-single1.jpg" alt="" class="wp-image-2625"/><figcaption>ADコンバータ設定（シングル変換モード）</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　ADC1にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するADC1コンバータにクロックを供給します。APB2バスに接続していますのでAPB2に供給します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　ADC1のクロック設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADコンバータはAPB2の先にあるADコンバータ専用プリスケーラーを介していますのでこの分周比をRCC_ADCCLK関数で設定します。この関数の引数RCC_PCLK2では分周比を指定します。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">分周比は6分の1を指定</span></strong>し、ADコンバータへのクロックは12MHz（72MHz/6)としています。入力機器の出力インピーダンスのところでは動作クロックが14MHzを前提にしていたためにそれに最も近い12MHzに設定しています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/adc-prescaler.jpg" alt="" class="wp-image-2602" width="398" height="156" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-prescaler.jpg 383w, https://depfields.com/wp-content/uploads/2020/06/adc-prescaler-300x117.jpg 300w" sizes="(max-width: 398px) 100vw, 398px" /><figcaption>ADCクロックのプリスケーラによる分周</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　ADC1入力ポートGPIOの設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADCの入力ポートGPIOの設定</span></strong>を行います。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PA1にアナログ入力</span></strong>を指定します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　ADコンバータの初期設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADコンバータの初期設定</span></strong>を実行します。はじめのADC_DeInit関数はリセット直後の初期状態に戻すもので一応実行しておきます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">初期化はADC_Init関数を実行</span></strong>します</p>
</div></div></div>



<p>ADコンバータ初期化関数実行例：　<strong>ADC_Init(ADC1, &amp;ADC_InitStructure);</strong></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には設定対象のADコンバータ(ADC1-３:マイコンによります)を指定し、第2引数は構造体メンバになっていて以下に示します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="704" height="334" src="https://depfields.com/wp-content/uploads/2020/06/init_member1.jpg" alt="" class="wp-image-2608" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member1.jpg 704w, https://depfields.com/wp-content/uploads/2020/06/init_member1-300x142.jpg 300w" sizes="(max-width: 704px) 100vw, 704px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_Mode</span></strong>メンバでは<strong>単独</strong>か<strong>複数</strong>の<strong>ADコンバータを使用するときのモードを指定</strong>します。単独の場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">独立モード</span></strong>（<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_Mode_Independent</span></strong>）、複数のADコンバータを使用する場合に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">デュアルモード</span></strong>で変換時間の効率をあげるためにさまざまな方式を指定できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>例えば2つのADC1とADC2を使う場合でそれぞれ各ADコンバータのグループとして使用チャネルの変換順序を登録していると、同時に変換をし、変換後次の順序のチャネルを順次変換するのを繰り返すのが<strong>並列レギュラ変換モード</strong>(<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_Mode_RegSimult</span></strong>)です。他に複数のADコンバータを連動させたり、タイミングを合わせたりする方式もありますが、<strong>とりあえず<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">この2つのモード</span>を知っておけばよいのではないでしょうか</strong>。他のモード詳細は各マイコンのレファレンスマニュアルに記載しています。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="704" height="128" src="https://depfields.com/wp-content/uploads/2020/06/init_member2.jpg" alt="" class="wp-image-2609" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member2.jpg 704w, https://depfields.com/wp-content/uploads/2020/06/init_member2-300x55.jpg 300w" sizes="(max-width: 704px) 100vw, 704px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_ScanConvMode</span></strong>メンバでは1つのADコンバータには複数のチャネルを持っていて使用するチャネルの変換順序などを登録しておくのですが、<strong>この登録チャネルを一度に連続変換するのがスキャンモード</strong>で、一定数ずつ変換するのが分割スキャンモードです。複数チャネル時は<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>スキャンモード</strong>（<strong>ENABLE</strong>）</span>の指定でいいと思います。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/init_member3.jpg" alt="" class="wp-image-2610" width="702" height="125" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member3.jpg 703w, https://depfields.com/wp-content/uploads/2020/06/init_member3-300x54.jpg 300w" sizes="(max-width: 702px) 100vw, 702px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_ContinuousConvMode</span></strong>メンバは変換を連続に行う<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">連続変換モード</span></strong>と変換開始コマンドADC_SoftwareStartConvCmd関数を与えるときだけ変換を行う<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">シングルモード</span></strong>があります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">連続変換モード</span></strong>は<strong>一度変換を開始すると変換は繰り返す</strong>のでアプリケーションプログラム内で任意のタイミングで最新の変換値が取得できます。対して<strong>シングルモード</strong>は<strong>変換値を取得したいときだけ実行する</strong>ため、消費電力を抑えることができますが、変換にはある程度時間がかかるので一定時間待つ必要があります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="704" height="439" src="https://depfields.com/wp-content/uploads/2020/06/init_member4.jpg" alt="" class="wp-image-2611" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member4.jpg 704w, https://depfields.com/wp-content/uploads/2020/06/init_member4-300x187.jpg 300w" sizes="(max-width: 704px) 100vw, 704px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_ExternalTrigConv</span></strong>メンバはタイマイベントで変換を開始する時点を決める場合に指定します。使用しない場合は<strong>トリガなし(ADC_ExternalTrigConv_None)を指定</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="703" height="132" src="https://depfields.com/wp-content/uploads/2020/06/init_member5.jpg" alt="" class="wp-image-2612" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member5.jpg 703w, https://depfields.com/wp-content/uploads/2020/06/init_member5-300x56.jpg 300w" sizes="(max-width: 703px) 100vw, 703px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンのADコンバータの変換結果は12ビットですが、数値を格納するレジスタは16ビットなので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">格納方法を右詰か左詰の指定</span></strong>をします。通常は<strong>LSB側の下12桁右詰</strong>（<strong>ADC_DataAlign_Right</strong>）に格納でよいと思います。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="705" height="82" src="https://depfields.com/wp-content/uploads/2020/06/init_member6.jpg" alt="" class="wp-image-2613" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member6.jpg 705w, https://depfields.com/wp-content/uploads/2020/06/init_member6-300x35.jpg 300w" sizes="(max-width: 705px) 100vw, 705px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するチャネル数を指定します。サンプルでは1チャンネル使用するので<strong>1</strong>にしています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>各メンバの指定が終了しましたので、初期化関数<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_Init(ADC1, &amp;ADC_InitStructure)を実行</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　ADコンバータの有効化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでで、ADコンバータの初期化ができましたのでここで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_Cmd関数</span>を実行</strong>して<strong>ADコンバータを有効化</strong>します。</p>
</div></div></div>



<p>ADコンバータ有効化関数実行例：　ADC_Cmd(ADC1, ENABLE);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のADコンバータ(ADC1-3：マイコンによります)を指定</strong>し、第2引数は<strong>ENABLEで有効</strong>、<strong>DISABLEで無効</strong>となります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　ADコンバータのキャリブレーション&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> 他のペリフェラルではこれで設定は完了ですがADコンバータではもうひと手間必要です。それが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キャリブレーション（校正）</span></strong>です。このキャリブレーションは各マイコンの製品個体差を補正するものですので<strong>ADコンバータの初期化を行うたびに実行</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キャリブレーション手順はまず<strong>キャリブレーション内容を初期化するため</strong>に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_ResetCalibration関数</span>を実行</strong>し、その後<strong>キャリブレーション</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_StartCalibration関</span>数で実行</strong>します。<strong>それぞれの関数は時間がかかるためステータスで完了を確認しています</strong>。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑦　AD変換対象の変換開始&nbsp;</span></p>



<figure class="wp-block-image size-large"><img decoding="async" width="545" height="133" src="https://depfields.com/wp-content/uploads/2020/06/adc-setting-single2.jpg" alt="" class="wp-image-2626" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-setting-single2.jpg 545w, https://depfields.com/wp-content/uploads/2020/06/adc-setting-single2-300x73.jpg 300w" sizes="(max-width: 545px) 100vw, 545px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これでいつでもADコンバータによる変換値を取得できます。プログラム例では<strong>ADC1のCH1シングルモード</strong>の例ですので都度<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_RegularChannelConfig関数</span></strong>および<span data-color="#fffd6b" style="font-weight: bold; background: linear-gradient(transparent 60%, rgba(255, 253, 107, 0.7) 0px);" class="vk_highlighter">ADC_SoftwareStartConvCmd関数</span><b><strong>を</strong>実行</b>し<strong>変換を開始</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ADコンバータを使用するには<strong>変換の対象となるチャネル</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">レギュラ変換グループに登録して指定する必要</span></strong>があります。これを行うのに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_RegularChannelConfig関数</span></strong>を使用して指定します。</p>
</div></div></div>



<p>レギュラ変換グループ登録関数実行例：<br>ADC_RegularChannelConfig (ADC1,ADC_Channel_1,1,ADC_SampleTime_13Cycles5);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>設定対象のADコンバータ(ADC1-3：マイコンによります)を指定</strong>、第2引数は<strong>チャネル0から17まで指定</strong>（ADC_Channel_1 - ADC_Channel_17）、第3引数は<strong>変換順序を1から16で指定</strong>します。チャネルが1つだけの場合は1とします。 第4引数は<strong>サンプリングタイムを指定</strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/init_member7.jpg" alt="" class="wp-image-2614" width="710" height="258" srcset="https://depfields.com/wp-content/uploads/2020/06/init_member7.jpg 704w, https://depfields.com/wp-content/uploads/2020/06/init_member7-300x109.jpg 300w" sizes="(max-width: 710px) 100vw, 710px" /><figcaption>サンプリングタイム</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>入力機器の出力インピーダンスが10kΩのためサンプリングタイムは13.5サイクルを指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>続いて<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_SoftwareStartConvCmd関数を実行して変換を開始</span></strong>します。</p>
</div></div></div>



<p>変換開始関数実行例：<br>ADC_SoftwareStartConvCmd(ADC1,<em>ENABLE</em>);//変換開始<br>while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//変換待機<br>ADCValue_CH1=ADC_GetConversionValue(ADC1);//変換値取得（16ビット）</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>シングルモード</strong>では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">都度実行</span></strong>のため、変換にかかる時間<strong>待機してから変換値を取得</strong>します。変換が完了したかどうかを<strong>ADC_GetFlagStatus関数</strong>で確認できます。この関数は使用中のADコンバータの状態をフラグで確認することができます。ここでは変換終了通知フラグのADC_FLAG_EOCがSET(=1)になるまで待機しています。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="703" height="180" src="https://depfields.com/wp-content/uploads/2020/06/adc-flag.jpg" alt="" class="wp-image-2619" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-flag.jpg 703w, https://depfields.com/wp-content/uploads/2020/06/adc-flag-300x77.jpg 300w" sizes="(max-width: 703px) 100vw, 703px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>変換終了後、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_GetConversionValue関数</span>を実行して変換値を取得</strong>します。関数の引数は対象のADコンバータ(ADC1-3：マイコンによります)を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これらの<strong>コマンドを<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">セットで実行</span></strong>するとアプリケーションプログラム内の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">任意のタイミングでAD変換値を取得</span></strong>できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-height"><div class="vk_block-margin-md--height"></div></div>



<h2 class="wp-block-heading">連続変換モード</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでは<strong>シングルモード</strong>での設定および変換値取得までみてきました。このシングルモードは単純で、都度実行して変換値を取得するために消費電力も小さくてよいのですが、変換にかかる時間が大きいため変換が完了するまで待機しなければなりません。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/adc-setting-continuous.jpg" alt="" class="wp-image-2621" width="538" height="535" srcset="https://depfields.com/wp-content/uploads/2020/06/adc-setting-continuous.jpg 547w, https://depfields.com/wp-content/uploads/2020/06/adc-setting-continuous-300x298.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/adc-setting-continuous-150x150.jpg 150w" sizes="(max-width: 538px) 100vw, 538px" /><figcaption>連続変換モード</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">連続変換モード</span></strong>を指定してADC_SoftwareStartConvCmd関数を一度実行し変換を開始すると<strong>自動的に変換が繰り返され</strong>ますので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">いつでも最新の変換値が取得</span></strong>できます。連続変換モードは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ADC_ContinuousConvMode</span></strong>メンバを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ENABLE</span></strong>するだけです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-height"><div class="vk_block-margin-md--height"></div></div>



<h2 class="wp-block-heading">複数チャネルでの変換</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまではチャネル数は1つで取り扱ってきました。<strong>チャネル</strong>が<strong>複数ある場合の変換</strong>はどうなるでしょうか。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>シングルモードで複数チャネルを変換する場合はAD変換開始のたびにレギュラ変換グループ登録ADC_RegularChannelConfig関数を実行してチャネル指定する必要があります。これは単独チャネルの変換を複数チャネル分実行するため、単純な方式なのですが効率が悪くチャネル数が多い場合は実用的とはいえません。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで<strong>複数のチャネルの場合に連続変換モード</strong>で変換を行う方式をみてみます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/multi-chanels-adc.jpg" alt="" class="wp-image-2624" width="552" height="620" srcset="https://depfields.com/wp-content/uploads/2020/06/multi-chanels-adc.jpg 553w, https://depfields.com/wp-content/uploads/2020/06/multi-chanels-adc-267x300.jpg 267w" sizes="(max-width: 552px) 100vw, 552px" /><figcaption>複数チャネルの変換</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>複数チャネルの連続変換モードでは初期設定時にチャネル数やとチャネルの変換順序を指定します①②③。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>連続変換モードでは<strong>チャネルごとの変換値を指定した配列変数に自動で格納</strong>するのですが、これは<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>DMA(D</strong>irect<strong> M</strong>emory<strong> A</strong>ccess<strong>)</strong></span>と呼ばれる技術が使われます④。DMAは自動的にレジスタとメモリ間の処理をCPU関与なしに行います。<strong>DMAに関してはのちに詳細を解説します</strong>のでここでは省略します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンではADコンバータは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">複数チャネルの変換にはDMAと組み合わせて使うことが必要不可欠</span></strong>です。<br>連続変換によりプログラムが簡素化されたように変換にかかる時間も短縮されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>ここまでで、ADコンバータの基本の使い方を解説してきました。<br>STM32マイコンでは実際のアプリケーションにおいて、チャネル数が増えた場合や、複数のADコンバータを同時に低電力で効率よく使用するなど高度な使い方にも対応できますが、<strong>基本はこれまでの解説のもので十分対応できます</strong>。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/adc/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/c8b22e41e15bf6f641a4beb57f60c0e85530596c15d5b12788b1aeb7cf475de2.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">AD converter [ADC details of STM32] | Most Powerful Bible to Become an Embedd...</div></div><div class="lkc-url">https://en.depfields.com/adc/</div><div class="lkc-excerpt">Because the STM32 MCU&#039;s AD converters are so sophisticated, it is recommended that beginners step up to them, starting with the simplest ones and understanding them in turn.This chapter describes the single-mode conversion method, in w</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/adc/">ADコンバータ【STM32のADコンバータ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>さまざまな割り込み【STM32の割り込み詳細】</title>
		<link>https://depfields.com/interrupt/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=interrupt</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Sat, 06 Jun 2020 13:43:35 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[システムクロック・割り込み]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2432</guid>

					<description><![CDATA[<p>ハードウェアを制御する組み込みプログラミングでは割り込み処理を避けては通れないでしょう。STM32マイコンの割り込み処理はARMコアCortex-M3のルールに基づいているため、ルールの仕組みを理解して割り込み処理設定や [&#8230;]</p>
<p>The post <a href="https://depfields.com/interrupt/">さまざまな割り込み【STM32の割り込み詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="427" src="https://depfields.com/wp-content/uploads/2020/06/2783744_s.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/2783744_s.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/2783744_s-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">ハードウェアを制御する組み込みプログラミングでは割り込み処理を避けては通れないでしょう。STM32マイコンの割り込み処理はARMコアCortex-M3のルールに基づいているため、ルールの仕組みを理解して割り込み処理設定や処理内容を記述する必要があります。この章ではARMコアCortex-M3特有の割り込みについてプログラム例を使用して解説しています。</p>







<h2 class="wp-block-heading">割り込みとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>システムクロックタイマの章でも割り込みが登場しましたが、この章ではSTM32マイコンで扱う割り込みを解説します。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み</span></strong>とは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">実行中のプログラムを一時中断して、特定の処理を行う</span></strong>ことです。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/interrupt.jpg" alt="" class="wp-image-2435" width="412" height="300" srcset="https://depfields.com/wp-content/uploads/2020/06/interrupt.jpg 420w, https://depfields.com/wp-content/uploads/2020/06/interrupt-300x219.jpg 300w" sizes="(max-width: 412px) 100vw, 412px" /><figcaption>割り込み</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込み機能はタイマをはじめ、ADコンバータ、UARTシリアル通信などのペリフェラルにもそれぞれ備わっていますので組み合わせて使用すれば、CPUの負担を減らし、効率のよいシステムを構築できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここでは前章のながれでタイマに備わった割り込みの機能を使って解説していきます。</p>
</div></div></div>



<h2 class="wp-block-heading">割り込み処理の設定</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>前章ではタイマを出力比較モードで入力クロックのカウント数をキャプチャコンペアレジスタ（CCR）で設定した値と比較してGPIO出力ポートを操作していました。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キャプチャコンペア割り込み</span></strong>を使った場合をみていきましょう。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みを利用するためにはどのペリフェラルを使う場合も共通することですが、各ペリフェラルの設定の他に<br>① <strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み初期化</span></strong><br>② <strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みの有効化</span></strong><br>③<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"> <strong>処理内容を記述した割り込みハンドラ関数の作成</strong></span><br>が必要です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>それではプログラムでの設定を解説していきましょう。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="571" height="522" src="https://depfields.com/wp-content/uploads/2020/06/interrupt-setting.jpg" alt="" class="wp-image-2510" srcset="https://depfields.com/wp-content/uploads/2020/06/interrupt-setting.jpg 571w, https://depfields.com/wp-content/uploads/2020/06/interrupt-setting-300x274.jpg 300w" sizes="(max-width: 571px) 100vw, 571px" /><figcaption>割り込み初期化設定</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　割り込みの初期化：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ペリフェラル（周辺機能）の割り込みはARMコアマイコンでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVIC</span></strong>（<strong>N</strong>ested <strong>V</strong>ectord <strong>I</strong>nterrupt <strong>C</strong>ontoller）が管理しています。NVICとは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ネスト型ベクタ割り込みコントローラ</span></strong>のことで、ネスト型（多重）とは複数の割り込みが発生したときに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">優先順位の高いものから順次処理するタイプ</span></strong>のことです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ベクタ</span>は割り込みの要因を示す<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">固有の番号</span>のこと</strong>で割り込みが発生した場合に割り込み要因に応じた処理項目を定めた<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ベクタテーブル</span></strong>と呼ばれる対応表にまとめています。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みベクタ</span></strong>によって、<strong>どのような割り込み</strong>が発生したかが分かるようになっています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ARM Cortex-M3コアマイコンでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVICがペリフェラルの割り込みをすべて管理</span></strong>しているので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みの初期化</span></strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVICの設定により行われます</span></strong>。<strong>NVICは各ペリフェラルで発生した割り込みをどの優先順位でどう処理するかの設定をする部分</strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>NVICの設定は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVIC_Init関数</span></strong>で行います。指定するパラメータは構造体変数のメンバで4種類あります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="720" height="132" src="https://depfields.com/wp-content/uploads/2020/06/nvic-setting-parameter.jpg" alt="" class="wp-image-2443" srcset="https://depfields.com/wp-content/uploads/2020/06/nvic-setting-parameter.jpg 720w, https://depfields.com/wp-content/uploads/2020/06/nvic-setting-parameter-300x55.jpg 300w" sizes="(max-width: 720px) 100vw, 720px" /><figcaption>NVIC設定パラメータ</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>NVIC_IRQChannel</strong>に設定するのは使用する割り込み種別で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVIC_IRQChannel一覧表から選択</span></strong>します。これらは<strong>ライブラリ<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">stm32f10x.h内に定義されたマクロ</span></strong>です。例えば、TIM5のCH4キャプチャコンペア割り込みでは<strong>TIM5_IRQn</strong>（TIM5グローバル割り込み）が相当しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">複数の割り込みが発生</span></strong>しているときにどの割り込みから処理するかを決めるのが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">グループ優先度</span></strong>です。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVIC_IRQChannelPreemptionPriority</span></strong>に 0から15まで指定でき、数値が小さくなるほど優先度は高くなります。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">0が最優先</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>例えば、グループ優先度1の割り込み処理Aを実行中にグループ優先度0の割り込み処理Bが発生すると処理Aを中断して処理Bに移ります。また、グループ優先度0の割り込み処理Bの実行中にグループ優先度1の割り込み処理Aが発生しても、割り込み処理Bは継続します。割り込み処理Aを実行中に同じグループ優先度の割り込み処理Cが発生すると、割り込み処理Aは継続し、終了後処理Cに移ります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>同じグループ優先度を持つ複数の割り込み処理が同時に発生していて実行待ちになっている場合に次にどの割り込み処理から処理するかを決めるのが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">サブ優先度</span></strong>です。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NVIC_IRQChannelSubPriority</span></strong>に0から15まで指定でき、数値が小さくなるほど優先度は高くなります。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">0が最優先</span></strong>です。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/priority.jpg" alt="" class="wp-image-2446" width="384" height="402" srcset="https://depfields.com/wp-content/uploads/2020/06/priority.jpg 384w, https://depfields.com/wp-content/uploads/2020/06/priority-287x300.jpg 287w" sizes="(max-width: 384px) 100vw, 384px" /><figcaption>割り込み優先度</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>優先度は4ビット分の16通り(0 – 15)の割り当てができるのですが、STM32ではグループ優先度、サブ優先度の割り当ては組み合わせに指定があり、それぞれが0から15までの16通りで割り当てできるのではなく、グループ優先度とサブ優先度合わせて4ビット分つまり、16通りの割り当てをするようになっています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この優先度の割り当て方法を<strong>NVIC_IRQChannelPreemptionPriority関数で指定</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この関数で指定を行わない場合は<strong>NVIC_PriorityGroup_4</strong>を指定した時と同様<strong>、<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">グループ優先度のみが有効</span></strong>となります。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="539" height="331" src="https://depfields.com/wp-content/uploads/2020/06/priority-group.jpg" alt="" class="wp-image-11457" srcset="https://depfields.com/wp-content/uploads/2020/06/priority-group.jpg 539w, https://depfields.com/wp-content/uploads/2020/06/priority-group-300x184.jpg 300w" sizes="(max-width: 539px) 100vw, 539px" /><figcaption>NVICグループ優先度</figcaption></figure>



<p>NVIC_IRQChannelPreemptionPriority()関数の実行例：<br>NVIC_IRQChannelPreemptionPriority(NVIC_PriorityGroup_4);</p>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>割り込みの優先度設定は複数の割り込みが同時に発生するような場合に使われるものですが、比較的単純な割り込みの場合は、グループ優先度のみ(NVIC_PriorityGroup_4)の設定でよいと思います。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　割り込みの有効化：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みの初期化でNVICを設定した後は、各ペリフェラルで割り込みを発生させてNVICに対してどんな割り込みが発生したかを通知するための設定を行います。タイマ割り込みの例では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_ITConfig関数</span></strong>を使用します。</p>
</div></div></div>



<p>TIM_ITConfig()関数の実行例：<br>TIM_ITConfig (TIM5, TIM_IT_CC4, <em>ENABLE</em>);</p>



<p><strong>第1引数</strong>は<strong>設定対象タイマ</strong>を指定します。<br>■　設定対象タイマ : TIM1 – TIM8</p>



<p><strong>第２引数</strong>は<strong>有効にする割り込みを下記いずれかのマクロで指定</strong>します。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/timer-intrrupt.jpg" alt="" class="wp-image-2449" width="400" height="242" srcset="https://depfields.com/wp-content/uploads/2020/06/timer-intrrupt.jpg 408w, https://depfields.com/wp-content/uploads/2020/06/timer-intrrupt-300x182.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></figure>



<p><strong>第３引数</strong>は<strong>有効か無効を指定</strong>します。<br>■　ENABLE : 有効<br>■　DISABLE : 無効<br>以上でペリフェラルの割り込みは有効になりました。</p>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　割り込みハンドラ関数を作成：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みが発生すると<strong>対象の<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みハンドラ関数</span>が呼び出され</strong>、関数内の処理が実行されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ハンドラ関数名は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">決まった名称が定められて</span></strong>おりこれもNVIC_IRQChannel一覧表に記載していますので参照してください。ここでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM5_IRQHandler()関数</span></strong>を使用します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM5の場合、割り込みが発生するたびに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割込みハンドラ関数TIM5_IRQHandler()関数</span></strong>が呼び出されるのですが、<strong>割り込み内容は数種類あり、どの割り込みが発生したかはわかりません</strong>。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>対象の割り込みが発生しているかどうかを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みステータスフラグをチェック</span></strong>してから必要に応じて割り込み処理の実行に移ります。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み発生原因の確認</span></strong>には<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_GetITStatus関数</span></strong>を使用します。</p>
</div></div></div>



<p>割り込みステータスの実行例：<br>if(<strong>TIM_GetITStatus</strong>(TIM5, TIM_IT_CC4) != RESET){<br><strong>TIM_ClearITPendingBit</strong>(TIM5, TIM_IT_CC4);<br><strong>&nbsp; [割り込み時の処理]</strong><br>}</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">関数の第1、第2引数はTIM_ITConfit関数と同じです。この関数はステータスフラグを示す戻り値があって、<br>■　SET : 割り込みが発生している<br>■　RESET : 割り込みは発生していない</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>上記例では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ステータスフラグがRESETでないならばTIM5のCH4キャプチャコンペア割り込みが発生</span></strong>しているため、割り込み時の処理を実行する流れです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みステータスフラグは割り込み処理が完了したあとに自動的にはクリア（リセット）されません。そこで、<strong>次の割り込みに対応するためには<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">強制的にクリアしておく必要</span></strong>があります。割り込みステータスフラグをクリアにするには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_ClearITPendingBit関数を使用</span></strong>します。</p>
</div></div></div>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">割り込みステータスフラグクリア関数の実行例 : <strong>TIM_ClearITPendingBit(TIM5,</strong><strong> TIM_IT_CC4)</strong>;</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">この関数の第1、第2引数もTIM_ITConfit関数と同じです。</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みステータスフラグクリア関数は割り込みハンドラが呼び出され、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み処理を実行する直前に実行</span></strong>してフラグをクリアしておくのが好ましいです。また、割り込みを有効化する直前にもリセットしておきましょう。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここで割り込みを使用する準備が完了しましたのであとは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み時の処理</span></strong>を記述するだけです。通常、<strong>割り込みでは複雑な処理は実行させず</strong>、<strong>簡単な処理だけにしておくほうがよい</strong>です。割り込みである以上、ほかの処理を中断しているからです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>例えば、シリアル通信の受信があったときに割り込みを発生させる場合には割り込み処理で受信処理すべてを実行するのではなく、受信通知フラグ（受信時に1、それ以外では0）をたてるだけで、フラグの状態に応じて処理自体はメインプログラムで行うようにすれば割り込み処理の負担はなくなります。</p>
</div></div></div>



<h2 class="wp-block-heading">外部入力による割り込み</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでは汎用タイマTIM5で割り込み動作の例を紹介してきました。次に外部入力による割り込みを紹介します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/interrupt-input.jpg" alt="" class="wp-image-2499" width="451" height="223" srcset="https://depfields.com/wp-content/uploads/2020/06/interrupt-input.jpg 451w, https://depfields.com/wp-content/uploads/2020/06/interrupt-input-300x148.jpg 300w" sizes="(max-width: 451px) 100vw, 451px" /><figcaption><br>外部入力割り込み</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PD10の入力を割り込みとするアプリでは入力ポートPD10に信号がはいると通常処理が中断して割り込みハンドラEXTxxxx_IRQHandler()関数に処理が移ります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込み発生時に実行したい処理はこの関数内に記述します。割り込みを使用したプログラムの流れは各周辺機能-さまざまな割り込みの項で説明したとおりです。各ペリフェラルの割り込む機能を使用するかわりに外部入力信号を割り込みのトリガにするところが異なるだけです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>下例では省略していますが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み信号ピンに使用するGPIOにもクロックを供給し、ピンを入力に設定しておきます</span></strong>。(PD_10)</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/interrupt-application.jpg" alt="" class="wp-image-2503" width="562" height="595"/><figcaption>外部入力割り込み</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　AFIOクロックの供給：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EXTIを使用する場合はAFIOクロックを供給しておく必要</span></strong>があります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　外部入力初期化：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず、GPIO_EXTILineConfig関数を実行して指定のGPIOポートをEXTIラインに接続します。関数の第1引数にはポートx（AからG）まで（GPIO_PortSourceGPIOx）を指定、第2引数にはピン番号y(0から15)まで(GPIO_PinSourcey)を指定します。</p>
</div></div></div>



<p>GPIO_EXTILineConfig関数実行例（PD10）：　<br><strong>GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource10);</strong></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">初期化はEXT_Init関数を実行</span></strong>します。関数の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">引数は構造体メンバ</span></strong>になっていて以下に示す設定パラメータを含んでいます。</p>
</div></div></div>



<p>外部入力割り込みEXTI初期化関数実行例：　<strong>EXTI_Init(&amp;EXTI_InitStructure);</strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="609" height="215" src="https://depfields.com/wp-content/uploads/2020/06/exti_line.jpg" alt="" class="wp-image-2456" srcset="https://depfields.com/wp-content/uploads/2020/06/exti_line.jpg 609w, https://depfields.com/wp-content/uploads/2020/06/exti_line-300x106.jpg 300w" sizes="(max-width: 609px) 100vw, 609px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>EXTI_Line</strong>メンバでは割り込みに使用する入力ポートを指定します。EXTIラインは20本あり、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ピンx（0-15）までの16本はピン番号に相当したEXTI_Linexを指定</span></strong>します。他の4本EXTIライン16-19はイベントラインによるウェイクアップを行う場合に使用します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="602" height="117" src="https://depfields.com/wp-content/uploads/2020/06/exti_mode.jpg" alt="" class="wp-image-2457" srcset="https://depfields.com/wp-content/uploads/2020/06/exti_mode.jpg 602w, https://depfields.com/wp-content/uploads/2020/06/exti_mode-300x58.jpg 300w" sizes="(max-width: 602px) 100vw, 602px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>EXTI_Mode</strong>メンバではEXTIを割り込みモードで使用するかイベントモードで使用するかを指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="616" height="118" src="https://depfields.com/wp-content/uploads/2020/06/exti_trigger.jpg" alt="" class="wp-image-2458" srcset="https://depfields.com/wp-content/uploads/2020/06/exti_trigger.jpg 616w, https://depfields.com/wp-content/uploads/2020/06/exti_trigger-300x57.jpg 300w" sizes="(max-width: 616px) 100vw, 616px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>EXTI_Trigger</strong>メンバでは割り込み・イベントを発生させるラインエッジを指定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="594" height="118" src="https://depfields.com/wp-content/uploads/2020/06/exti_linecmd.jpg" alt="" class="wp-image-2459" srcset="https://depfields.com/wp-content/uploads/2020/06/exti_linecmd.jpg 594w, https://depfields.com/wp-content/uploads/2020/06/exti_linecmd-300x60.jpg 300w" sizes="(max-width: 594px) 100vw, 594px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><strong>EXTI_LineCmd</strong>メンバではEXTIラインの有効・無効を指定します。</strong></p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">③　割り込みの初期化：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部入力割り込みの場合は、構造体変数のメンバのNVIC_IRQChannel に ピン番号に応じたIRQチャネルを指定します。ピン10の場合はEXTI15_10_IRQnです。その他の設定は他の割り込みと同様です。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">④　割り込みハンドラに処理内容を記述：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みにより呼び出された関数(割り込みハンドラ)に処理したい内容を記述します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>呼び出されるハンドラは割り込みラインにより特定のハンドラが呼び出されます。<a><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みNVIC_IRQChannel一覧表</span></strong></a>に記載したとおりです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ピン0 から 4までは</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">それぞれに対する</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みハンドラEXTI0_IRQHandler()</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>から</strong></span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EXTI4_IRQHandler()</span></strong>が<strong>独立して</strong>呼び出されるのですが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ピン5から9まではEXTI9_5_IRQHandler()</span></strong>が、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ピン10から15まではEXTI15_10_IRQHander()</span></strong>が呼び出されます。したがって、ピン5から15までの場合は呼び出された割り込みハンドラ内でどのピンからの割り込みなのかの<strong>識別のために、EXTI_GetITStatus(EXTI_Linex)ピン番号x(5-15）で確認</strong>する必要があります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>割り込みごとにフラグをクリアする必要がありますので、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EXTI_ClearITPendingBit関数を使用</span></strong>します。</p>
</div></div></div>



<p>割り込みステータスフラグクリア関数の実行例 : EXTI_ClearITPendingBit(EXTI_Line10);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この関数の引数もEXTI_GetITStatus関数と同じです。</p>
</div></div></div>



<div style="background: #00ccff; padding: 5px 10px; color: #ffffff; border-radius: 10px 10px 0 0;"><strong>コラム</strong></div>
<div style="background: #ffffea; padding: 10px; border: 2px solid #00ccff; border-radius: 0 0 10px 10px;">
<p>割り込みにはほかにADコンバータ、UARTシリアル通信などの割り込みがあります。<strong>ペリフェラルライブラリでの関数名や、引数名は異なりますが使い方の流れはタイマのときとほぼ同じ</strong>です。実際の使用方法につきましては改めて、<strong>アプリケーションと実際の章</strong>でプログラムを紹介したいとおもいます。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h2 class="wp-block-heading">割り込みNVIC_IRQChannel一覧表</h2>



<figure class="wp-block-image size-large"><img decoding="async" width="742" height="621" src="https://depfields.com/wp-content/uploads/2020/06/nvic1.jpg" alt="" class="wp-image-2460" srcset="https://depfields.com/wp-content/uploads/2020/06/nvic1.jpg 742w, https://depfields.com/wp-content/uploads/2020/06/nvic1-300x251.jpg 300w" sizes="(max-width: 742px) 100vw, 742px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="740" height="539" src="https://depfields.com/wp-content/uploads/2020/06/nvic2.jpg" alt="" class="wp-image-2461" srcset="https://depfields.com/wp-content/uploads/2020/06/nvic2.jpg 740w, https://depfields.com/wp-content/uploads/2020/06/nvic2-300x219.jpg 300w" sizes="(max-width: 740px) 100vw, 740px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="741" height="573" src="https://depfields.com/wp-content/uploads/2020/06/nvic3.jpg" alt="" class="wp-image-2462" srcset="https://depfields.com/wp-content/uploads/2020/06/nvic3.jpg 741w, https://depfields.com/wp-content/uploads/2020/06/nvic3-300x232.jpg 300w" sizes="(max-width: 741px) 100vw, 741px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="750" height="556" src="https://depfields.com/wp-content/uploads/2020/06/nvic4.jpg" alt="" class="wp-image-2463" srcset="https://depfields.com/wp-content/uploads/2020/06/nvic4.jpg 750w, https://depfields.com/wp-content/uploads/2020/06/nvic4-300x222.jpg 300w" sizes="(max-width: 750px) 100vw, 750px" /></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/interrupt/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/152030e09ca39c4c4db1815fd0b1dc3183a99ce32e503f1a6d70c915c89a266e.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Various interrupts [Interrupt details in STM32] | Most Powerful Bible to Beco...</div></div><div class="lkc-url">https://en.depfields.com/interrupt/</div><div class="lkc-excerpt">Interrupt processing is unavoidable in embedded programming that controls hardware.  Interrupt processing in the STM32 MCU is based on the rules of the ARM Core Cortex-M3, so it is necessary to understand how the rules work and to write th</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/interrupt/">さまざまな割り込み【STM32の割り込み詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>タイマ・カウンタ【STM32の高機能・汎用タイマ詳細】</title>
		<link>https://depfields.com/timer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=timer</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Fri, 05 Jun 2020 09:36:15 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[タイマ]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2307</guid>

					<description><![CDATA[<p>マイコンのタイマ・カウンタは外部から与えた入力パルス数のカウント、入力パルス周波数の計算、任意の周波数パルス出力、PWMパルスの出力、そしてパルス以外では時間計測などタイマ・カウンタを組み合わせた用途は広いです。 STM [&#8230;]</p>
<p>The post <a href="https://depfields.com/timer/">タイマ・カウンタ【STM32の高機能・汎用タイマ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="426" src="https://depfields.com/wp-content/uploads/2020/06/abacus-1866497_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/abacus-1866497_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/abacus-1866497_640-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">マイコンのタイマ・カウンタは外部から与えた入力パルス数のカウント、入力パルス周波数の計算、任意の周波数パルス出力、PWMパルスの出力、そしてパルス以外では時間計測などタイマ・カウンタを組み合わせた用途は広いです。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">STM32のタイマ・カウンタペリフェラルはとても多機能ですべてを理解するのは大変ですがこのサイトでは最も実用的な機能を抜粋して解説しています。タイマ・カウンタの基本動作からタイマを利用したさまざまな出力の仕方を解説しています。</p>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">ライブラリはSPLを使用していますが基本動画が理解できれば将来的にHAL等への移植は難しくはないでしょう。</p>







<h2 class="wp-block-heading">ペリフェラルのタイマ・カウンタ</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>マイコンのペリフェラル（周辺機能）のなかでもタイマ・カウンタは最も使用頻度が高いものではないでしょうか。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>プログラム自体が<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">処理時間</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">経過時間概念</span></strong>の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">組み合わせ</span></strong>で成り立っていますので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タイマ・カウンタ機能は組み込み技術には欠かせない</span></strong>ものです。これを使いこなせるようになれば幅広いアプリケーションの開発ができるようになりますのでここはしっかり理解していきましょう。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>前章で解説したシステムタイマである<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTickタイマ</span></strong>は動作周波数である<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">システムクロックをカウント</span></strong>して周期的に割り込みを発生させてその中で処理をする比較的簡易なものでした。ただし、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込み処理をCPUが実行しているので高速になるほどCPUに負担</span></strong>がかかります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これに対して<strong>ペリフェラルの高機能・汎用タイマは<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CPUとは独立した専用回路が直接出力を操作</span></strong>しますので、割り込み処理を必要とするシステムタイマに比べCPUに負担をかけず効率化できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">高機能タイマ</span></strong>TIM1,TIM8(マイコンによります)は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">APB2 バスに接続</span></strong>されていてAPB2プリスケーラ、逓倍回路を経てクロックが供給されます（ここでは72MHzのクロック）。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">汎用タイマ</span></strong>TIM2-7(マイコンによります)は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">APB1バスに接続</span></strong>されていてAPB1プリスケーラ、逓倍回路を経てクロックが供給されます（ここでは36MHzのクロック）。</p>
</div></div></div>



<figure class="wp-block-image size-large"><a href="https://depfields.com/wp-content/uploads/2020/06/peripheral-timer-clock.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/peripheral-timer-clock.jpg" alt="" class="wp-image-2332"/></a><figcaption>高機能・汎用タイマ供給クロック</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これから解説する高機能・汎用タイマはシステムタイマのように<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">一定時間ごとの割り込みを発生</span></strong>させる機能に加えて、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">任意の周波数のパルスを発生</span></strong>させることもできます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タイマに供給される内部クロックだけでなく<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部からの信号</span></strong>や<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">他のタイマからの出力信号をカウント</span></strong>することができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンタイマの外部のクロック源をクロックとして供給する場合はタイマ用の各チャネルのピン(TIMx-CHy: xタイマ番号、yチャネル番号)をクロック入力用に使用する<strong>外部クロックモード1</strong>とタイマの外部トリガ用専用ピン（TIMx-ETR）をクロック入力用に使用する<strong>外部クロックモード2</strong>があります。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/peripheral-timer.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/peripheral-timer.jpg" alt="" class="wp-image-2325" width="375" height="188" srcset="https://depfields.com/wp-content/uploads/2020/06/peripheral-timer.jpg 382w, https://depfields.com/wp-content/uploads/2020/06/peripheral-timer-300x151.jpg 300w" sizes="(max-width: 375px) 100vw, 375px" /></a><figcaption>高機能・汎用タイマ</figcaption></figure>



<h2 class="wp-block-heading">高機能タイマと汎用タイマ</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここで、STM32マイコンでいう<strong>高機能タイマと汎用タイマの違いについて</strong>言及します。どちらもすでに十分な機能を持ち合わせているのですが、高機能タイマは通常のタイマ機能に加えて<strong>さらに<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">デッドタイム付きPWM</span></strong>および<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">相補出力を生成する機能</span></strong>などがあります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この機能はモータ制御に使用するインバータなどパワーエレクトロニクスのスイッチングタイミングをコントロールするのに必要な高度な特化した機能ですので<strong>通常の用途では必要ありません</strong>。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>また、高機能タイマを使用する場合、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">汎用タイマには必要のない設定を行わなければタイマ出力が無効となる</span></strong>場合がありますので使用しない機能でもすべて設定するのが無難です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">汎用タイマでも十分多機能</span></strong>ですので慣れるまでは少しでも設定の簡素化した<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">汎用タイマ（TIM2-7:マイコンによります）を使用することをおすすめ</span></strong>します。</p>
</div></div></div>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"> 註： NUCLEO-F103RB 搭載のSTM32F103RBではタイマはTIM1-4で選定します 。<br>高機能タイマはTIM１だけです。</p>



<h2 class="wp-block-heading">タイマ・カウンタの動作</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>入力したクロックパルスの<strong>カウント数を格納するレジスタ</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウンタレジスタ</span></strong>といい、<strong>カウント上限回数を設定するレジスタ</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">自動リロードレジスタ（ARR:</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>A</strong>uto <strong>R</strong>eload <strong>R</strong>egister</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">）</span></strong>をいいます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>パルスのカウント方法は3つあり、カウント数0から設定値ARRまで<strong>加算する方式</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">アップカウント</span></strong>、設定値ARRから0まで<strong>減算する方式</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ダウンカウント</span></strong>、そして0と設定値ARRの間で<strong>加算、減算を繰り返す方式</strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">センターアラインカウント</span></strong>といいます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">アップカウントの場合</span></strong>はカウント数（カウンタレジスタ値）がARRに到達して次のカウントをしたときに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウンタオーバーフロー</span></strong>になって、割り込みなどを発生させます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ダウンカウンタの場合</span></strong>はカウント数が0になって次のカウントをしたときに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウンタアンダーフロー</span></strong>になって割り込みなどを発生させます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">センターアラインカウントの場合</span></strong>は加算でARRに到達し<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">オーバーフロー</span></strong>、減算で0に到達し<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">アンダーフロー</span></strong>で割り込みなどを発生させます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/count-method.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/count-method.jpg" alt="" class="wp-image-2326" width="613" height="173" srcset="https://depfields.com/wp-content/uploads/2020/06/count-method.jpg 627w, https://depfields.com/wp-content/uploads/2020/06/count-method-300x85.jpg 300w" sizes="(max-width: 613px) 100vw, 613px" /></a><figcaption>アップカウント、ダウンカウント、センターアラインカウント</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>各タイマ</strong>には<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">プリスケーラと呼ばれる分周器</span></strong>が<strong>内蔵</strong>されています。プリスケーラは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">16ビットカウンタで構成</span></strong>されていますのでカウンタクロックを最大65535分の1（1/2<sup>16</sup>)まで任意に遅くすることができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>カウント動作中に加算時のオーバーフローや減算時のアンダーフローが発生すると割り込みなどの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">更新イベントが発生</span></strong>します。汎用タイマでは更新イベントを繰り返します。<strong>高機能タイマでは更新イベントの発生タイミング</strong>や<strong>繰り返しカウンタの回数</strong>などを<strong>設定</strong>できますがここでは言及しません。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/timer-prescaler.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/timer-prescaler.jpg" alt="" class="wp-image-2327" width="340" height="114" srcset="https://depfields.com/wp-content/uploads/2020/06/timer-prescaler.jpg 345w, https://depfields.com/wp-content/uploads/2020/06/timer-prescaler-300x101.jpg 300w" sizes="(max-width: 340px) 100vw, 340px" /></a><figcaption>タイマのプリスケーラ（分周器）</figcaption></figure>



<div style="background: #ffffea; padding: 15px; border: 1px solid #1a66ff; border-radius: 10px; word-break: break-all;">
<p>タイマ機能の役割は<br><strong>① <span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">カウント結果に応じて割り込みなどのイベントを発生</span></strong>させる　<br><strong>② <span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">カウント結果に応じてタイマ出力の状態を変化</span></strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">させる<br></span><strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">③ 外部クロックの回数カウントやパルス幅の計測</span></strong>　の3種類があります。</p>
</div>
<p>&nbsp;</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>①</strong>は前章のSisTickタイマと同じような使い方です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>②</strong>はカウンタを利用してパルス出力を発生させるもので例えばモータ制御の速度入力指令値などに利用されます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/timer-function1.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/timer-function1.jpg" alt="" class="wp-image-2346" width="335" height="237" srcset="https://depfields.com/wp-content/uploads/2020/06/timer-function1.jpg 366w, https://depfields.com/wp-content/uploads/2020/06/timer-function1-300x212.jpg 300w" sizes="(max-width: 335px) 100vw, 335px" /></a><figcaption>割り込み、イベント発生およびパルス出力</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>③</strong>は①と②を組み合わせて使うことで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">信号の時間的な間隔を計測したりする使い方</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>例えばある外部信号の入力間隔を測りたい場合はタイマを利用すれば簡単です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部信号に対して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">十分細かい計測用内部クロックをカウント</span></strong>します。外部信号が入力されるとまず<strong>現状のカウント数を取得</strong>（カウント取得値A,B）してから<strong>カウント開始信号としてリセット</strong>します。そして<strong>次の外部信号入力まで計測用内部クロックをカウント</strong>するのを繰り返します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>カウント数は外部パルスの時間間隔(入力間隔A,B)つまり、<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>外部パルス速度(時間間隔の逆数</strong>)<strong>を計測したことになります</strong></span>。後述しますが、外部信号は<strong>割り込み入力</strong>とするとより正確な計測ができます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/timer-function2.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/timer-function2.jpg" alt="" class="wp-image-2347" width="374" height="286" srcset="https://depfields.com/wp-content/uploads/2020/06/timer-function2.jpg 355w, https://depfields.com/wp-content/uploads/2020/06/timer-function2-300x230.jpg 300w" sizes="(max-width: 374px) 100vw, 374px" /></a><figcaption>信号間隔計測</figcaption></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-height"><div class="vk_block-margin-md--height"></div></div>



<h2 class="wp-block-heading">高機能・汎用タイマペリフェラルの使い方</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タイマの機能を学ぶにはまず実際に使ってみることですが、ここでは基本的なものからはじめて利用方法を理解していきましょう。まず手ほどきに基本の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">出力比較モード</span></strong>をプログラムで解説していきます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここで出力比較モードとはカウント数を0と自動リロードレジスタ（ARR:　Auto Reload Register）間に設定した<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>キャプチャコンペアレジスタ</strong>（<strong>CCR: C</strong>apture<strong> C</strong>ompare<strong> R</strong>egister）</span>と比較するモードです。カウント数がCCRと一致したときに出力が変化します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/capture-compare.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/capture-compare.jpg" alt="" class="wp-image-2349" width="336" height="239" srcset="https://depfields.com/wp-content/uploads/2020/06/capture-compare.jpg 344w, https://depfields.com/wp-content/uploads/2020/06/capture-compare-300x214.jpg 300w" sizes="(max-width: 336px) 100vw, 336px" /></a><figcaption>出力比較モード</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実際のプログラムでの設定を解説していきます。</p>
</div></div></div>



<h3 class="wp-block-heading">出力比較モードの設定例</h3>



<p>目的：汎用タイマの出力比較モードで5kHzのパルスを出力する<br>■　タイマはTIM5の出力チャネルCH1-4のうちCH4(PA3)のみ使用<br>■　タイマへの供給クロックは36MHz<br>■　カンタ動作はアップカウンタモードで出力比較モード</p>



<p>註： NUCLEO-F103RB 搭載のSTM32F103RBではタイマはTIM1-4で選定します</p>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2020/06/capture-compare-setting.jpg"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/capture-compare-setting.jpg" alt="" class="wp-image-2791" width="665" height="683"/></a></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;① GPIOおよびタイマTIM5にクロック供給&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>GPIOポートA</strong>は<strong>APB2に接続</strong></span>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM5はAPB1に接続</span></strong>しているのでそれぞれの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ペリフェラルにクロックを供給</span></strong>します。高機能タイマ(TIM1とTIM8：マイコンによります)の場合はAPB2に供給します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;② タイマに使うGPIOの設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>使用するタイマの出力ポート<strong>GPIOの設定</strong>を行います。<strong>PA3</strong>にタイマ出力の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">オルタネート出力</span></strong>を設定します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③ タイマの初期化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次に<strong>タイマの初期化(TIM_TimeBaseInit関数)</strong>を行います。初期化項目は多岐にわたるので順次解説していきましょう。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タイマの初期化設定</span>③</strong>ではタイマのプリスケールやカウンタ動作モードを指定します。初期化関数<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_TimeBaseInit</span></strong>()を使用します。</p>
</div></div></div>



<p>タイマ初期化関数実行例：<br>TIM_TimeBaseInit(TIM5, &amp;TIM_TimeBaseStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象タイマTIM5など指定</strong>します。第2引数は<strong>構造体メンバ</strong>になっていて以下に示します。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="705" height="200" src="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member1.jpg" alt="" class="wp-image-11881" srcset="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member1.jpg 705w, https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member1-300x85.jpg 300w" sizes="(max-width: 705px) 100vw, 705px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>設定例では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_Prescaler</span></strong>を<strong>75-1</strong>に指定して36MHzのクロックを75分周して<strong>TIM5に480kHz(TIM5CLK)を供給</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>ARR</strong>はメンバ<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_Period</span></strong>で設定します。<br>5kHzのタイマ出力が発生させるには10kHzごとに出力を反転(トグル)させればよいので<strong>48-1</strong>とします。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="702" height="239" src="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member2.jpg" alt="" class="wp-image-11882" srcset="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member2.jpg 702w, https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member2-300x102.jpg 300w" sizes="(max-width: 702px) 100vw, 702px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この例では<strong>アップカウンタモード</strong>を設定しています。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="702" height="160" src="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member3.jpg" alt="" class="wp-image-11883" srcset="https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member3.jpg 702w, https://depfields.com/wp-content/uploads/2020/06/tim_base_init_member3-300x68.jpg 300w" sizes="(max-width: 702px) 100vw, 702px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④ タイマ出力の設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>タイマ出力の設定(TIM_OCxInit関数)</strong>を行います。この例ではCH4だけ有効にしています。<br><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">出力比較モードの詳細設定④</span></strong>ではタイマの出力仕様パラメータを指定します。</p>
</div></div></div>



<p>出力比較モード初期化関数実行例：<br>TIM_OC4Init(TIM5, &amp;TIM_OCInitStructure);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM_OCxInit関数の第2引数はTIM_OCInitTypeDef型構造体のメンバとなっていて、下表にまとめますが、その中でTIM_OutputNState、TIM_OCNPolarityおよびTIM_OCNIdleStateは高機能タイマでのみ必要なものなので汎用タイマでは省略します。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="688" height="272" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member1.jpg" alt="" class="wp-image-11884" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member1.jpg 688w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member1-300x119.jpg 300w" sizes="(max-width: 688px) 100vw, 688px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="689" height="147" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member2.jpg" alt="" class="wp-image-11885" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member2.jpg 689w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member2-300x64.jpg 300w" sizes="(max-width: 689px) 100vw, 689px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="686" height="145" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member3.jpg" alt="" class="wp-image-11886" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member3.jpg 686w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member3-300x63.jpg 300w" sizes="(max-width: 686px) 100vw, 686px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="690" height="137" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member4.jpg" alt="" class="wp-image-11887" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member4.jpg 690w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member4-300x60.jpg 300w" sizes="(max-width: 690px) 100vw, 690px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="684" height="75" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member5.jpg" alt="" class="wp-image-11888" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member5.jpg 684w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member5-300x33.jpg 300w" sizes="(max-width: 684px) 100vw, 684px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="684" height="172" src="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member6.jpg" alt="" class="wp-image-11889" srcset="https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member6.jpg 684w, https://depfields.com/wp-content/uploads/2022/03/tim_ocmode_member6-300x75.jpg 300w" sizes="(max-width: 684px) 100vw, 684px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤ タイマのカウントを開始</span><span style="background-color: #003300; color: #ffffff;">：</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>すべての設定終了後、<strong>タイマのカウントを開始(TIM_Cmd関数)</strong>します。<br>この時点から出力が発生します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ここまででタイマの設定ができましたのでTIM_Cmd関数を実行してタイマを有効化してカウントを始めます。</p>
</div></div></div>



<p>TIM_Cmd関数実行例：TIM_Cmd(TIM5, <strong>ENABLE</strong>);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM_ Cmd関数の第2引数に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ENBLEを指定するとカウントを開始</span></strong>し、<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>DISABLEで停止</strong></span>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この時点でTIM5のCH4につながっている<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PA3に5kHzのプッシュプル出力が開始</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このプログラム例では出力はCH4の1つのみですが、ほかのチャネルCH1-CH3を同時に使い、それぞれのチャネルに別々のCCR（キャプチャコンペアレジスタ値）を指定すると、同じパルスで位相をずらしたものが出力できます。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="381" height="302" src="https://depfields.com/wp-content/uploads/2020/06/multi-chanel-pulse.jpg" alt="" class="wp-image-11890" srcset="https://depfields.com/wp-content/uploads/2020/06/multi-chanel-pulse.jpg 381w, https://depfields.com/wp-content/uploads/2020/06/multi-chanel-pulse-300x238.jpg 300w" sizes="(max-width: 381px) 100vw, 381px" /><figcaption>複数のチャネルパルス</figcaption></figure>





<h3 class="wp-block-heading">任意のタイミングで位相をずらす場合</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>任意のタイミングでCH4の位相をずらしたい場合は<br>TIM_SetCompare4関数でCH4の位相を変更できます。</p>
</div></div></div>



<p>TIM_SetCompare関数実行例：TIM_SetCompare4(TIM5, <strong>CCR_VALUE</strong>);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">設定対象タイマ</span></strong>TIM5など指定します。第2引数は出力比較モード設定内メンバのTIM_Pulseに相当する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CRRの値を指定</span></strong>します。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="361" height="255" src="https://depfields.com/wp-content/uploads/2022/03/various-phase-pulse.jpg" alt="" class="wp-image-11891" srcset="https://depfields.com/wp-content/uploads/2022/03/various-phase-pulse.jpg 361w, https://depfields.com/wp-content/uploads/2022/03/various-phase-pulse-300x212.jpg 300w" sizes="(max-width: 361px) 100vw, 361px" /><figcaption>様々な位相のパルス</figcaption></figure>



<h3 class="wp-block-heading">任意の周波数に変更する場合</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM5の周波数を変更したい場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_SetAutoreload関数</span></strong>で周波数を変更できます。</p>
</div></div></div>



<p>TIM_SetAutoreload関数実行例：TIM_SetAutoreload(TIM5, <strong>ARR_VALUE</strong>);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">設定対象タイマ</span></strong>TIM5など指定します。第2引数はタイマ初期化関数内メンバのTIM_ Periodに相当する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ARRの値を指定</span></strong>します。図ではアップカウンタでの例ですがカウント途中でARRを変更することになるので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ダウンカウンタを使用</span></strong>するほうがよいです。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="362" height="249" src="https://depfields.com/wp-content/uploads/2022/03/various-freq-pulse.jpg" alt="" class="wp-image-11892" srcset="https://depfields.com/wp-content/uploads/2022/03/various-freq-pulse.jpg 362w, https://depfields.com/wp-content/uploads/2022/03/various-freq-pulse-300x206.jpg 300w" sizes="(max-width: 362px) 100vw, 362px" /><figcaption>様々な周波数のパルス</figcaption></figure>



<h3 class="wp-block-heading">高機能タイマ出力の場合のみ</h3>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>汎用タイマの場合はこれで設定は完了なのですが、<strong>高機能タイマの出力を有効化するには</strong>さらに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_CtrlPWMOutputs（TIMx, ENABLE）</span></strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">追加</span></strong>しておいてください。</p>
</div></div></div>



<h2 class="wp-block-heading">タイマの応用</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでのタイマの使い方としては、自動リロードレジスタ（ARR）の値を変更してカウントサイクル（周波数）を変え、キャプチャコンペアレジスタ(CCR)の値を変更することで、出力タイミング（位相）を変えることができました。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タイマの使い方としてはこの他にも、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PWM出力</span></strong>や、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部からの高速クロック信号をカウント</span></strong>することもできますので、一部紹介したいと思います。</p>
</div></div></div>



<p><span style="background-color: #3366ff; color: #ffffff; font-size: 20px;">&nbsp;PWMモード出力&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>アップカウント時、PWMモード1ではカウント数がCCRより小さいときにHigh,そうでないときにLowとしています。PWMモード2はその反転出力です。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="337" height="323" src="https://depfields.com/wp-content/uploads/2020/06/pwm-up.jpg" alt="" class="wp-image-11894" srcset="https://depfields.com/wp-content/uploads/2020/06/pwm-up.jpg 337w, https://depfields.com/wp-content/uploads/2020/06/pwm-up-300x288.jpg 300w" sizes="(max-width: 337px) 100vw, 337px" /><figcaption>PWMモード出力（アップカウンタ）</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ダウンカウント時、PWMモード1ではカウント数がCCRより大きいときにLow,そうでないときにHighとしています。PWMモード2はその反転出力です。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="343" height="313" src="https://depfields.com/wp-content/uploads/2022/03/pwm-down.jpg" alt="" class="wp-image-11895" srcset="https://depfields.com/wp-content/uploads/2022/03/pwm-down.jpg 343w, https://depfields.com/wp-content/uploads/2022/03/pwm-down-300x274.jpg 300w" sizes="(max-width: 343px) 100vw, 343px" /><figcaption>PWMモード出力（ダウンカウンタ）</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PWM出力の特徴は出力周期（サイクルカウント）は一定でCCRを変更することでON/OFFの比率（デューティ比）を変えることができることです。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="352" height="214" src="https://depfields.com/wp-content/uploads/2022/03/pwm.jpg" alt="" class="wp-image-11896" srcset="https://depfields.com/wp-content/uploads/2022/03/pwm.jpg 352w, https://depfields.com/wp-content/uploads/2022/03/pwm-300x182.jpg 300w" sizes="(max-width: 352px) 100vw, 352px" /><figcaption>PWM出力</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>設定は<strong>出力比較モードとほぼ同じ</strong>で、TIM_OCxInit関数の第2引数のメンバのうちTIM_OCModeを<strong>TIM_ OCMode_PWM1</strong>か<strong>TIM_ OCMode_PWM2</strong>に指定するだけです。出力は出力比較モードのTIM_OCModeにTIM_OCMode_Toggleを指定したときの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">2倍の周波数になる</span>ことに注意</strong>してください。</p>
</div></div></div>



<p><span style="background-color: #3366ff; color: #ffffff; font-size: 20px;">&nbsp;外部高速クロックカウント&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タイマの応用として<strong>外部の高速クロックをカウント</strong>することができるので紹介しましょう。</p>
</div></div></div>



<p><span style="background-color: #00ccff; color: #ffffff;"><span style="background-color: #ffffff;">　　　</span>&nbsp;外部クロックモード&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32のタイマには外部パルスを計測する機能があります。ロボット等のアクチュエータには<strong>位置、速度を検知するセンサとしてエンコーダがよく使われる</strong>のですが、外部パルスをカウントするには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部クロックモード</span></strong>としてタイマを使用します。外部クロックモードを使用するには、タイマ初期化(TimeBaseInit関数実行)直後に<strong><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_TIxExternalClockConfig()関数</span></strong></strong>を実行して設定します。</p>
</div></div></div>



<p>外部クロックモード関数実行例：<br>TIM_TIxExternalClockConfig(TIM3,　TIM_TIｘExternalCLKSource_TI1, TIM_ICPolarity_Rising, 0xf);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong>設定対象タイマTIM3など指定</strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第2引数は<strong>入力クロックパルス対象を指定</strong>します。<br>■　CH1のピン入力であるTI1のエッジを読み取るTIM_TIxExternalCLK1Source_TI1<br>■　CH2のピン入力であるTI2のエッジを読み取るTIM_TIxExternalCLK1Source_TI2<br>■　TI1とTI2のエッジ両方を読み取るTIM_TIxExternalCLK1Source_TI1ED</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第3引数は<strong>TI1/TI2が検出するエッジを以下から指定</strong><br>■　立ち上がりエッジ検出のTIM_ICPolarity_Rising（極性はそのまま）<br>■　立ち下がりエッジ検出のTIM_ICPolarity_Falling（極性は反転）</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第4引数は以下に示した<strong>フィルタの種類を指定</strong>します。高速なエンコーダパルスを読み取る際のチャタリングなどのノイズを防止するためです。特別に高速なパルスを読み取るのでない場合はサンプリングの一番大きな"f"を指定しておいてよいのではないでしょうか。実際に動作させてみて調整するのがいいかと思います。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="300" height="461" src="https://depfields.com/wp-content/uploads/2022/03/table_filter.jpg" alt="" class="wp-image-11897" srcset="https://depfields.com/wp-content/uploads/2022/03/table_filter.jpg 300w, https://depfields.com/wp-content/uploads/2022/03/table_filter-195x300.jpg 195w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<figure class="wp-block-image size-large"><a href="https://depfields.com/wp-content/uploads/2020/08/external-clockmode-setting.jpg"><img decoding="async" width="743" height="573" src="https://depfields.com/wp-content/uploads/2020/08/external-clockmode-setting.jpg" alt="" class="wp-image-5368" srcset="https://depfields.com/wp-content/uploads/2020/08/external-clockmode-setting.jpg 743w, https://depfields.com/wp-content/uploads/2020/08/external-clockmode-setting-300x231.jpg 300w" sizes="(max-width: 743px) 100vw, 743px" /></a></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　GPIOおよびTIM4にクロックを供給　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM3のCH1(PA6)を使用する例では<strong>GPIOポートAはAPB2に接続</strong>、<strong>TIM3はAPB1に接続</strong>しているのでそれぞれの<strong>ペリフェラルにクロックを供給</strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　GPIO初期化　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部入力の仕様に合わせて設定。ここでは無電圧接点入力のパルスを使用するためプルアップ入力としています。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　TIM初期化　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部クロックのカウントではTIM3の初期化は省略できそうな気もしますが実行しておきましょう。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④⑤　TIMを外部クロックモードに設定しカウント開始　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM3を<strong>外部クロックモードで使用</strong>するために<strong>TIM_TIxExternalClockConfig関数を実行</strong>します。<br>フィルターはサンプリング回数が大きなものほど鈍くなりノイズに強いので 問題なければ"f"でいいと思います。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　カウント値取得　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>入力パルスはアプリケーションプログラムの任意のタイミングで取得します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<p><span style="background-color: #00ccff; color: #ffffff;"><span style="background-color: #ffffff;">　　　</span> エンコーダインターフェースモード&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32タイマには外部信号として入力されたインクリメンタルエンコーダなどの高速パルスをタイマ機能だけでカウントすることができます。この場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">エンコーダインターフェースモード</span></strong>としてタイマを使用します。エンコーダインターフェースモードを使用するには、タイマ初期化(TimeBaseInit関数実行)直後に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_EncoderInterfaceConfig関数</span></strong>を実行して設定します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><a href="https://depfields.com/wp-content/uploads/2020/06/encoder-input.jpg"><img decoding="async" width="465" height="179" src="https://depfields.com/wp-content/uploads/2020/06/encoder-input.jpg" alt="" class="wp-image-2389" srcset="https://depfields.com/wp-content/uploads/2020/06/encoder-input.jpg 465w, https://depfields.com/wp-content/uploads/2020/06/encoder-input-300x115.jpg 300w" sizes="(max-width: 465px) 100vw, 465px" /></a><figcaption>エンコーダ入力</figcaption></figure>



<p>関数実行例：<br>TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI1,TIM_ICPolarity_Falling,TIM_ICPolarity_Rising);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> 関数の第1引数は設定対象タイマTIM4など指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第2引数は<br>■　CH1のピン入力である<strong>TI1のエッジ</strong>を読み取るTIM_EncoderMode_TI1<br>■　CH2のピン入力である<strong>TI2のエッジ</strong>を読み取るTIM_EncoderMode_TI2<br>■　TI1とTI2の<strong>両方のエッジ</strong>を読み取るTIM_EncoderMode_TI12</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第3引数はTI1がエッジを検出したときのエッジ極性を以下から選択指定<br>■　エッジ検出のTIM_ICPolarity_Rising（極性そのまま）<br>■　エッジ検出のTIM_ICPolarity_Falling（極性反転）<br></p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p> 第4引数はTI2がエッジを検出したときのエッジ極性を TI1と同様に選択指定</p>
</div></div></div>



<p>エンコーダインターフェースモードでは以下のパターンでカウントが行われます。</p>



<figure class="wp-block-image size-large"><a href="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode.png"><img decoding="async" width="798" height="197" src="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode.png" alt="" class="wp-image-9019" srcset="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode.png 798w, https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-300x74.png 300w, https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-768x190.png 768w" sizes="(max-width: 798px) 100vw, 798px" /></a></figure>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2021/04/encoder-updown.png"><img decoding="async" src="https://depfields.com/wp-content/uploads/2021/04/encoder-updown.png" alt="" class="wp-image-9020" width="580" height="272" srcset="https://depfields.com/wp-content/uploads/2021/04/encoder-updown.png 680w, https://depfields.com/wp-content/uploads/2021/04/encoder-updown-300x141.png 300w" sizes="(max-width: 580px) 100vw, 580px" /></a><figcaption>TI1およびTI2パルスカウント　 マニュアルRM008より </figcaption></figure>



<p>エッジの極性を反転に指定するとカウント方向が反転します。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://depfields.com/wp-content/uploads/2021/04/encoder-updown2.png"><img decoding="async" src="https://depfields.com/wp-content/uploads/2021/04/encoder-updown2.png" alt="" class="wp-image-9021" width="580" height="269" srcset="https://depfields.com/wp-content/uploads/2021/04/encoder-updown2.png 681w, https://depfields.com/wp-content/uploads/2021/04/encoder-updown2-300x140.png 300w" sizes="(max-width: 580px) 100vw, 580px" /></a><figcaption> TI1およびTI2パルスカウント(TI1極性反転）マニュアルRM008より </figcaption></figure>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p> <strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">エンコーダインターフェースモード</span></strong>ではエンコーダの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">パルスエッジをカウント</span></strong>しますので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TI1またはTI2のみ</span></strong>のエッジカウンタの場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">2逓倍</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TI1およびTI2</span></strong>のエッジカウンタの場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">4逓倍</span></strong>の分解能になります。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<figure class="wp-block-image size-large"><a href="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-setting.jpg"><img decoding="async" width="752" height="667" src="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-setting.jpg" alt="" class="wp-image-2796" srcset="https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-setting.jpg 752w, https://depfields.com/wp-content/uploads/2020/06/encoder-interfacemode-setting-300x266.jpg 300w" sizes="(max-width: 752px) 100vw, 752px" /></a></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　GPIOおよびTIM4にクロックを供給　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">GPIOポートD</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>は</strong></span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">APB2に接続</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM4はAPB1に接続</span></strong>しているのでそれぞれの<strong>ペリフェラルにクロックを供給</strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　GPIO初期化後リマップ実行　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>必要に応じて、GPIO初期化後リマップを実行します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　TIM4の初期化</span><span style="background-color: #003300; color: #ffffff;">　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部クロックのカウントではTIM4の初期化は省略できそうな気もしますが実行しておきましょう。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　TIM4をエンコーダフェースモードに設定　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TIM4を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">エンコーダインターフェースモードで使用</span></strong>するために<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_EncoderInterfaceConfig関数を実行</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TI1とTI2の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">両方のエッジ</span></strong>を検出するモードでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウント数が２倍になるためパルス分解能は４倍</span></strong>になります。いずれのモードでもTI1とTI2の位相によりアップカウント、ダウンカウントが切り替わります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　TIM4カウント開始　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>最後に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM_Cmd関数を実行</span></strong>し、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カウントを開始</span></strong>します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　カウント値取得　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">TIM4のカウンタ値</span></strong>はプログラム内で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">任意のタイミングで取得</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/timer/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/b27f4cbc7335270c99e42ab7373a6432539afcb7ffab4679bf8d9c0378022238.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Timer/Counter[STM32 Timers Details] | Most Powerful Bible to Become an Embedd...</div></div><div class="lkc-url">https://en.depfields.com/timer/</div><div class="lkc-excerpt">Timer counters on MCUs have a wide range of applications, such as counting the number of input pulses given externally, calculating input pulse frequency, outputting arbitrary frequency pulses, outputting PWM pulses, and measuring time</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/timer/">タイマ・カウンタ【STM32の高機能・汎用タイマ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>システムタイマ【STM32のSysTickタイマ詳細】</title>
		<link>https://depfields.com/systimer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=systimer</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Thu, 04 Jun 2020 15:01:59 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[システムクロック・割り込み]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2240</guid>

					<description><![CDATA[<p>&#160;分周した9MHzのシステムクロックをSysTickタイマとした割り込み： &#160;①　SysTickタイマのカウンタ値を設定&#160; &#160;②　システムクロック源を指定&#160; 引数にはAH [&#8230;]</p>
<p>The post <a href="https://depfields.com/systimer/">システムタイマ【STM32のSysTickタイマ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="480" src="https://depfields.com/wp-content/uploads/2020/06/stopwatch-2624277_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/stopwatch-2624277_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/stopwatch-2624277_640-300x225.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>




<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>システムタイマ</strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTickタイマ</span></strong>と呼ばれARM Cortex-M3シリーズに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">CPUコアの一部</span></strong>として備えているシンプルなタイマです。次章で解説するペリフェラルの汎用タイマはとても高機能ですが反面、設定も多岐項目にわたるため、設定も多岐項目にわたるため、ちょっとした用途にはSysTickタイマを使うと便利です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>SysTickタイマ</strong>はSTMマイコンの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">AHBクロックHCLK</span></strong>をカウントします。SysTickタイマはダウンカウンタで値を設定するとカウントダウンしていき、0に到達すると次のカウントで割り込みを発生しカウンタ値を設定値に戻すのを繰り返すタイマです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>SysTickタイマ</strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">設定した期間のサイクルで割り込みを発生</span></strong>させますのでちょっとした用途、例えばある処理を1秒ごと周期的に実行させるのにSysTickタイマを使うと簡単です。SysTickタイマの割込み機能を1秒ごと発生させてそのたびに割り込み処理を実行させるのです。例を示して解説します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;分周した9MHzのシステムクロックをSysTickタイマとした割り込み：</span></p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/systic-timer.jpg" alt="" class="wp-image-2242" width="446" height="277" srcset="https://depfields.com/wp-content/uploads/2020/06/systic-timer.jpg 442w, https://depfields.com/wp-content/uploads/2020/06/systic-timer-300x187.jpg 300w" sizes="(max-width: 446px) 100vw, 446px" /><figcaption>SysTickタイマを使った1 秒ごとの割り込み</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実際のプログラム内での設定を解説します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/SysTickタイマの設定手順.jpg" alt="" class="wp-image-2248" width="434" height="300" srcset="https://depfields.com/wp-content/uploads/2020/06/SysTickタイマの設定手順.jpg 434w, https://depfields.com/wp-content/uploads/2020/06/SysTickタイマの設定手順-300x207.jpg 300w" sizes="(max-width: 434px) 100vw, 434px" /><figcaption>SysTickタイマによる割り込み設定</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">72MHzのシステムクロックの場合</span></strong>はデフォルト設定値(<strong>SystemCoreClock</strong>)が<strong>72M</strong>(7200万)のため、そのまま<strong>SystemCoreClock</strong>を設定値としてしまうと1秒間72M回のカウントを繰り返します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>実際問題として<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTickタイマについているカウンタは24ビット</span></strong>なのでカウントできる上限は最大2<sup>24</sup>の16,777,216でこの制限値を超えないように設定しなければいけません。STM32マイコンではシステムクロックを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">そのままの速度</span></strong>で使用するか、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">8分の1に分周したもの</span></strong>を使用するか選択することができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>システムクロックが72MHz</strong>の場合は<strong>カウンタ上限を超えています</strong>ので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">8分の1に分周したもの</span></strong>を使用します。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　SysTickタイマのカウンタ値を設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>SysTickタイマのカウンタ値を設定するには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTickConfig()関数</span></strong>を使用します。1秒サイクルの割込みを発生させるにはシステムクロックそのままの場合には関数の引数はカウンタ設定値<strong>SystemCoreClock</strong>となりますが、8分周したクロックを使用する場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SystemCoreClock/8</span></strong>とします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>プログラムでは実行例でSysTick_Config関数の戻り値（正常の場合は0、タイマのカウント上限を超えるなど不正なtickが与えられると1）をチェックして正常実行を確認してから次の処理に進んでいます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　システムクロック源を指定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">システムクロック源を指定</span></strong>するのは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTick_CLKSourceConfig()関数</span></strong>を使用します。</p>
</div></div></div>



<p><strong>引数には<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">AHBクロックそのまま</span>か、<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">8分周したクロック</span>を指定</strong>します。</p>



<p>■　<strong>SysTick_CLKSource_HCLK</strong> : AHBクロックそのまま<br>■　<strong>SysTick_CLKSource_HCLK_Div8</strong> : AHBクロックを8分周したもの</p>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　割り込み処理の記述&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTickConfig()関数を実行</span></strong>したことで<strong>割り込みは有効</strong>となりました。SysTickクロックによる割り込みが発生した場合には<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">専用割り込み処理関数SysTick_Handler()関数</span></strong>が実行されるように設定されています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこでこの関数にシステムタイマ割り込み時に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">実行させたい処理</span></strong>を記述しておけば割り込み発生時に希望の処理を行わせることができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>上記プログラム例では1秒サイクルの割り込みを発生させるものでした。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">割り込みのサイクルを変更</span></strong>するには①<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SysTick_Config()関数の引数（カウント設定値）を変える</span></strong>だけです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>例えば上記プログラムの条件でSysTick_Config(SystemCoreClock/8 /1000)とすると、1msサイクルで割り込みが発生し、割り込み関数SysTick_Hander()が呼び出されますので、そのたびに1だけ値を増やすか、減らすかの処理を記述しておけば、簡単に<strong>1msタイマ</strong>が作成できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この章で紹介して解説したSysTickクロックを利用した簡単なタイマ機能を使えばマイコンプログラムでよく使用するdelay関数などを簡単に最低限のコードで作成できるようになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/systimer/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/eb7fffe1ee4d24da8e47090d0c9c5481b6b931ced1c6e540b5bd579152c3d5d8.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">System timer[SysTick timer details for STM32] | Most Powerful Bible to Become...</div></div><div class="lkc-url">https://en.depfields.com/systimer/</div><div class="lkc-excerpt">The system timer is called the SysTick timer and is a simple timer provided in the ARM Cortex-M3 series as part of the CPU core. The general-purpose peripheral timers described in the next chapter are very sophisticated, but on the ot</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/systimer/">システムタイマ【STM32のSysTickタイマ詳細】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>システムクロック【STM32のSYSCLK設定詳細 】</title>
		<link>https://depfields.com/sysclk/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sysclk</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Thu, 04 Jun 2020 11:01:04 +0000</pubDate>
				<category><![CDATA[各周辺機能(ペリフェラル)詳細]]></category>
		<category><![CDATA[システムクロック・割り込み]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2157</guid>

					<description><![CDATA[<p>システムクロックはマイコン固有のものですので一度設定すると変更するものではありませんが、しっかり理解することで他のマイコンへの応用ができるようになります。 マイコンのクロック クロック源の種類 クロックの設定 &#038;nbsp [&#8230;]</p>
<p>The post <a href="https://depfields.com/sysclk/">システムクロック【STM32のSYSCLK設定詳細 】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="476" src="https://depfields.com/wp-content/uploads/2020/06/clock-691143_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-691143_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/clock-691143_640-300x223.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">システムクロックはマイコン固有のものですので一度設定すると変更するものではありませんが、しっかり理解することで他のマイコンへの応用ができるようになります。</p>







<h2 class="wp-block-heading">マイコンのクロック</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この章では水晶振動子などの発振器で発生したクロック信号をもとにしてマイコンの動作周波数となる<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">システムクロックの作成の仕方</span></strong>、各ペリフェラルに供給する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロックの設定</span></strong>について解説します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロック</span></strong>とは組み込み技術の基本の章で説明しましたがマイコンのCPUを始めとし、すべての回路のタイミングとなるパルス信号のことです。組み込み機器でのクロック設定は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マイコンの性能を発揮する動作速度を確保</span></strong>したうえで、できるだけ<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">消費電力を押さえる</span></strong>ために重要なものです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>各ペリフェラルの設定をするときに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">どの速度のクロックが供給されているかを認識することは大切</span></strong>です。マイコン入門者にとって初めは少し難しいかもしれませんが、すべて理解する必要はなく<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">使うところだけを重点的に一度仕組みを理解して</span></strong>クロック設定の機能をまとめたブロック関数を作成してしまえば、あとは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">アプリケーションに応じてパラメータを変えるだけ</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>設定用のペリフェラルライブラリの使い方を解説していますが、マイコンのクロック構成はどれも同じようなものなのでここで本質的な働きを理解すればどこにでも通用すると思います。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/clock.jpg" alt="" class="wp-image-2159" width="345" height="162" srcset="https://depfields.com/wp-content/uploads/2020/06/clock.jpg 351w, https://depfields.com/wp-content/uploads/2020/06/clock-300x141.jpg 300w" sizes="(max-width: 345px) 100vw, 345px" /><figcaption>クロック</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンではクロック信号を供給するのに水晶振動子やセラミック振動子による<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部の振動子による発振回路</span></strong>の他に、抵抗器RとコンデンサCで構成される<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RC発振回路を内蔵</span></strong>しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>内蔵発振回路を利用すれば外部に振動子を外付けしなくてもよいのでマイコンの周辺回路がシンプルになる利点がある一方、抵抗値やコンデンサ容量により周波数が決まるため製品ごとのばらつきや温度などの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">周辺環境により周波数が変動</span></strong>することも考えられます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>その点、水晶振動子など<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部発振源は周波数が一定で正確</span></strong>です。UART通信など非同期で外部機器と接続する場合にはクロックが不安定であると通信速度が不安定となり通信障害が発生する可能性もあるため、クロックは正確であることが求められます。「<strong><a href="https://depfields.com/extclock/" target="_blank" rel="noreferrer noopener">マイコンの外部クロック</a></strong>」に詳細を記載しています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/quarts.jpg" alt="" class="wp-image-2163" width="181" height="129"/><figcaption>水晶振動子</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>クロック源を内部にするか外部から与えるかはアプリケーション用途にもよりますので最終的には設計者の判断で行います。</p>
</div></div></div>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" width="429" height="191" data-id="2161" src="https://depfields.com/wp-content/uploads/2020/06/clock-supply1.jpg" alt="" class="wp-image-2161" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-supply1.jpg 429w, https://depfields.com/wp-content/uploads/2020/06/clock-supply1-300x134.jpg 300w" sizes="(max-width: 429px) 100vw, 429px" /><figcaption>水晶振動子によるクロック供給1</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="374" height="228" data-id="2162" src="https://depfields.com/wp-content/uploads/2020/06/clock-supply2.jpg" alt="" class="wp-image-2162" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-supply2.jpg 374w, https://depfields.com/wp-content/uploads/2020/06/clock-supply2-300x183.jpg 300w" sizes="(max-width: 374px) 100vw, 374px" /><figcaption>水晶振動子によるロック供給２</figcaption></figure>
</figure>



<h2 class="wp-block-heading">クロック源の種類</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STMマイコンで利用できるクロック源は4種類あります。<br>ここでは外部発振源を使用した<strong>HSEクロック</strong>から<strong>システムクロック</strong>を生成し、<strong>各ペリフェラルに供給するクロックを設定する方法</strong>を解説します。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/clock-source.jpg" alt="" class="wp-image-2186" width="480" height="152"/><figcaption>４種類のクロック源</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンでも他のマイコンでも水晶振動子など外部発振源を使う場合に振動子の発振周波数そのままをシステムクロック（動作周波数）にするのではなく、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">数倍に高速化して使うことが多い</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>高速の動作周波数を実現するのに例えば200MHzのシステムクロックで動作させたいために200MHzの外部発振源を使用すれば簡単のようですが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">周波数が高くなるほど消費電力が増え発熱したり、発振が不安定</span></strong>になったりします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>組み込み機器ではPCとは違って放熱性の悪い環境での使用に耐えなければならない場合も多いので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">発熱は致命的</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで低い周波数で安定した外部発振源を用いてこれを基に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PLL回路（位相同期回路）</span></strong>で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロック周波数を整数倍に大きくしたり（逓倍）</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">整数で割って小さくしたり（分周）</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>マイコンのクロック設定には上述の<strong>PLL回路</strong>が必ず登場しますがマイコンを使う上では原理を理解することはあまり重要ではなく<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">クロック周波数を変更するものの認識だけでいい</span></strong>とおもいます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/pll-circuit.jpg" alt="" class="wp-image-2165" width="524" height="190" srcset="https://depfields.com/wp-content/uploads/2020/06/pll-circuit.jpg 553w, https://depfields.com/wp-content/uploads/2020/06/pll-circuit-300x109.jpg 300w" sizes="(max-width: 524px) 100vw, 524px" /><figcaption>PLL回路によるクロックの逓倍と分周</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/clock-tree.jpg" alt="" class="wp-image-2166" width="609" height="573" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-tree.jpg 735w, https://depfields.com/wp-content/uploads/2020/06/clock-tree-300x282.jpg 300w" sizes="(max-width: 609px) 100vw, 609px" /><figcaption>クロックツリー</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンではクロックは上図のような構成になっていて設定したパラメータで<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">システムクロック</span></strong>や<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ペリフェラルへのクロック</span></strong>が作成されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>クロックの設定は一見複雑なのですが、この中で使用する箇所を限って使うことになるので一度仕組みを理解すると、ここで使用するペリフェラルライブラリ以外での設定や他のマイコンシステムでの設定でも容易に行えるようになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>余談になりますが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">コード自動生成ツール</span></strong>を使用するとツール内ではクロックを作成するのに視覚的にわかりやすいブロック図の中に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">必要なパラメータを入力するだけ</span></strong>で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">自動にシステムクロックやペリフェラル用クロックを作成</span></strong>してくれます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>大変便利なのですが、このようなツールを使う際にも<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ブロック図の機能をまず理解しておくべき</span></strong>です。このクロックの構成はSTM32マイコンに限られたものではなく<strong>どのマイコンでも使われているもの</strong>ですのでここでしっかり理解してしまえばつぶしがききます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/clock-code.jpg" alt="" class="wp-image-2167" width="623" height="178" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-code.jpg 622w, https://depfields.com/wp-content/uploads/2020/06/clock-code-300x86.jpg 300w" sizes="(max-width: 623px) 100vw, 623px" /><figcaption>クロックコード</figcaption></figure>



<h2 class="wp-block-heading">クロックの設定</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>それでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部発振HSE</span></strong>に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">8MHzの水晶振動子</span></strong>を使用した場合の例で解説していきます。システムクロック<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SYSCLK</span></strong>を72MHz,APB1ペリフェラルクロック<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PCLK1</span></strong>を18MHz, APB2ペリフェラルクロック<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PCLK2</span></strong>を72MHzのクロック設定手順は以下の通りです。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="612" height="476" src="https://depfields.com/wp-content/uploads/2020/06/clock-setting-procedure.jpg" alt="" class="wp-image-2237" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-setting-procedure.jpg 612w, https://depfields.com/wp-content/uploads/2020/06/clock-setting-procedure-300x233.jpg 300w" sizes="(max-width: 612px) 100vw, 612px" /><figcaption>クロック設定の手順</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;①　RCCシステムリセット&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>まず<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RCC_DeInit関数</span></strong>を実行してマイコンのクロックシステムをリセットします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>電源投入直後ではクロックシステムは<strong>初期状態（内部HSI:8MHz）</strong>ですので、この関数は実行しなくてもよいのですが、<strong>フェールセーフのため実行</strong>しておきます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;②　外部クロックHSEを有効化&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">外部クロックHSEを有効化</span></strong>します。HSE有効化関数<strong>RCC_HSEConfig</strong>の引数は<strong>RCC_HSE_ON</strong>でHSE有効、<strong>RCC_HSE_OFF</strong>でHSE無効となります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>なお、参考までに<strong>RCC_HSE_Bypass</strong>という引数もありますが、これは水晶振動子やセラミック振動子を使わずにOSC_IN端子に外部クロックソースを入力し、HSEをバイパスするときに使用します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>内部クロックHSI(8MHz)を使用する場合はRCC_HSEConfig()の実行は必要ありません。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;③　HSE準備完了まで待機&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>外部振動子はコンデンサと組み合わせた発振回路ですので起動してからクロックが安定するまでわずかながら時間がかかります。安定するまで待機させるのに<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RCC_WaitForHSEStartUp関数を実行</span></strong>させて戻り値の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">HSEStartUpStatusを取得</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>戻り値の<strong>HSEStartUpStatus </strong>が<strong>SUCCESS(1)</strong>になったら次の過程に進みます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;④　PLL回路によるPLLCLKの設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>PLL回路によるPLLCLKの設定</strong>をします。<br><strong>PLLCLK</strong>は<strong>RCC_PLLConfig関数</strong>を実行させて作成します。</p>
</div></div></div>



<p>設定例：分周比１, 逓倍率９<br>RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);</p>



<p><strong><strong>第1引数には分周比を指定</strong></strong>します。<br>■　RCC_PLLSource_HSI_Div2 : HSIを2分の1に分周し、PLLに供給<br>■　RCC_PLLSource_HSE_Div1 : HSEをそのままPLLに供給<br>■　RCC_PLLSource_HSE_Div2 : HSEを2分の1に分周し、PLLに供給</p>



<p><strong><strong>第２引数には<strong>PLL回路に指定する逓倍を指定</strong>します。</strong></strong><br>■　RCC_PLLMul_x: 2 - 16の整数（<strong>マイコンの上限以下で設定</strong>）</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>上のプログラム例ではHSEクロック8MHzで分周比1、逓倍率9なのでPLLCLKは72MHzとなります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑤　HCLK、PCLK1、PCLK2の分周設定&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次に、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>HCLK、PCLK1、PCLK2</strong>の分周設定</span></strong>をします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>HCLK</strong>は<strong>SYSCLK</strong>を<strong>RCC_HCLKConfig関数</strong>で引数に分周比を指定実行して生成します</p>
</div></div></div>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><strong><strong>引数の分周比：</strong></strong><br>■　RCC_SYSCLK_Div1 : 分周しない<br>■　RCC_SYSCLK_Div2 : 2分の1<br>■　RCC_SYSCLK_Div4 : 4分の1<br>■　RCC_SYSCLK_Div8 : 8分の1<br>■　RCC_SYSCLK_Div16 : 16分の1<br>■　RCC_SYSCLK_Div64 : 64分の1<br>■　RCC_SYSCLK_Div128 : 128分の1<br>■　RCC_SYSCLK_Div256 : 256分の1<br>■　RCC_SYSCLK_Div512 : 512分の1</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PCLK1</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PCLK2</span></strong>はHCLKをそれぞれ<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>RCC_PLCK1Config関数</strong>,<strong>RCC_PLCK2Config関数</strong></span>で引数に分周比を指定実行して生成します。</p>
</div></div></div>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom"><strong><strong>引数の分周比：</strong></strong><br>■　RCC_HCLK_Div1 : 分周しない<br>■　RCC_HCLK_Div2 : 2分の1<br>■　RCC_HCLK_Div4 : 4分の1<br>■　RCC_HCLK_Div8 : 8分の1<br>■　RCC_HCLK_Div16 : 16分の1</p>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑥　PLL回路を有効化する&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PLL_PLLConfig()関数でPLL回路の逓倍率を設定しましたがこのままではまだ、PLL回路は作動していません。PLL回路の作動開始に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RCC_PLLCmd関数</span></strong>を使用します。引数が<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ENABLE</span></strong>でPLL回路を作動させ、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">DISABLE</span></strong>で回路を停止させます。</p>
</div></div></div>



<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">設定例：<br>RCC_PLLCmd(<em>ENABLE</em>);</p>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;⑦　SYSCLKソースを選択&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PLL回路を作動設定しても正常に開始するには多少の時間かかるのでPLL回路の準備が完了したかを確認する<strong>RCC_GetFlagStatus関数</strong>を使用して、この関数の戻り値フラグが<strong>RESET</strong>から<strong>SET</strong>になれば準備完了を意味します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>プログラム内では戻り値フラグが<strong>RESETの間待機</strong>させています。<strong>RCC_GetFlagStatus関数</strong>はPLL回路以外のさまざまな状態の確認に用いることができます。</p>
</div></div></div>



<p>設定例：<br>RCC_GetFlagStatus(RCC_FLAG_PLLRDY);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>引数に指定するRCC_FLAGマクロでクロック設定に関するものを記します。設定例ではPLLの準備完了を確認しています。</p>
</div></div></div>



<p><strong><strong>引数（フラグステータス）：</strong></strong><br>■　RCC_FLAG_HSIRDY: HSI準備完了<br>■　RCC_FLAG_HSERDY: HSE準備完了<br>■　RCC_FLAG_PLLRDY: PLL準備完了<br>■　RCC_FLAG_LSIRDY: LSI準備完了<br>■　RCC_FLAG_LSERDY: LSE準備完了</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>その他、RCC_FLAG_PINRST、RCC_FLAG_PRTRST、RCC_FLAG_SFTRST、RCC_FLAG_IWDGRST、RCC_FLAG_WWDGRST、RCC_FLAG_LPWRSTなどがありますので必要に応じて使用します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>クロック設定の最後に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PLLCLK</span></strong>をシステムクロックの動作周波数<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">SYSCLKに指定</span></strong>します。これは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RCC_SYSCLKConfig関数を実行して設定</span></strong>します。</p>
</div></div></div>



<p>引数：<br>■　RCC_SYSCLKSource_HSI : PLL回路を経由していないHSIを使用<br>■　RCC_SYSCLKSource_HSE : PLL回路を経由していないHSEを使用<br>■　RCC_SYSCLKSource_PLLCLK : PLL回路を使用</p>



<p>設定例：<br>RCC_SYSLKConfig(RCC_SYSCLKSource_PLLCLK);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>最後にSYSCLKにPLLCLKが設定されているかどうかを確認するために<strong>RCC_GetSYSCLKCource関数</strong>の戻り値を確認して設定したとおりものであったら完了としています。このプログラムでは<strong>PLLCLK</strong>を設定したので戻り値が0x08になれば設定完了です。</p>
</div></div></div>



<p>戻り値：<br>■　0x00 : HSIが使用されている<br>■　0x04 : HSEが使用されている<br>■　0x08 : PLLCLKが使用されている</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでプログラムを例に設定を解説してきましたが、実際にはこの設定プログラムをそのまま使用し、パラメータ部分だけを変更すればよいとおもいます。設定の流れを理解してもらえばよいと思います。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/clock-setting-flow.jpg" alt="" class="wp-image-2177" width="702" height="387" srcset="https://depfields.com/wp-content/uploads/2020/06/clock-setting-flow.jpg 708w, https://depfields.com/wp-content/uploads/2020/06/clock-setting-flow-300x165.jpg 300w" sizes="(max-width: 702px) 100vw, 702px" /><figcaption>クロック設定フロー</figcaption></figure>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/sysclk/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/c435f402b7fa51ad0c5e56134605e647ea1bcfe85a23687985ddf45f15480991.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">System Clock[SysClk setting details for STM32] | Most Powerful Bible to Becom...</div></div><div class="lkc-url">https://en.depfields.com/sysclk/</div><div class="lkc-excerpt">The system clock is microcontroller-specific, so once it is set, it is not something that should be changed. However, a thorough understanding of the system clock will enable its application to other microcontrollers.Clock of MCU</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/sysclk/">システムクロック【STM32のSYSCLK設定詳細 】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
