おせわになります、Sです。
flash_page_erase_write_wordをやってみましたがうまくいきません。
まず、Sample-Projectから持ってきたままだと、USB_LP_CAN1_RX0_IRQHandlerが2重定義で怒られるので、stm32f10x_it.cの中のUSB_LP_CAN1_RX0_IRQHandlerをコメント化しました。
すると、flashまでできるようになるのですが、Erasing Flash Pages.をハイパーターミナルに表示して、FLASH_ErasePageで戻ってきません。cprintfでFLASHStatusを見ようにもFLASH_ErasePageから戻ってこないので、わかりません。
FLASH_ErasePageの寸前にcprintfを置いてみると、そこまでは実行されています。
もちろん、#define FlashBaseAddr ((uint32_t)0x08003000)にしてあります。
よろしかったら、教えてください。

Sさん、こんにちは。 プログラムにバグがありました。修正し
Sさん、こんにちは。
プログラムにバグがありました。修正したものをトップページの新着情報のところにアップしています。
バグの原因ですが、VCPを有効にした際のプログラムサイズを考慮していなかったことにあります。
VCPを有効にすると、私の環境では、ROMに書き込むプログラムの最終番地が0x0800a158まで来ていました。このあたりはbinフォルダにあるmain.mapで確認できます。
0x0800a158となると、スタート番地が0x08003000なので、プログラムサイズは0x7158、だいたい29Kバイトぐらいです。
もとのソースコードでは、フラッシュで書き込む最初のページの番号を10にしていました。1ページの大きさが2Kバイトなので、書き込む場所はスタート番地から20Kバイトずれたところになります。20Kバイトは16進数でいうと、0x5000ですね。スタート番地が0x08003000だと、書き込み位置は0x08008000からになります。
ここでわかると思いますが、0x08008000番地は、このプログラムのコード自体が存在している場所なので、ここを消してしまうと、プログラムが消滅します。今回の場合はmapファイルを見るとUSBファームウェアが書いてあったようです。
そこでスタートページを後ろにずらし、22ページ目にしました。44Kバイトなので0x0800b000からです。ぎりぎりなのできわどいかもしれませんが、これでプログラムを消してしまうようなことは無くなります。ここの部分の修正だけで動きましたので、これが原因だったということで間違いないと思います。
動きました。flash_page_erase_write_
動きました。flash_page_erase_write_word。
しかも、詳細な解説でとてもわかりやすかったです。
ありがとうございます。
S