新学期伊始,不忘助力国产替代初心,手头没有试验箱,先用“擎天柱”带领大一同学,跟随冲哥视频,学用STC AI8051U芯片讲义(适合有c语言基础的同学)。 单片机(Single-Chip Microcomputer),又称微控制单元(MCU),是一种将中央处理器(CPU)、存储器(包括ROM和RAM)、输入/输出(I/O)接口、定时器/计数器、中断系统等主要计算机组件电路元件集成在一块芯片上,并且可以用代码控制的微型计算机系统。 上节课提到的P2端口就是单片机输入/输出(I/O)接口,代码就是控制单片机的指令。学习单片机需要硬件电路和编程基础,零基础的同学在跟随着学习之外,抽空补习一点相关知识,建议遇到了哪儿就学哪儿,带着问题学,后期我们将实践PCB电路板,另外自行准备相关基础工具,比如电洛铁、万用表等。 第二节,实现不停电下载 1.利用烧录工具AICube助手自动生成代码。打开STC烧录工具,参考下图红框,三个步骤设置: file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps1.jpg 注意文件名最好都用英文,避免出现乱码,点击确定后,工具软件自动生成代码,并自动关联keil启动打开代码,stc工程师真牛! file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps2.jpg 一个是main.c另一个是usb库文件 2. Main.c文件去掉绿色注释后的代码如下: #include "config.h" //默认已包含stdio.h、intrins.h等头文件 void main(void) { SYS_Init(); while (1) { USBLIB_OUT_Done(); //查询方式处理USB接收的数据 } } void SYS_Init(void) { EnableAccessXFR(); //使能访问扩展XFR AccessCodeFastest(); //设置最快速度访问程序代码 AccessIXramFastest(); //设置最快速度访问内部XDATA IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基 P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式 P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式 P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式 P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式 P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式 P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式 P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式 P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式 delay_ms(1); USBLIB_Init(); //USB库初始化 delay_ms(1); EnableGlobalInt(); //使能全局中断 } void delay_us(uint16_t us) { do { NOP(34); //(MAIN_Fosc + 500000) / 1000000 - 6 } while (--us); } void delay_ms(uint16_t ms) { uint16_t i; do { i = MAIN_Fosc / 6000; while (--i); } while (--ms); } void USBLIB_Init(void) { usb_init(); //初始化USB模块 USB_SetIntPriority(0); //设置中断为最低优先级 set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令 } void USBLIB_WaitConfiged(void) { while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置 WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗) } void USBLIB_OUT_Done(void) { if (bUsbOutReady) //查询是否有接收到USB主机发送数据 { USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试 usb_OUT_done(); //当前包的数据处理完成,通知USB主机可以发送下一包数据 } } 3. 添加流水灯代码: 在上方主函数void main(void)里面“USBLIB_OUT_Done();”下一行添加上节课代码: P20 = 0; //擎天柱LED 1点亮 delay_ms(250); P20 = 1; //擎天柱LED 1熄灭 P22 = 0; //擎天柱LED 3点亮 delay_ms(250); P22 = 1; //擎天柱LED 3熄灭 4. 编译好后按照下图设置,还得按上节课方法,同时按下擎天柱p32键(A键)和电源开关(B键)后,先松开电源开关,再松开p32键,烧录程序扫描到USB—Writer后点击“下载/编程”按钮把程序烧录到擎天柱后,LED1和LED3闪烁,实现了可以不断电自动下载。 file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps3.jpg file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps4.png 这种方法方便,将来有利于提高开发效率,值得提倡使用,但不利于初学者学习,可能看了一头雾水。作为初学者建议要学习理解其中原理。STC单片机的不断电自动下载功能是一种基于芯片内部ISP监控区的特殊编程技术,它通过软件复位机制触发单片机从ISP监控区启动,从而实现程序更新的无缝操作。这项技术巧妙地解决了传统下载方式需要频繁断电的痛点,显著提升了开发效率和系统可靠性。 STC单片机采用双启动区设计,包含两个关键程序存储区域:用户程序区和ISP监控区。ISP监控区是STC单片机出厂前已固化好的引导程序,负责接收上位机指令并执行存储器擦写操作。具体可参考学习芯片手册2.36.4章节。 file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps5.jpgfile:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps6.jpg 参考芯片手册351页,USB范例程序,和手册第1005页,细心同学会发现,冲哥视频中代码有自定义三行代码,主要是ubs库版本问题。20250319以后的USB库就不需要自定义三行代码。 file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps7.jpgfile:///C:/Users/Administrator/AppData/Local/Temp/ksohtml6640/wps8.jpg 至于usb库文件有兴趣同学可自行找USB专题章节深入研究学习。
|