40b UARTでPCと通信 (USART3 remap) (NVIC,TIM3,GPIO,LEDチカチカ)
STM32-DISCOVERYにUARTをとりつけてPCと通信してみます.
STM32F100RB にはUSART1,USART2,USART3が載っています.ブロック図はこちらです.
以下ではUSARTではなくUARTと呼称しますが、どっちも似たようなもんです.
ここでは、UART3のremap機能を利用して、portを変更してUART3を動かします.
詳しい説明は、40a UARTでPCと通信 (USART3 default) (NVIC,TIM3,GPIO,LEDチカチカ) を参照してください.
UARTのpinはどこ?
こちらの表にピンアサインが書かれています. LQFP64の列に着目します.
UART_TX と UART_RX のところを抜き出したのが下表です.
UART3のremapのピンはどこかというと、PC10(TX)とPC11(RX)だとわかります.
しかし、ちょっとややこしい事情があります.
STM32のデータシートによると、このような表があって、UART3のremapには partial remap と full remap の2種類あると書かれています.
そして、full remapでアサインされるPD8,PD9は、STM32-DISCOVERYに載った64pinのCPUには存在しません.
したがって、いまここで選択するべきなのは、UART3のpartial remap じゃなくちゃいけないということです.
そして、UART3のpartial remapにおいては、PC10(TX),PC11(RX) にportがアサインされます.
UARTをUSBにつなぐ回路は?
UARTをUSBに変換する回路を使ってUSB経由でPCに接続します.
つかうのは秋月電子で売られているこの回路です. http://akizukidenshi.com/catalog/g/gK-01977/
STM32-DISCOVERYとの実体配線図はこのようになります.
ここではUSART3 remapを使うので、 PC10(TX),PC11(RX) から配線を取り出します.
他のUSARTを使いたい場合は下図の各所から配線を取り出します.
terminal softは別途用意してPCにインストールしてください.
XPとかの古いwindowsではhyper-terminalというのが最初からインストールされていましたが、vista以降は無くなってしまったと思います.
サンプルプログラムでやること
PC上のterminal softを起動し、115200bps+parityなし+8bit+stop1bit+フロー制御なし で接続します.
●STM32-DISCOVERYを起動すると、下記のように1秒毎にTIM3 interrupted Xと表示されます.
行末の数字は表示毎にインクリメントされる数値.
starting UART test program
TIM3 interrupted 2
TIM3 interrupted 3
TIM3 interrupted 4
TIM3 interrupted 5
TIM3 interrupted 6
●STM32-DISCOVERY上のLEDは、青は1秒毎に点滅します.緑はUARTへ送信する度に光ります.
●terminal softでenter keyを入力すると、次のmenu表示がでます.
int 10は、LEDの点滅周期を10Hzにします.
offは、LEDをオフします.
onは、LEDの点滅を開始します.
command:
command error
-----UART TEST MENU-----
int 10 : LED flash 10 Hz
off : LED off
on : LED off
サンプルプログラム解説
UART3 partial remapの設定の所だけを抜粋します.
詳しい説明は、40a UARTでPCと通信 (USART3 default) (NVIC,TIM3,GPIO,LEDチカチカ) を参照してください.
サンプルプログラムはこのページの末尾からDLできます.projectの組み込み方法はこちらを参照してください.
重要な注意: 当初compile errorが出ました.エラー回避のために、syscalls.cというファイルを追加してあります.これはyagartからDLしたファイルですが、これがないとcompileできません.トラブルシュートの詳細はこちらのページを参照してください.
main.c
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "stm32f10x.h"
#include "usrlib-uart3r.h" ←UARTを使うための自作ライブラリです.UART3 partial remap用.
int main(void)
{
↓各peripheralのclockをオンしています.
GPIOBはUSART3 remapの結果使わなくなったのでコメントアウトしておきます.
GPIOCはUSART3 partial remapのIOがあるところです.
GPIOCはLEDのIOがあるところです.
AFIOというのは、USART3のIOとして利用することをalternate functionと呼びます.altanateとは代替という意味です.GPIOとして利用するのが本来の利用法であるのに対置してUSARTのIOとしての利用を代替と呼称しています.
// clock initialization
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // UART TX/RX (default)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // LED, UART TX/RX (remap)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
usrlib-uart3r.c
UARTを制御するルーチンをひとまとめにしています.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h"
#include "usrlib-uart3r.h" ←UARTを使うための自作ライブラリです.UART3 partial remap用.
void UART_Init(void) USART3初期化ルーチン
{
↓TX portを設定
// Configure USART Tx as alternate function push-pull
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); ←PC10に変更
↓RX portを設定
// Configure USART Rx as input floating
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure); ←PC11に変更
↓partial remapを設定
// remap UART3 PC10 PC11
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);