メモ書きブログ

日々の覚書

STM32 USB host

Nucleo STM32 F401REでUSB Host作ろうとおもって
CubeIDEを起動して、USB_OTG_FSにActivate_VBUSにチェック付けるだけで完成した。

それでもってデバイス側の時間計測してたら明らかにポーリングが遅いというか
bInterval=0指定しても、効いてない感じ。

USB host libraryのusbh_hide.cの中で、10msで上書きしているコードを発見。 やってくれるね。

  if (HID_Handle->poll  < HID_MIN_POLL)
  {
    HID_Handle->poll = HID_MIN_POLL;
  }

FTDI bitbang on WPF(C#)

FTDIのbitbangを使って、アプリケーションからGPIOを制御する。 公式サイトで.NET用ライブラリであるftd2xx_net.dll を提供しているので、これを使えば簡単に制御できる。

using FTD2XX_NET;

    public partial class MainWindow : Window
    {
        FTDI myFTDI = new FTDI();

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            FTDI_Init();
        }

        private void FTDI_Init()
        {
            if (myFTDI.OpenByIndex(0) != FTDI.FT_STATUS.FT_OK)
                Debug.WriteLine("error");

            if (myFTDI.ResetDevice() != FTDI.FT_STATUS.FT_OK)
                Debug.WriteLine("error");

            if (myFTDI.SetBaudRate(115200) != FTDI.FT_STATUS.FT_OK)
                Debug.WriteLine("error");

            if (myFTDI.SetBitMode(0x0f, FTDI.FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG) != FTDI.FT_STATUS.FT_OK)
                Debug.WriteLine("error");

            Debug.WriteLine("FTDI_Init!");
        }

        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            byte[] databuffer = { 0x01 };
            uint num = 0;
            myFTDI.Write(databuffer, 1, ref num);
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            byte[] databuffer = { 0x00 };
            uint num = 0;
            myFTDI.Write(databuffer, 1, ref num);
        }
    }

東京ゲームショウ2023

TGS初日、朝早くから電車に揺られて幕張メッセまで向かう。

f:id:hirakisp:20230925234539j:image

駅を降りるとビジネスデイにも関わらず朝も早くから大勢の人が賑わっており、歩いて会場に向かうのもなかなかスムーズにはいかなかった。もう少し早く来るか、車で来た方がいいかもしれない。
f:id:hirakisp:20230925234545j:image

 

まだ会場は閑散としており、どのブースも準備中。リハしたり、ミーティングしたり、色々だ。
f:id:hirakisp:20230926201406j:image

サンドランドはガチ

f:id:hirakisp:20230925234809j:image

鉄拳
f:id:hirakisp:20230925234812j:image

 

Steel

f:id:hirakisp:20230926201233j:image

 

Samusung

f:id:hirakisp:20230926201252j:image

 

初日は色々見て回るも時間もなかった。

しかし久々のフル開催ということで例年よりかなり賑わっていたみたいだ。

 

帰りにラーメンを食べて帰った。
f:id:hirakisp:20230925234816j:image

 

 

3日目、ビジネスデイではなくなり閑散としていた道は賑わう。


f:id:hirakisp:20230926202536j:image

f:id:hirakisp:20230926202533j:image

 

中は混雑。


f:id:hirakisp:20230926202648j:image

f:id:hirakisp:20230926202641j:image

f:id:hirakisp:20230926202637j:image

f:id:hirakisp:20230926202644j:image

f:id:hirakisp:20230926202634j:image

 

最終日。朝からバイキングでしっかりと朝食を取る。

f:id:hirakisp:20230926202737j:image

 

幕張の空は綺麗。最終日も終始賑わっていた。

f:id:hirakisp:20230926202835j:image
f:id:hirakisp:20230926202838j:image

 

今年のゲームショウは、冷めやらぬ熱気のままに無事に幕を下ろしたように思う。

 

 

STM32の低電力モード

通常のSleepモード、外部割り込みでWakeup

 HAL_SuspendTick();
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    HAL_ResumeTick();

LowPowerSleepモード、外部割り込みでWakeup

 HAL_SuspendTick();
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    HAL_ResumeTick();

Stopモード、外部割り込みでWakeup StopモードではSYSCLKが停止するため事前にクロックを停止する必要がない。
但し、SYSCLKが初期化されるため、復帰時はMSI最大48MHzまたはHSI16MHzになっているため
IDEで生成されたSytstemClock_Config()をもう一度呼ぶ

 HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
    SystemClock_Config();

STM32で行儀よくFLASH読み書き

STM32でライブラリ使えば簡単に読み書きできる。ST凄い。

uint8_t flash_erase()
{
    uint32_t error_sector;
    FLASH_EraseInitTypeDef EraseInitStruct;
    HAL_StatusTypeDef result;

    HAL_FLASH_Unlock();

    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Banks = FLASH_BANK_1;
    EraseInitStruct.Page = 63;
    EraseInitStruct.NbPages = 1;

    result = HAL_FLASHEx_Erase(&EraseInitStruct, &error_sector);
    HAL_FLASH_Lock();

    return result == HAL_OK && error_sector == 0xFFFFFFFF;
}

uint8_t flash_write()
{
    uint64_t data = 88;
    HAL_StatusTypeDef result;

    flash_erase();
    HAL_FLASH_Unlock();

    uint32_t Address = 0x0801F800;
    result = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, data);

    HAL_FLASH_Lock();
    return result == HAL_OK;
}

uint8_t flash_read()
{
    uint32_t address = 0x0801F800;
    uint8_t *data = (uint8_t *)address;
    return *data;
}

STM32CubeMXのダウンロードエラー

GENRATE CODEしたら、software packages のダウンロードをしろといわれたので、やってみたら

Error downloading the following files: stm32cube_fw_xx_vxxxx.zip (Target directory already exists)

などと言われてしまいました。

C:\Users\<>\STM32Cube\Repository に該当のzipファイルを見つけたので手動で削除して再実行したら治るのかなと思い削除したみたけど変わらず。

結局、ダウンロードのところ、Noを選択したらそのままダウンロードせずにGENERATEできることが分かった。

stable diffusion を ローカルで動かす

まずpythonを入手してパスを通しておきます。
3系でないといけないので、最新版を入手しました。(3.11)
pipもインストールしておく必要があります。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd .\stable-diffusion-webui\ .\webui-user.bat

とします。
ここでwebui-user.batを実行するのですが、 GPUを積んでないので色々とエラーが出ました。

具体的には、

AssertionError: Torch is not able to use GPU;

とか、

RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

です。

対策として、webui-user.batエディタで開くと、set COMMANDLINE_ARGS= という欄があるので、オプションを追記します。

set COMMANDLINE_ARGS=--skip-torch-cuda-test --precision full --no-half

こんな感じでした。

これで起動すると、ローカルホストのURLが表示されるので、アクセスしてみると使えるようになりました。

ところがどっこい、1枚生成するのに5分以上かかるのです。
CPUで処理するのは遅すぎるか・・・とダメもとで、 --use-cpu all のオプションをつけてみましたが無駄でした。

Google Collabで試したらすぐに容量制限にひっかかってしもうた。

ちなみに、 stable-diffusion そのままを落としてきたところ、
txt2img.pyにckptモデルではなくてsafetensorsモデルを食わせる方法が分からず詰んだ

!python scripts/txt2img.py --prompt="Horse" --plms --ckpt /content/drive/MyDrive/Models/MyModel_01.safetensors --skip_grid --n_samples 1

上記の様に、ckptオプションに、safetensorsを指定すると当然のごとくエラーを吐いて終了する。

これが回避する方法が分からなかったので、stable-diffusion-webUIを使うようにした

!python launch.py --share --xformers --enable-insecure-extension-access