men007 发表于 2024-12-29 07:05:45

学习了。day day up

272761180 发表于 2025-1-7 20:14:22

<p><strong>【第四课USB不停电下载补课】</strong></p>
<h3>一、USB库文件下载</h3>
<p>在官网下载USB库文件。库文件包含CDC和HID两种下载模式。</p>
<h4>1.1 CDC模式和HID模式</h4>
<p><strong>1. CDC模式:</strong><br />
是一种 USB 设备类规范,主要用于设备与主机之间的通信,实现数据的传输,其功能类似于传统的<strong>串口通信</strong>。其数据传输量相对灵活,可以进行大数据量的传输。<br />
<strong>2. HID模式:</strong><br />
是一种用于人机交互设备的 USB 设备类规范,专注于人机交互,是为了方便用户操作主机设备或者接收主机反馈而设计的。它主要用于连接输入设备(如鼠标、键盘)和输出设备(如简单的状态指示灯设备)。其数据传输量通常较小。因为它主要传输的是用户操作信息(如鼠标移动的坐标变化、按键的按下和松开状态)或者简单的设备状态反馈信息,这些数据相对简洁。</p>
<p><img src="data/attachment/forum/202501/07/191331yp18etgc2cdo3414.png" alt="image.png" title="image.png" /></p>
<h4>1.2 查询模式和中断模式</h4>
<p>USB库还包含两种模式,一个是查询模式,一个是中断模式。</p>
<p><strong>1. 查询模式:</strong> 将USB库的传输相关代码写在<code>while</code>循环中。MCU会按顺序执行,每次循环到传输语句时执行传输命令。这种方法的好处是不会影响系统其他代码段的运行,仅在执行到代码传输语句时才会传输,其他时刻不会传输。</p>
<p><strong>2. 中断模式:</strong> 类似一种外部中断方式。初始化USB语句后,注册一个名为<code>usb_OUT_callback()</code>的回调函数。回调函数由USB中断在接收到串口数据时自动调用。这种中断触发方式可能会影响到系统的执行。</p>
<p>STC工具箱使用CDC下载模式比较好用(老师说的)。另外,选择查询模式的32位文件。文件名为<code>stc32g_cdc_query_demo</code>。</p>
<h3>二、USB库文件移植</h3>
<h4>2.1 添加头文件</h4>
<p>将点灯文件另存为,并以此为基础进行usb库文件移植。</p>
<p>前面提到,选择32位模式、查询模式下的CDC传输方式。该库文件名为<code>stc_usb_cdc_32.LIB</code>,将这个文件连同<code>stc32_stc8_usb.h</code>文件复制到工程文件<code>main.c</code>相同目录下。在工程目录中添加LIB文件之后,在<code>main.c</code>文件中添加下方头文件并编译无报错即可。</p>
<pre><code>#include &quot;stc32_stc8_usb.h&quot;
</code></pre>
<p>使用.LIB文件的好处是看不到USB库的源代码,这样就防止误改代码导致的功能错误。</p>
<h4>2.2 USB初始化函数</h4>
<p>按照示例代码中的内容,添加初始化函数,定义有关变量。</p>
<pre><code>#include &quot;AI8051U.h&quot;
#include &quot;stc32_stc8_usb.h&quot;

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;

void main(void)
{
        //配置所有IO为准双向口
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

        usb_init();                //USB-CDC 接口初始化

        //这里需要继续配置命令参数

        while(1)
        {
                //这里需要继续配置命令参数
        }
}
</code></pre>
<p>其中 <strong>内部自定义命令</strong> <code>char *USER_STCISPCMD = &quot;@STCISP#&quot;;</code>要和ISP软件的自定义命令内容相一致。</p>
<p><img src="data/attachment/forum/202501/07/193954gp5pj5y27bse2e7f.png" alt="image.png" title="image.png" /></p>
<h4>2.3 配置命令参数</h4>
<p>对比示例代码同时需要添加以下几方面代码:</p>
<pre><code>P_SW2 = 0x80;        //使能访问XFR,没有冲突不用关闭
</code></pre>
<p>或者是<code>EAXFR=1;</code>因为USB属于特殊功能寄存器,其存储在XFR列表当中。</p>
<p><img src="data/attachment/forum/202501/07/194410bf7ejkt7snf67asy.png" alt="image.png" title="image.png" /></p>
<pre><code>EA = 1;
</code></pre>
<p><img src="data/attachment/forum/202501/07/195013u94m4w3qc3z9vsmw.png" alt="image.png" title="image.png" /></p>
<p>中断使能在后面的计时器、外部等中断功能需求时需要配置该选项。<strong>(但是这里视频写了<code>IE2 |= 0x80;</code>但是示例代码中没有。)</strong></p>
<pre><code>while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
</code></pre>
<p>另外,在<code>while</code>循环中添加USB数据传输相关语句:</p>
<pre><code>if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
         
            usb_OUT_done();
      }
</code></pre>
<p>编译后会报<code>*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS</code>,意思是<code>.h</code>库函数内有很多未调用的函数。可以在Options中关闭。</p>
<p><img src="data/attachment/forum/202501/07/200232h6xahew8wdzchx82.png" alt="image.png" title="image.png" /></p>
<h4>2.3 烧录程序</h4>
<p>这里进行最后一次手动烧录。保持P32按下状态后点按Power按键然后松开,系统进入下载模式。</p>
<p><img src="data/attachment/forum/202501/07/200628vca28p1332lqdcfy.png" alt="image.png" title="image.png" /></p>
<p>烧录完成后在ISP将如下设置勾选后就可以了。打开自动下载按钮,编译完成会自动下载。<br />
<img src="data/attachment/forum/202501/07/201048rkh4kp3h4vvhk9sh.png" alt="image.png" title="image.png" /></p>
<p><strong>(但是这里为什么是“下次使用HID接口进行ISP下载”????)</strong></p>

272761180 发表于 2025-1-7 20:18:05

USB库文件(20250107)



课堂作业


272761180 发表于 2025-1-7 20:20:42

272761180 发表于 2025-1-7 20:18
USB库文件(20250107)




库文件(20250107版本)
课堂代码

272761180 发表于 2025-1-7 20:42:41

272761180 发表于 2024-11-27 22:38
【第五课】《C语言基础》




<h2>【第五课 C语言基础补课】</h2>
<hr />
<h3>一、实现USB-CDC串口的Printf函数</h3>
<p>在<code>stc32_stc8_usb.h</code>文件中取消注释下面语句</p>
<pre><code>#define PRINTF_USB            //printf输出直接重定向到USB口
</code></pre>
<p>重定向原理就是进行了宏定义</p>
<pre><code>#defineprintfprintf_hid
int printf_hid(const char *fmt,...);
</code></pre>
<p><img src="data/attachment/forum/202501/07/202547j6hm6m84k64mckp6.png" alt="image.png" title="image.png" /></p>
<h4>【USB-CDC串口通讯实验】</h4>
<p>实现当串口接收到数据时自动发送<code>STC YYDS</code>语句。</p>
<p><strong>实验现象:</strong></p>
<p><img src="data/attachment/forum/202501/07/202834m1hhcfj5tbf5qrrd.png" alt="image.png" title="image.png" /></p>
<p>这里补充一点,由于USB-CDC使用的是虚拟串口,因此波特率使用任何一个均可进行通讯。</p>

272761180 发表于 2025-1-7 20:43:27

272761180 发表于 2025-1-7 20:42
【第五课 C语言基础补课】

一、实现USB-CDC串口的Printf函数


课堂代码:

夏永华 发表于 2025-3-22 12:27:43

刚学习何老师的几集在B站

夏永华 发表于 2025-3-22 12:46:05

272761180 发表于 2024-11-25 10:51
【第一课】《序言》

AI8051U强在哪里?


增加了数据线,快了

夏永华 发表于 2025-3-22 12:54:22

VCC 发表于 2024-11-27 03:40
虽然你很有想法,但我还是要泼一盆冷水




简单明了
页: 1 2 3 4 [5]
查看完整版本: 示例贴:日日自新学习AI8051U