学習メモ | LED 照明の原理 | 最小限のプロジェクト実装とバグのトラブルシューティングのアイデアを自動的にダウンロード | USB-HID | USB-CDC 実装 | STC32G マイクロコントローラーのビデオ開発チュートリアル (Brother Chong) | エピソード 4-パート 2: LED の照明

知らせ

新しいプロジェクトを作成するときに選択するデバイス: STC32G12K128 Seis など、最初にドロップダウン メニューで「STC MCU Database」を選択する必要があり、その後 STC32G12K128 Seies を選択できます。
ここに画像の説明を挿入
ここに画像の説明を挿入

4. 電源ダウンロード不要の自動ダウンロードプロジェクトを実現

基本コード

現在の簡略化されたコードは、前のレッスンのコードに基づいています (ヘッダー ファイルはベア ボードに追加されていません)。
開発ボード (Dragon Sword 3.1 バージョン) に手動でダウンロードする必要があります。

sfr P2    = 0xA0;	//P2端口操作完成(屠龙刀三板载led)
sfr P2M1  = 0x95;
sfr P2M0  = 0x96;

sbit P21 = P2^1;    //定义P2.1引脚(LED控制)(屠龙刀三板载led)

void main()
{
	P2M0 = 0x00; //配置P2为准双向口(屠龙刀三板载led)
	P2M1 = 0x00;
//
    while(1) //死循环
    {
		 P21 = 0; //设置低电平	(屠龙刀三板载led)
    }
}

現在実装されている機能: P2^1 ポートのオンボード LED を点灯します。

機能を実現します(最小限のプロジェクトの実現とバグ・トラブルシューティングのアイデアを自動的にダウンロードします)

stc32g ユーザーマニュアルによると(データ更新日:2023/7/31)
ここに画像の説明を挿入
5.14 ユーザプログラムをシステム領域にリセットし、USB モード ISP をダウンロードする方法(停電なし)
プロジェクトが開発段階にある場合、ユーザー コードをターゲット チップに繰り返しダウンロードする必要があります。コード検証を実行し、USB モードを使用して STC マイクロコントローラーの通常の ISP ダウンロードを実行するには、まず P3.2 ポートを GND に短絡してから、再度電源を入れる必要があります。これにより、開発段階でのプロジェクトの書き込み手順がより煩雑になります。このため、STC マイコンでは特殊機能レジスタ IAP_CONTR を追加し、このレジスタに 0x60 を書き込むことでソフトウェアをシステム領域にリセットすることができ、停電することなく ISP ダウンロードを行うことができます。
注: ユーザー プログラムがシステム領域にソフト リセットされるとき、P3.0/D- および P3.1/D+ がコンピュータの USB ポートに接続されている場合、システム コードは自動的に USB ダウンロード モードに入り、ダウンロードが完了するまで待機します。 ISP のダウンロード P3.2 をアースに接続する必要はありません。
2.
STC-ISP ダウンロード ソフトウェアから送信されるユーザー ダウンロード コマンド (USB プロジェクト) を使用します
STC-ISP ソフトウェアの設定については、マニュアルを参照してください:
ここに画像の説明を挿入
必要なライブラリ ファイルとコードマニュアルによれば、次のように追加されました。
ここに画像の説明を挿入

ライブラリファイルを追加: stc_usb_hid_32g.LIB

ここに画像の説明を挿入

コードを追加します:

char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令,添加至main函数前

	usb_init();	//初始化USB代码,添加至while(主循环)之前
	EA = 1;

コンパイル プロンプト エラー:
main.c をコンパイル中…
main.c(14): 警告 C140: 'usb_init' 未定義; 'extern int usb_init()' を想定
main.c(15): エラー C67: 'EA': 未定義の識別子
ターゲットではありません定義
や事前定義が不足しているためと思われます マニュアルによると
詳細なコードについては「STC32G実験」の「76-USB HIDプロトコルによるデータ情報の印刷-デバッグに利用可能」を参照してください「Box デモンストレーション プログラム」パッケージを公式 Web サイトに掲載します。
プロジェクトを開きます:「76-USB HID プロトコル経由でデータ情報を印刷-デバッグに使用できます」を参照してください。
ここに画像の説明を挿入

ヘッダー ファイル参照を追加します。

#include "stc.h"
#include "usb.h"

コンパイルのヒント:

ここに画像の説明を挿入
main.c(1): エラー C318: ファイル 'stc.h' を開けません
main.c(2): エラー C318: ファイル 'usb.h' を開けません
。\76- USB HID プロトコル経由で印刷しますデータ情報 - デバッグに使用できます。 \src フォルダーをコピーしてこのプロジェクトのルート ディレクトリに保存し、参照パスに src を追加します。
ここに画像の説明を挿入

コンパイル後、同様の警告プロンプトが表示される場合は、次のようにします。

ここに画像の説明を挿入

*** WARNING L14: INCOMPATIBLE MEMORY MODEL
    MODULE:  ..\STC32G12K128-LQFP64-DIP64-DEMO-CODE-20230421\COMM\stc_usb_hid_32g.LIB (usb)
    MODEL:   XSMALL
*** WARNING L14: INCOMPATIBLE MEMORY MODEL
    MODULE:  ..\STC32G12K128-LQFP64-DIP64-DEMO-CODE-20230421\COMM\stc_usb_hid_32g.LIB (usb_req_class)
    MODEL:   XSMALL

次に、options-Target: の Memory Model を XSMALL (デフォルトは Tiny) に設定します。
ここに画像の説明を挿入

再コンパイルしてプロンプトを表示します:

*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  USER_DEVICEDESC
    MODULE:  ..\STC32G12K128-LQFP64-DIP64-DEMO-CODE-20230421\COMM\stc_usb_hid_32g.LIB (usb_req_std)
    ADDRESS: FF0941H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  USER_PRODUCTDESC
    MODULE:  ..\STC32G12K128-LQFP64-DIP64-DEMO-CODE-20230421\COMM\stc_usb_hid_32g.LIB (usb_req_std)
    ADDRESS: FF09A3H

プロンプトが存在します: 外部の未解決の参照。「76-USB HID プロトコルを介したデータ情報の印刷-デバッグに使用できる」を確認し、定義コードを追加します。

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;

再度コンパイルすると、警告のみが発生し、エラーは発生しません。

*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    usb_OUT_done/usb
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    USB_SendData/usb
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    LCD12864_DisplayClear/util

ヒント: ブロック警告: 警告 L57: 呼び出されない関数、オーバーレイ プロセスでは無視されます

宣言された関数が参照されていない場合、特に関数を自分で作成した場合に発生するソフトウェア システムの問題を警告します。
解決策:
  ソフトウェア構成ダイアログ ボックスの [L251 その他] 列には、[その他のコントロール] 入力ボックスがあり、参照されていない警告をシールドするために REMOVEUNused と書き込みます。
  ここに画像の説明を挿入

シールド後、警告なしに再度コンパイルします。ここに画像の説明を挿入

ファイルを選択し、ダウンロード/プログラムし、確認します: 各ダウンロードの前にカスタム コマンドを送信し、ターゲット ファイルが変更されると自動的にロードしてダウンロード コマンドを送信します。手動ダウンロードでは、USB が認識できないことを示すプロンプトが表示されます。
ここに画像の説明を挿入
ここに画像の説明を挿入

自動ダウンロード機能もバグが多くて役に立ちません。
もう一度ルーチンを観察すると、 usb_init() の前に sys_init() の関数宣言がある 定義に移動(再コンパイルしてからジャンプ):
ここに画像の説明を挿入
ここに画像の説明を挿入
USB で使用するクロックソースと初期化ポートの設定の定義がある USB 関数があるサンプル プロジェクトでは、再コンパイルし
ここに画像の説明を挿入
て開発ボードに手動でダウンロードすると、ダウンロードは正常に行われ、USB が認識できないというプロンプトは表示されなくなりました。ソース コードはテスト用に変更され、コードは次のようになります
。変更後は自動的にダウンロードされます。
keil でプロジェクトのコードを変更すると、ダウンロードを自動的に実装することもできます。
自動ダウンロード機能を備えた現在のサンプルプロジェクトの Main.c は次のとおりです。

#include "stc.h"
#include "usb.h"

sfr P2    = 0xA0;	//P2端口操作完成(屠龙刀三板载led)
sfr P2M1  = 0x95;
sfr P2M0  = 0x96;

sbit P21 = P2^1;    //定义P2.1引脚(LED控制)(屠龙刀三板载led)

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

void sys_init();    //函数声明,否则需要放在main()函数之前。不声明会提示:Demo.c(74): error C53: redefinition of 'sys_init': different return types

void main()
{
	P2M0 = 0x00; //配置P2为准双向口(屠龙刀三板载led)
	P2M1 = 0x00;

	sys_init();
	usb_init();	//初始化USB代码
	EA = 1;

    while(1) //死循环
    {
		 P22 = 0; //设置低电平	(屠龙刀三板载led)
		 P23 = 0; //设置低电平	(屠龙刀三板载led)
    }
}

void sys_init()
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
            // EAXFR:扩展RAM区特殊功能寄存器(XFR)访问控制寄存器
            // 0:禁止访问XFR
            // 1:使能访问XFR。
            // 当需要访问XFR时,必须先将EAXFR置1,才能对XFR进行正常的读写。建议上电初始化时直接设置为1,后续不要再修改
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定
}

コードの最適化

まず、参照されているヘッダー ファイルを確認します。

呼び出されたヘッダー ファイル stc.h を表示します。

ここに画像の説明を挿入

#ifndef __STC_H__
#define __STC_H__

#include <intrins.h>  //系统头文件
#include <stdio.h>
#include <string.h>

#include "stc32g.h"
#include "config.h"

typedef bit BOOL;   //引用名称定义
typedef unsigned char BYTE;

#endif

「stc32g.h」に注目します。

ここに画像の説明を挿入
共通ポートはsfrとして定義されているため、手動のsfrや不要な定義はコメントアウトすることができます。

現在の手順は次のとおりです。

#include "stc.h"  //调用头文件
#include "usb.h"

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

void sys_init();    //函数声明,否则需要放在main()函数之前。不声明会提示:Demo.c(74): error C53: redefinition of 'sys_init': different return types

void main()
{
	P2M0 = 0x00; //配置P2为准双向口(屠龙刀三板载led)
	P2M1 = 0x00;

	sys_init();
	usb_init();	//初始化USB代码
	EA = 1;

    while(1) //死循环
    {
		 P22 = 0; //设置低电平	(屠龙刀三板载led)
		 P23 = 0; //设置低电平	(屠龙刀三板载led)
    }
}

void sys_init()   //函数定义
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定
}

コンパイル後、ダウンロードして自動的に実行できます (3 つの LED が点灯します)。

CDC.lib を使用して自動ダウンロードを実装する

USB-CDC/シリアル ポート モードと USB(HD) モードは並列されており、同じ機能を実現できるはずです。

ルーチン内の COMM をこのプロジェクトの src フォルダーにコピーし、「stc_usb_hid_32g.LIB」を削除し、「stc_usb_cdc_32g.LIB」を参照します。
ここに画像の説明を挿入
ここに画像の説明を挿入

コンパイルとダウンロードが完了すると、次のメッセージが表示されます:
デバイスを開けませんでした!
デバイスがコンピュータに正しく接続されているかどうかを確認してください。

ルーチンを表示します (70-CDC (Communication Device Class) プロトコルの例)。

ここに画像の説明を挿入

コードを追加します:

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;

P3M0 &= ~0x03;
   P3M1 |= 0x03;

   //设置USB使用的时钟源
   IRC48MCR = 0x80;    //使能内部48M高速IRC
   while (!(IRC48MCR & 0x01));  //等待时钟稳定

USBCLK = 0x00;  //CDC增加,HID需禁用
   USBCON = 0x90;  //CDC增加,HID需禁用

開発ボードを手動でダウンロードします。
自動無停電電源ダウンロード (CDC プロトコル) を実現するためのスキャニング シリアル ポート STC-USB Cnc (coM14) があります。
ここに画像の説明を挿入

完全なコード:

#include "stc.h"  //调用头文件
#include "usb.h"

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

void sys_init();    //函数声明,否则需要放在main()函数之前。不声明会提示:Demo.c(74): error C53: redefinition of 'sys_init': different return types

void main()   //程序开始运行
{
	P2M0 = 0x00; //配置P2为准双向口(屠龙刀三板载led)
	P2M1 = 0x00;

	sys_init();
	usb_init();	//初始化USB代码
	EA = 1;

    while(1) //死循环
    {
		 P22 = 0; //设置低电平	(屠龙刀三板载led)
		 //P23 = 0; //设置低电平	(屠龙刀三板载led)
		 //P24 = 0; //设置低电平	(屠龙刀三板载led)
    }
}

void sys_init()   //函数定义
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

	P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

	USBCLK = 0x00;  //CDC增加,HID需禁用
    USBCON = 0x90;  //CDC增加,HID需禁用
}

おすすめ

転載: blog.csdn.net/Medlar_CN/article/details/132191950