忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

4ヶ月ぶりの記事ですね。
もはや自分用のメモの役割になってる記事です。

¥がこのブログでは半角で出せないので全角で記述しています。コピペする際にはご注意を。
あとtabも詰めちゃうようなので、プログラム部分は変な感じになってます(特に{})がご了承を。恐らくシリーズの最初に断ってると思いますが4ヶ月ぶりの記事になるので再度。

-----------------------
さて、前回は1文字、しかもアスキーコードの文字を送りました。
今回は文字列を送りたいと思います。
(ベースの説明が主なので割り込みはまだ使いません)

文字列を送る手順はざっくり言うと、USART_SendData()関数を使って1文字ずつ送るのを繰り返すだけです。

終端文字である¥0をトリガに脱出するループ文を書きます。

void USART_Send_String(USART_TypeDef* USARTx, volatile char *s){
while(*s){
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, *s);
*s++;
}
}

こういう関数を作っちゃいます。

でもってメイン関数から
USART_Send_String(USART2, "TEST");
と記述すればUSART2からTESTという文字列が飛び出てきます。

TESTという文字列は*sでアドレスで関数に渡されます。
関数側ではそのアドレスの中身をみて「0」になるまで(終端文字)送信を繰り返します。

もしくは

void USART_Send_String2(USART_TypeDef* USARTx, const int8_t String[]){
uint8_t i =0;
while(String[i] != '¥0'){
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, String[i]);
i++;
}
}

やってることは同じです。
終端文字である¥0を見かけたらループから抜け出すといったものです。
終端文字を文字としてみるかどうかの違いでしかありません。
お好きな方をどうぞ

毎度のことですが関数作った際はextern処理しておきましょう。


ついでなのでGetFlagStatusについて解説します。

これはUSARTに関わるいろんなフラグを確認する関数です。stm32l1xx_usart.cの1263行目にあります。
USART_FLAG_TXEとは送信レジスタが空っぽの場合にSETされて、そうでない場合はRESETが返ってきます。
よって、
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
とは、送信レジスタが空っぽでなければwhileの条件式が真となってループで待機状態になります。空っぽであれば偽になるのでループから抜けて送信を行います。要は前がつかえているかを確認しています。
他にも色々有りますがココでは割愛しますが、この後使うので一つだけ。
USART_FLAG_RXNEは受信レジスタがからっぽならRESET。データが来ている場合にはSETとなります。

さぁ、文字列の送信は出来ましたでしょうか。
ハイパーターミナルなどで確認してみてください。
PR
USART通信の3回目です。

1回目ではEWARMのプロジェクト作り
2回目ではLチカをやってみました。

3回めからはUSART通信を進めていきます。

まず、USART通信の基本的な動作をさせましょう。

マイコン起動時に通信テストを兼ねて
マイコンからパソコンに「A」と1文字だけ送ってみましょう。
(複数文字は次回やります)

まずUSARTについてですが
データシートを見ると
PA2 USART2_TX
PA3 USART2_RX
となっています。

とりあえずココを使いましょう。

USARTを使うにしてもまずはRCCとGPIOの設定は必須です。

データシートP.12のブロック図をみると
USART2はAPB1のバスにつながっています。

よってクロックの供給は
stm32L1xx_rcc.cの1145行目の
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
を使います。
実際にはこの前のRCCを設定した関数
void RCC_configuration(void)のなかに
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
という記述を足します。

そして次にGPIOの設定です。

USARTで使う場合には
データシートを見ますと
USART機能は「Alternate Functions」(AF)に分類されます。
また、stm32l1xx_usart.cの冒頭に手順が書いてあります。
簡単に書きますと
1.USART2の場合はRCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE)でクロックを供給しなさい
2.GPIOの設定はRCC_AHBPeriphClockCmd()の関数を使いなさい
3.AFのコンフィグはGPIO_PinAFConfig()の関数を使いなさい。そしてGPIOのモードはAFを選びなさい。OTypeや速度を設定しなさい。初期化はGPIO_Init()関数を使いなさい。
4.ボーレート、ワード長、ストップビット、~各種シリアルの設定をしなさい。
(今回は関係ないので中略)
7.USARTの開始はUSART_Cmd()関数を使いなさい。

ということでコレに従っていきます。

ちなみに・・・(読み飛ばし推奨)
GPIO_PinAFConfig()はほかのSTM32のチップではあまり使っていない関数です。他だとmain_function/Alternate Function/Remapというふうに分けているので、AF機能を選ぶだけで自動的に機能が決まるようになっています。しかし、このSTM32LのチップはRemapがなくて本来であればRemapに配置されるものをAFに入れています。つまり、AFの中に複数の機能が入っています。よって、単にAF機能を選ぶだけでは使いたい機能が選択されません。よってGPIO_PinAFConfig()でAFの中からさらに使いたい機能を選択する必要があります。要はRemapと同じことなんですけどね・・・。コレに気づかずに「AF選んでるのになんで動かネーんだよ!!」と3日位もがきました。ほかのチップを参考にしたのが逆に固定観念作って仇となったカタチですね。低消費電力モードがあるL系列のチップだからだそうです。L系のチップはただでさえ癖のあるARMのなかでもとりわけクセが強いそうです。そんなもの選ぶんじゃなかったと若干後悔中ですよ。テストボード自体はディスプレイもタッチパネルもあって面白いんですけどね・・・。
(ここまで)

なのでまずAFの選択を先にします。


GPIO_PinAFConfig()を見に行くと

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)

というのが出てきます。
GPIO_TypeDef* GPIOx は今回はGPIOAです。
uint16_t GPIO_PinSource はstm32l1xx_gpio.hの195行目あたりに書いてあります。今回はこれの2と3を選びます。
uint8_t GPIO_AF はこの関数のすぐ上(stm32l1xx_gpio.c477行目あたり)に書いてあります。これのUSART2を選びます。
というわけで、
GPIOのconfigの関数の冒頭に

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

という記述を入れます。

このあとにGPIOの設定を前回と同様に入れていきます。(GPIOの設定後にPinAFconfigをやるとノイズが出るので間違えないように)

Txでは、

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);

と記述し、

Rxでは、

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);

と記述します。

実際は共通する場所は繰り返す必要はないので、
前回のLチカの続きに書くならば
 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);

で、設定ができます。

ちなみに、USARTで使うときは設定をこうしなさい(AFのPPや入力のフローティング)というのがリファレンスマニュアルに書いてあるはずなのですが・・・今回のリファレンスでは見つかりませんでした・・・。まぁ一般的なSTM32のチップなら大体決まった設定なのでそれでいきます。

これで、基本の設定が終わりました。
さて!
前回はまず土台を作りました。

今回からシリアル通信を作っていきますが、

とりあえず基本のLEDチカチカをやってみましょうか。

大丈夫。すぐです。

ちなみに本シリーズはすでにpart5まで書き終わってるので、あとはアップを待つばかりです。誰得な記事ですが頑張って行きたいですね。

あ、文字化けあったらすみません。プログラム系は文字化けしやすいのですよね。

discoveryの回路図や取説読みますと
PB7が緑
PB6が青
となっているようです。


と、その前に

stm32f10x.hに飛びたいのですが
とりあえずmain.cの1行目に
#include "stm32l1xx.h"
と書いておきましょう。
いずれ必要になるので。

これで、この文字の上で右クリックすると
"stm32l1xx.h"を開くというメニューが出てきます。
これでEWARM上から簡単に移動ができるようになります。

基本的にはこのstm32l1xx.hがベースになります。
いわゆる用語集でこのルールに基づいて記述しないと動きません。
(直接値放り込めば動きますがまさかそれはしないと思いますので)

ついでに前回やらかしてくれたconf.hも見に行きましょうか。
5099行目にありますね。
同じく右クリックから開くで飛べます。

~conf.hは一括でincludeの管理をしてます。
とりあえず今回は~gpio.h、rcc.h、usart.h、misc.hしか使わないので
これ以外はコメントアウトしちゃいましょう。
軽量化!!


さて、マイコンの初期化をこれからしますが、
必要なことは
必要な機能にクロックの供給をはじめにします。

マイコンの中には様々な機能が盛り込まれていますが、
これを動かすにはなにはともあれクロックを各機能に供給してあげないといけません。
というかこれがARMの特徴でもあります。
機能毎に供給を止めたり与えたりできるので、
不要な機能には供給しないことで省電力化がしやすくなっているチップです。
これを管理しているのがRCCです。

main.cにはつらつらと書いていってもいいのですが
RCC_configuration()という関数を作って区切りをつけたいと思います。

メイン関数の中にこれを記述します。



#include "stm32l1xx.h"
int main(void){
RCC_configuration();
}

void RCC_configuration(void){
//ここにクロック供給を書く
}



こんなかんじですね。
復活!!
誰得カテゴリ!!

あたらに始めようと思いましたが、
4回目までで大したことやってなかったので続きにします(笑)

USARTだけで5記事以上使うと思いますが、
つか絶対FF14のパッチが来て尻すぼみになると思いますが(笑)

今回の目的はこれ!!

『イニシャルから全部やってシリアル通信をしよう!!』

です。

通信の内容はまだ決めてませんが、例えば
「アスキーコードをコールバックする」とかにしてみましょうか。

パソコンから「A」って送ったら、マイコン側で処理して「0x41」って返ってくる感じですね。

いろいろ必要なものもありますが、まずは新規プロジェクトをEWARMで作りましょう。

※本記事は作りながら書いてるのであとから手直し入れる可能性大です

EWARMのバージョンは6.70.2.6310
すごいダラダラとやっている本コンテンツです。
パズドラが捗って手についてないんですが(笑)

とりあえずサンプルプログラムを何も考えずコンパイルして書き込んで動かしてみた。
というのが前回でした。

今回は、本来どういった設定をしなければならないのかを確認します。
新規PJを作った際にはこれらを設定しないとコンパイルとかできないです。

ちなみに今回特にマイコンは動かさないです。

こういう設定の部分がマイコンのハードル上げてるんだよおお。

上部メニューの[プロジェクト]―[オプション]を開きます。

左の[一般オプション]のターゲットの[プロセッサ選択]が[デバイス]側になっていて
[STM32L152xB]となっているのが分かります。

新規PJを作る際はここは何も入ってませんので、
使うデバイスを選択してあげてください。




HOME  → NEXT
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
新生FF14
TERA紋章しみゅ
ROサポートツール
タイムライン
RSSボットが記事更新をつぶやくのがほとんどっス…
ROキャラクター紹介


TERAキャラ紹介

シュクレール(バサ)



syuzo(エレ)



サケマス(アチャ)


その他サブ

ウリエルキゥィス(スレLv54)

Vermillion(サラLv56)

パズドラ

157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
06 2018/07 08
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
ツリーカテゴリ
ブログ内検索
最新コメント
[04/30 のな]
[03/22 NEIN]
[03/22 NEIN]
[10/31 イロイ]
[05/02 NONAME]
Copyright (C) 2018 のーびす監察日記 All Rights Reserved.
Photo by 戦場に猫 Template Design by kaie
忍者ブログ [PR]