浅針 V2.0

1.シリアルポート印刷

新しいボードのシリアル ポートは UART3 であり、デフォルト設定は UART1 です.UART3 のシリアル ポート印刷を完了するには、次の 2 つの部分を変更する必要があります。

#ifdef DEBUG
    GPIOA_SetBits(bTXD3);
    GPIOA_ModeCfg(bTXD3, GPIO_ModeOut_PP_5mA);
    UART3_DefInit();

これは、シリアル ポートの印刷を選択するために使用されるマクロ定義です。DEBUG=x の x を変更するだけで済みます。

printf はこの構成をチェックできるため、改行を追加する必要はありません。

シリアル ポート構成関連記事:

MounRiver の印刷問題 (改行と浮動小数点数) について - Risc5_BLE - 博客园

MounRiver 変更印刷シリアルポートについて - Risc5_BLE - 博客园

2.SDカード

2.1:SDカード容量の読み方

        SD カードは Zetta (Lanzhi)_SD NAND ZDSD01GLGEAG 1Gbit (128MByte) です。デバッグ中に SD カードの初期化に失敗しました。オシロスコープは波形入力で CS\CK\MOSI を読み取ります。MISO に波形出力がなくなった後、除外されます。 SD カードの溶接の問題。

        FATFS ファイル システムを使用して読み取ります。テスト コードは次のとおりです。

if(events & FS_SPI_INI_EVT)
        {
            if(fnSdInit())
            {
                PRINT("SD Card Error!\n");
            }
            else
            {
                uint32 uSize;
                PRINT("SD Card Ok!\n");
                uSize = fnSdGetSectorCount();
                PRINT("SectorCounts=%d\n",uSize);
                PRINT("容量=%dM\n",uSize>>11);

//                tmos_set_event(fs_test_TaskID,FS_TEST_EVT);
            }
            tmos_start_task(fs_test_TaskID,FS_SPI_INI_EVT,1000);
            return (events ^ FS_SPI_INI_EVT);
        }

        FATFS は一度に 1 ブロックのデータを読み書きします。1 ブロック 512B、247808 ブロック/2/1024 = 121M、

        U ディスクを MSC でシミュレートした後に得られたメモリ サイズは、上記の計算と一致しています。

 

2.2: アナログ SPI 読み書きからハードウェア SPI への変更

2.2.1 アナログ SPI

        CH582 には、ハードウェア SPI が 1 つと SPI0 が 1 つしかありません.V1.0 開発ボード バージョンは、SD カード スロットが SPI1 ポートに接続されていることに気付きませんでした。

        V1.0 開発ボードは、SPI レートが遅い IO シミュレーションを使用するため、SD カードの初期化時に SPI レートを下げ、初期化が完了した後に SPI レートを上げる必要はありません (SD カードの初期化速度は400KHzを超えてはならず、最大速度は15MHZを超えてはならない?? ?? まだ確認されていません);

        スピード読み書きテスト機能

if(FR_OK == fr)
    {
        fr = f_open(file, "0:2B.WAV", FA_READ);
        uOrgTick = TMOS_GetSystemClock();
        do{
            if(FR_OK != f_read(file, pFatBuf, 512, &br))
            {
                PRINT("fr ng!\n");
                break;
            }
            uLens += br;
        }
        while(uLens < 1024*1024*4);
        f_close(file);
        uNewTick = TMOS_GetSystemClock();
        PRINT("tick=%d,len=%d\n",uNewTick - uOrgTick, uLens);
        PRINT("speed=%d B/S\n",uLens*100/((uNewTick - uOrgTick)/16));
    }

        シミュレートされた SPI 読み取りファイル速度は次のとおりです。 

        SPI 書き込み速度をシミュレートする

ファイルの読み書きは、主に SPI を使用して SD カードにコマンドを送信します. 主な機能は、SD カード送信コマンド関数 fnSdSendCmd(uint8 ucCmd, uint32 uArg, uint8 ucCrc7) です。送信コマンド関数は、主にモード SPI によって送信され、バイト関数 fnRwSpiSdByte(uint8 ucTxData) を読み書きします (SPI マスターがデータ スレーブを送信し、データを返します)。

inline static void fnSetSck(void)
{
    GPIOA_SetBits(GPIO_Pin_13);
}
inline static void fnClrSck(void)
{
    GPIOA_ResetBits(GPIO_Pin_13);
}
inline static void fnSetMosi(void)
{
    GPIOA_SetBits(GPIO_Pin_14);
}
inline static void fnClrMosi(void)
{
    GPIOA_ResetBits(GPIO_Pin_14);
}
inline static uint32_t fnRdMiso(void)
{
    return GPIOA_ReadPortPin(GPIO_Pin_15);
}


uint8 fnRwSpiSdByte(uint8 ucTxData)
{
   uint8 ucVal = 0;
   for(int8_t i = 7; i >= 0 ; i--)
   {
       fnClrSck();     //CLK低
       if(ucTxData& (1<<i))
       {
           fnSetMosi(); //发1
       }
       else
       {
           fnClrMosi();//发0
       }
       fnSetSck();    //CLK高
       if(fnRdMiso())   //读一个bit
       {
           ucVal |= 1<<i;
       }
   }
   return ucVal;       //读回的数据
}

2.2.2 アナログ SPI        

        ハードウェア SPI は SCK をシミュレートする必要はなく、ハードウェアが直接生成し、データを読み書きします. 元の SPI0 ライブラリ関数には、ワードの読み書き用のライブラリ関数しかないため、読み書き用の関数を追加する必要があります。単語。

__HIGH_CODE
uint8 fnRwSpiSdByte(uint8 ucTxData)
{
    R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
    R8_SPI0_BUFFER = ucTxData; //发送的date
    while( !(R8_SPI0_INT_FLAG & RB_SPI_FREE) );
    return ( R8_SPI0_BUFFER ); //返回的data
}

        ハードウェア SPI のファイル読み取り速度は次のとおりで、アナログ SPI 速度の 2 倍です。

2.2.3 SPI レートの問題

        SD カードを初期化するときは、SPI レートを下げ、初期化が完了したら SPI レートを上げます。

        SPI0_CLKCfg(4); = 60/4 = 15MHz、分周率が4未満の場合、SDカードの読み込みに失敗しますが、具体的な理由は? ?

関連参考記事:

MSP430 SDカードのSPI読み書き操作(2) - SDカードのSPI操作手順_Zn's blog - CSDN blog

FATfs ソース コードの分析_天使ブラシ ブログ - CSDN ブログ_fatfs ソース コード

3. タッチ

タッチ タッチ: 公式ルーチン ライブラリを参照

参考記事:静電容量式タッチボタン

4、TMRタイマー(22.11.1)

2 つのタイマーを使用して 8 ビット PWM を生成し、16 ビット PWM を形成する前のスキームは、TMR と 2 つの PWM です。

既存の問題:

1: TMR タイマーの構成はまだ明確ではありません。PWM 周波数が高いほど良い理由と、入力データのデューティ サイクルのデータ処理が重要です。

2:問題に遭遇したファイル名で WAV を再生しているときに、再生タスクにメッセージを送信するときにメッセージ イベント ビットをクリアするのを忘れていたため、データ フローが中断されました.この問題を数日間検索しましたが、まだ不足しています問題をすばやく見つける能力。そして、次のステップに進み、次のステップを検証する前に、どのステップを最初に行うべきかを知ること。

 

 3: コードは堅牢である必要があり、自分で作成したメッセージ構造は適切ではありません。

関連記事:【電子回路編】 (1) PWMをDACに変換するには?

4: 今日、私は以前のソリューション、つまり、1 つのタイマーと、タイマーによって生成された 2 つの PWM 波で WAV を再生することに切り替えました.PWM 周波数は 60M/256=234Khz に調整できますが、234Khz のノイズ フロアがまだあります。音楽を再生するとき。調査の結果、再生された音楽は、USBポートからの電源供給とバッテリー電源のボトムノイズなしで正常であることがわかりました。問題は電源と充電にあることがわかりました (具体的な理由は....) 元の 2 つの TMR によって生成される 32Khz PWM は、バッテリー駆動の再生では正常であり、PWM 波形も滑らかです。 USB 給電の PWM 波形に問題があります。問題の場所を見つけます。(22.11.2)

5:USB電源で発生するバックグラウンドノイズの原因を分析(ご自身で分析)すると、ノイズカップリング(チップからチップへの干渉)が原因かもしれません.1つは入力PWM波236K、もう1つはカップリングです.オペアンプの出力で 240K のノイズ 問題を解決する 解決策: オペアンプ ピンにバイパス コンデンサを追加し、電源ラインにデカップリング コンデンサを追加します。(22.11.3)。

6. USB電源によるバックグラウンドノイズの原因の分析 Zeng氏の説明: 電源はUSBによって供給され、充電チップの電源は原因ではありません。上記の問題はバックグラウンドノイズによるものではなく、USB電源、バッテリー電源入力PWMのいずれであっても、パワーアンプの出力端子は上記の波形出力となります。これは、充電モジュールへの電力供給に USB が使用されているためです. 充電モジュールの出力はボードによって給電されています. 充電モジュールの出力電流は、パワーアンプモジュールの電流出力を駆動するのに十分ではありません. PWM 高レベルのジッター、およびボードの電源が突然オフになり、再生中に再起動する 電流が十分でないため、デバッグ時にバッテリーを接続する必要があります。. (22.11.4)

参考記事:

チップの隣にコンデンサを追加するだけでは十分ではありません。簡単な実験で、「デカップリング コンデンサ」と「バイパス コンデンサ」の動作原理をすぐに理解できます_哔哩哔哩_bilibili

 5. BLE (22.11.2)

BLE1Sのブロードキャスト間隔とTouchのみの待機時消費電力をテスト(22.11.3)

ブロードキャスト間隔を 1 秒に変更します

// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)
#define DEFAULT_ADVERTISING_INTERVAL         1600
//4、设置广告间隔 (units if 0.625us)
    {
        uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;
        // Set advertising interval
        GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);
        GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);

    }

テストデータから、値はまだ大きすぎ、問題は一時的に不明です

関連参考記事:

Bluetooth Low Energy BLE のブロードキャスト間隔およびその他のパラメーターを変更する - プログラマー募集

[BLE] CC2541 バッテリー電源サービス  

Bluetooth 4.0 BLE ペリフェラル ブロードキャスト設定_si_zhou_qun_84342712 のブログ - CSDN ブログ

ついにダウン!! ! Bluetooth低消費電力チップCH579超低消費電力0.2uA!! ! - - 21ic 電子技術開発フォーラム

隠しキーボードのブロードキャスト間隔を増やしたのに、消費電力が変わらない理由を教えてください。- Qinheng マイクロエレクトロニクス コミュニティ

BLEブロードキャスト間隔と接続間隔 (CH582) - SweetTea_lllpc - 博客园

六、ADCサンプリング

6.1

挿入を検出してタスクを開始するには、GPIO 割り込みの方法が考えられます。(タスクループによって一時的にトリガーされます)

問題が発生しました: 配列要素の計算の問題、

この問題の原因は、prinf 関数を使用して関数の戻り値を直接出力し、関数の戻り値を使用して計算することです。

C言語:

印刷結果は Sunday Sunday で、
printf パラメーターのスタック順序は右から左です。つまり、2 つの関数呼び出しが最初に右側で実行され、次に左側で実行され、次に printf がコンテンツを印刷します。
その場合、get_day() 関数は再入不可の関数であり、関数の戻り値は buf の静的配列の最初のアドレスです。静的変数がどこで宣言されても、その空間はグローバル静的領域に割り当てられます。つまり、get_day() によって返されるアドレスは、プログラム宣言サイクル全体で常に buf の最初のアドレスです (変更されません)。
したがって、この printf を呼び出した後、実際には buf 配列に最後の実行結果が格納されます。get_day(0) ですので、結果は 2 日曜日です。 

printf_mal327 のブログの小さな例 - CSDN ブログ
   (22.11.4)

参考記事:

短押しと長押しの2つのアクションをMCUが判断する必要がある場合が多い - 電子ペーパー

GPIOの深い理解(プルアップ入力、プルダウン入力、アナログ入力、フローティング入力、オープンドレイン出力、プッシュプル出力の違い、STM32を例にとる)

[BLE 5.3 ワイヤレス MCU CH582] 8. ADC サンプリング (内部バット、内部温度、外部入力) - 国内のチップ交換 - 電子工学の世界 - フォーラム

6.2 ADC による電圧値のサンプリングを完了します。

問題があります。計算するときは、データ ビットの計算順序に注意してください。

ADCVal は最初に ÷2048、次に ×1000 となり、データ オーバーフローの結果にエラーが発生し、実際の値と一致しなくなります。データ エラーを避けるために、最初に *1000 を指定する必要があります (22.11.6)

充電チップ関連情報:

Siyuante ME4074 は、単セル リチウム イオン バッテリー用の完全な定電流/定電圧リニア充電チップです_output_function_mode

7. 低消費電力

7.1 問題が発生しました: ペリフェラル ルーチンを使用して低消費電力をデバッグする場合、DEBUG マクロがオフになり、DEBUG マクロ定義が無効になり、プログラムが正常に実行できなくなります。

理由: DEBUG マクロ定義。その値は、printf 関数によって呼び出される putchar で出力用に選択された物理シリアル ポートを表します。putchar には実際のシリアル ポートが選択されていないため、printf 関数が返されない場合があります。Peripheral_Init(); に印刷情報があり、DEBUG がオフになっていると、printf 関数が返せません。内部に印刷された情報をコメントアウトするだけです。(22.11.14)

Peripheral_Init () 1.15mA で 10 秒のブロードキャスト間隔

7.2 以前は電力制御管理はありませんでした. プログラムで開かれた HAL_SLEEP マクロ定義は、システムをスリープ モードに設定するためのものであり、そのウェイクアップは TMOS によって自動的に管理されます。電源管理の設定は、すべてのポートを入力プルダウン モードとして設定するだけではありません (アイドリング MCU がまだ実行されているため)。現在、最小のシステム ボード 571 がテストに使用され、チップが取り外されているため、冗長化されています. 周辺モジュールには、3.3V の周辺電源から直接給電される 1117 降圧チップが含まれています. さまざまな電力オーバーヘッドを確認します。

 

 以下は、ペリフェラルを点滅させるためのさまざまなブロードキャスト間隔の電力消費です。

50ms放送間隔放送モード

接続後
0.56mA

0.17mA

1秒放送間隔放送モード

接続後
2.5uA(テスト後5uA)

  120uA

 

 

 以上で、582Mのフルバージョンの消費電力が以前は1.2mAだったのはソフトウェアの問題であるということを事前に除外しました.次のステップは、582Mボードの問題点を確認することです(22.11.15)。

7.3 より前では、582M のフル バージョンの消費電力は常に 1.2mA であり、これはソフトウェア構成の問題です.すべての IO ポートは入力プルアップ モードで構成されているため、リーク電流が発生します.

IO を入力プルダウンに変更し、いくつかの必要な入力プルアップを変更すると、マシン全体のスタンバイ電力消費が減少します。

ブロードキャスト時のスタンバイ電流は 5 ~ 6uA です。

放送時の消費電力の目安は、放送間隔1Sで30uA(4.2v/680Ω/100/2)です。 

うわー、それはソフトウェア構成の問題です、さあ!(22.11.17)

4: 温度検出

CH573F が LSI を使用している場合、外部水晶発振器をオフにする方法 - Qinheng Microelectronics Community (wch.cn)

CH579 CH573 CH582 チップ使用知識共有カタログ - debugdabiaoge - ブログ パーク (cnblogs.com)

おすすめ

転載: blog.csdn.net/qq_45803449/article/details/127492763