AI8051U-8Bit 最新 不停电下载 注意事项
首先感谢官方送的实验箱和开发板。AI8051U可以配置成 不掉电下载 在编写完程序后,
无需反复按按键进行冷启动然后下载,可直接烧录程序。
这减少了设备的停机时间,提高了开发效率和设备的可维护性,
为开发者提供了便利,尤其适用于需要频繁更新程序的场景。
最近我用最新的USB库文件时,刚开始总是移植不成功。
即便我把所有的文件及代码用复制过去,也是失败的。
经过我折腾一天终于总结出了。一次成功的方法。
1,下载最新的USB库,这个库是20250319更新的。
2,这个是能不能成功能关键,选择对应型号的MCU后,
一定要勾先LX51 OF BL51 否则会编译失败。
3,最新的库不需要用户程序中不需要再对
USER_DEVICEDESC,
USER_PRODUCTDESC,
USER_STCISPCMD
进行定义如已定义,请删除。
4,增加 REMOVEUNUSED 命令,
这个不增加不影响使用,但是会弹出警告。
注意以上几点,基本上能成功移植USB不掉电下载程序,
解放你的双手。
新USB库函数使用说明:
1、使用此压缩包中的新USB库函数,用户程序中不需要再对
USER_DEVICEDESC,USER_PRODUCTDESC,USER_STCISPCMD 进行定义
如已定义,请删除。
2、USB库默认的不停电下载命令为“@STCISP#”
3、新USB库函数不再区分查询库和中断库,已统一为同一个库
使用set_usb_OUT_callback函数设置回调函数时可实现中断模数
若不设置回调函数则为查询模数(详情请参考范例程序)
深圳国芯人工智能有限公司-库函数
ai_usb.h 头文件内容如下
#ifndef __AI_USB_H__
#define __AI_USB_H__
//使用串口“printf”打印信息需屏蔽以下两个定义
//#define PRINTF_SEGLED //printf输出重定向到ISP下载软件中的7段数码管
//#define PRINTF_HID //printf输出直接重定向到USB口
//#define PRINTF_USB //printf输出直接重定向到USB口
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned int ushort;
typedef unsigned long ulong;
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define DEVSTATE_ATTACHED 0
#define DEVSTATE_POWERED 1
#define DEVSTATE_DEFAULT 2
#define DEVSTATE_ADDRESS 3
#define DEVSTATE_CONFIGURED 4
#define DEVSTATE_SUSPENDED 5
void usb_init();
void usb_OUT_done();
void USB_SendData(BYTE *dat, int size);
void set_usb_OUT_callback(void (*pfn)(void)); //如果需要实现中断,需要调用此函数来设置回调函数
void set_usb_ispcmd(char *cmd); //设置不停电下载的用户自定义命令,不设置时默认下载命令为“@STCISP#”
int SEG7_ShowString(const char *fmt, ...);
void SEG7_ShowLong(long n, char radix);
void SEG7_ShowFloat(float f);
void SEG7_ShowCode(BYTE *cod);
void LED40_SendData(BYTE *dat, BYTE size);
void LED40_SetPort(BYTE port, BYTE dat);
void LED40_SetBit(BYTE port, BYTE bt);
void LED40_ClrBit(BYTE port, BYTE bt);
void LED64_SendData(BYTE *dat, BYTE size);
void LED64_SetPort(BYTE port, BYTE dat);
void LED64_SetBit(BYTE port, BYTE bt);
void LED64_ClrBit(BYTE port, BYTE bt);
void LCD12864_DisplayOff();
void LCD12864_DisplayOn();
void LCD12864_CursorOff();
void LCD12864_CursorOn();
void LCD12864_CursorMoveLeft();
void LCD12864_CursorMoveRight();
void LCD12864_CursorReturnHome();
void LCD12864_ScrollLeft();
void LCD12864_ScrollRight();
void LCD12864_ScrollUp(BYTE line);
void LCD12864_AutoWrapOff();
void LCD12864_AutoWrapOn();
void LCD12864_ReverseLine(BYTE line);
void LCD12864_DisplayClear();
void LCD12864_ShowString(BYTE x, BYTE y, char *str);
void LCD12864_ShowPicture(BYTE x, BYTE y, BYTE cx, BYTE cy, BYTE *dat);
void OLED12864_DisplayOff();
void OLED12864_DisplayOn();
void OLED12864_DisplayContent();
void OLED12864_DisplayEntire();
void OLED12864_HorizontalMirror();
void OLED12864_VerticalMirror();
void OLED12864_DisplayReverse();
void OLED12864_SetContrast(BYTE bContrast);
void OLED12864_SetAddressMode(BYTE bMode);
void OLED12864_ScrollLeft(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollRight(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollUp(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollStart();
void OLED12864_ScrollStop();
void OLED12864_ShowPicture(BYTE x, BYTE y, BYTE cx, BYTE cy, BYTE *dat);
int printf_hid (const char *fmt, ...);
#if defined PRINTF_SEGLED
#define printfSEG7_ShowString
#elif defined PRINTF_USB
#define printfprintf_usb
#elif definedPRINTF_HID
#define printfprintf_usb
#endif
extern BYTE xdata UsbFeatureBuffer;
extern BYTE xdata UsbInBuffer;
extern BYTE xdata UsbOutBuffer;
extern BOOL bUsbFeatureReady;
extern BOOL bUsbInBusy;
extern BOOL bUsbOutReady;
extern BYTE DeviceState;
extern BYTE OutNumber;
#endif
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf
用了一个晚上才总结出来的,官方加精{:touxiao:} 这加精有点儿难把{:xiaoku:}
感觉至少得说出来为什么 用冲哥教程中的头文件和库文件0错误0警告,换成最新版库和头文件之后有两个警告:
compiling main.c...
main.c(40): warning C140: 'printf_usb' undefined; assuming 'extern int printf_usb()'
main.c(40): warning C95: 'printf_usb': too many actual parameters
main.c - 0 Error(s), 2 Warning(s).
编译信息如下:
Build target 'Target 1'
linking...
*** WARNING L25: DATA TYPES DIFFERENT
SYMBOL:printf_usb
MODULE:.\Objects\main.obj (main)
DEFINED:.\stc_usb_cdc_32g.LIB (util)
Program Size: data=8.3 edata+hdata=341 xdata=192 const=55 code=5062
creating hex file from ".\Objects\demo"...
".\Objects\demo" - 0 Error(s), 1 Warning(s).
Build Time Elapsed:00:00:06 小涵子爸爸 发表于 2025-3-21 13:07
用冲哥教程中的头文件和库文件0错误0警告,换成最新版库和头文件之后有两个警告:
compiling main.c...
mai ...
将第三个取消注释可以解决报错的问题
不过这个应该是库本身的小问题,我再去反馈修复一下
小涵子爸爸 发表于 2025-3-21 13:07
用冲哥教程中的头文件和库文件0错误0警告,换成最新版库和头文件之后有两个警告:
compiling main.c...
mai ...
是库文件包中的头文件没有更新导致的
正确定义如下:
早期的库只有printf_hid
后期有将HID和CDC统一为printf_usb
王昱顺 发表于 2025-3-21 14:17
将第三个取消注释可以解决报错的问题
不过这个应该是库本身的小问题,我再去反馈修复一下
...
问题已解决,感谢支持{:woshou:} zhp 发表于 2025-3-21 15:16
是库文件包中的头文件没有更新导致的
正确定义如下:
原来如此,问题已解决,感谢支持{:baoquan:}
页:
[1]
2