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種類あると書かれています.

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00246267.pdf

そして、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);