表題の通りなんですが、サンプルがないかと調べたところ意外と他には見つからなかったのですが、簡易的にですが動作するところまで来たので、忘備録として挙げてみることにしました。
プログラム環境はCubeIDE、デバッガはSTLINK V3 MINIEを使いました。
まずプロジェクトを新規作成します。File -> New で STM32 Projectをクリックします。次に使用するMCUを選びます。今回はSeries STM32F1を選択してから、f103c8t6をさらに選択して"Next"をクリックします。今度はProject Nameを聞いてくるので、今回はBluePill_stm32f103c8t6_serial_clock01としました。プロジェクト名を入力したら、"Finish"をクリックします。これで新規プロジェクトは作成されたので、続いてCubeMXをつかってコンフィグを行います。
まず、"Pinout & Configuration"で、System Core -> RCCを選択し以下のようHSEとLSEを設定します。 続いて"Pinout & Configuration"で、System Core -> SYSを選択し以下のようにSWDデバッグピンを有効にしておきます。 続いて"Pinout & Configuration"で、Timers -> RTCを選択し以下のようにクロックソースとカレンダーをアクティベイトさせておきます。 続いて"Pinout & Configuration"で、Connectivity -> USART1を選択し以下のようにしておきます。 続いて、RTC global interrupt(割り込み)を有効にするため、"Pinout & Configuration"で、System Core -> NVICを選択し以下のようにRTC global interruptをEnable/Preemption Priority 4にしておきます。 最後はClock Configurationを選択し以下のようにします。 画像では見にくいのですが、RTC Clock MuxをLSEにし、PLL Source MuxをHSEにして、PLLMulを x8 に設定します。続いてSystem Clock MuxをPLLCLKにし、最後にAPB1 Prescalerを /2にします。
ここまでくるとCubeMXの設定はできたので、CTRL+Sで保存します。するとコードを生成するかきいてくる(Do you want generate Code?)のでYesをクリックし、コードを生成させます。
つぎにコーディングを行います。今回は出力にprintf, 時刻合わせにscanfをつかいます。また、stm32f103c8t6の場合、クロックデータはbcd(binary coded decimal)なのでdec2bcdなる関数を作成しました。
以下main.cの変更箇所のみですが以下のようにします。
つづいてstlinkv3minieとターゲットのBluePillを接続させます。v3minieの場合、3.3vからは電源供給されないので、BluePillをUSBに接続するなどして電源を確保しておいてください。次に、stlinkv3minieとBluePillを接続します。接続自体には特に難しいところはないのですが、1.27mmピッチを2.54mmピッチに変換するアダプターが必要です。今回はこちらのアダプタを使いましたが、TXとRXが逆に表記されているようなので、注意してください。
最後にデバッグボタンをクリックします。初回のみ新規でConfigが作成されますので、今回はそのままOKをクリックします。コーディング、接続がただしければ例えばTeratermでは以下のようになります。
今回は以上です。それでは。
プログラム環境はCubeIDE、デバッガはSTLINK V3 MINIEを使いました。
まずプロジェクトを新規作成します。File -> New で STM32 Projectをクリックします。次に使用するMCUを選びます。今回はSeries STM32F1を選択してから、f103c8t6をさらに選択して"Next"をクリックします。今度はProject Nameを聞いてくるので、今回はBluePill_stm32f103c8t6_serial_clock01としました。プロジェクト名を入力したら、"Finish"をクリックします。これで新規プロジェクトは作成されたので、続いてCubeMXをつかってコンフィグを行います。
まず、"Pinout & Configuration"で、System Core -> RCCを選択し以下のようHSEとLSEを設定します。 続いて"Pinout & Configuration"で、System Core -> SYSを選択し以下のようにSWDデバッグピンを有効にしておきます。 続いて"Pinout & Configuration"で、Timers -> RTCを選択し以下のようにクロックソースとカレンダーをアクティベイトさせておきます。 続いて"Pinout & Configuration"で、Connectivity -> USART1を選択し以下のようにしておきます。 続いて、RTC global interrupt(割り込み)を有効にするため、"Pinout & Configuration"で、System Core -> NVICを選択し以下のようにRTC global interruptをEnable/Preemption Priority 4にしておきます。 最後はClock Configurationを選択し以下のようにします。 画像では見にくいのですが、RTC Clock MuxをLSEにし、PLL Source MuxをHSEにして、PLLMulを x8 に設定します。続いてSystem Clock MuxをPLLCLKにし、最後にAPB1 Prescalerを /2にします。
ここまでくるとCubeMXの設定はできたので、CTRL+Sで保存します。するとコードを生成するかきいてくる(Do you want generate Code?)のでYesをクリックし、コードを生成させます。
つぎにコーディングを行います。今回は出力にprintf, 時刻合わせにscanfをつかいます。また、stm32f103c8t6の場合、クロックデータはbcd(binary coded decimal)なのでdec2bcdなる関数を作成しました。
以下main.cの変更箇所のみですが以下のようにします。
(前略) /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <stdint.h> /* USER CODE END Includes */ (中略) /* USER CODE BEGIN PV */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /* USER CODE END PV */ (中略) /* USER CODE BEGIN PFP */ int dec2bcd(int dec); #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #define GETCHAR_PROTOTYPE int __io_getchar(void) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #define GETCHAR_PROTOTYPE int fgetc(FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } GETCHAR_PROTOTYPE { uint8_t ch = 0; // Clear the Overrun flag just before receiving the first character __HAL_UART_CLEAR_OREFLAG(&huart1); HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } /* USER CODE END PFP */ (中略) int main(void) { /* USER CODE BEGIN 1 */ int year, month, date, hours, minutes; /* USER CODE END 1 */ (中略) /* USER CODE BEGIN 2 */ setvbuf(stdin, NULL, _IONBF, 0); printf("Enter Year: "); scanf("%d", &year); printf("\n\rEnter Month: "); scanf("%d", &month); printf("\n\rEnter Date: "); scanf("%d", &date); printf("\n\rEnter Hours: "); scanf("%d", &hours); printf("\n\rEnter Minutes: "); scanf("%d", &minutes); printf("\n\r"); sTime.Hours = dec2bcd(hours); sTime.Minutes = dec2bcd(minutes); sDate.Month = dec2bcd(month); sDate.Year = dec2bcd(year); sDate.Date = dec2bcd(date); HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD); HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD); HAL_RTCEx_SetSecond_IT( &hrtc ); /* USER CODE END 2 */ (中略) /* USER CODE BEGIN 4 */ /*************************************************************************/ /* RTC interrupt call back function. */ /*************************************************************************/ void HAL_RTCEx_RTCEventCallback( RTC_HandleTypeDef *hrtc ) { HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN); printf("20%02d.%02d.%02d %02d:%02d:%02d\r\n", sDate.Year, sDate.Month, sDate.Date, sTime.Hours, sTime.Minutes, sTime.Seconds); } int dec2bcd(int dec) { uint8_t a, b, c, d; int bcd; a = dec/1000; b = (dec%1000)/100; c = (dec%100)/10; d = (dec%10); bcd = a << 12 | b << 8 | c << 4 | d; return bcd; } /* USER CODE END 4 */コーディングは以上ですが、RTCでの秒割込は、HAL_RTCEx_SetSecond_IT( &hrtc ) で登録し、HAL_RTCEx_RTCEventCallbackで当該割込処理を行っています。
つづいてstlinkv3minieとターゲットのBluePillを接続させます。v3minieの場合、3.3vからは電源供給されないので、BluePillをUSBに接続するなどして電源を確保しておいてください。次に、stlinkv3minieとBluePillを接続します。接続自体には特に難しいところはないのですが、1.27mmピッチを2.54mmピッチに変換するアダプターが必要です。今回はこちらのアダプタを使いましたが、TXとRXが逆に表記されているようなので、注意してください。
V3MINIアダプタ BluePill ======================== GND <-> GND TX <-> PA9(TX) RX <-> PA10(RX) 1 <-> 3.3v 7 <-> SWDIO 9 <-> SWDCLKコーディングと接続ができたらSTLINKをPCに接続します。次にシリアル入出力を行うため、たとえばWindowsではTeraTermなどを起動させ前述のように115200/8/none/1でシリアルを設定しておきます。
最後にデバッグボタンをクリックします。初回のみ新規でConfigが作成されますので、今回はそのままOKをクリックします。コーディング、接続がただしければ例えばTeratermでは以下のようになります。
今回は以上です。それでは。
コメント
コメントを投稿