找回密码
 立即注册
楼主: 大亮

《STC教学研讨会STC8H/STC32G》--学习记录/学习心得--打卡帖 | 建议送

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-5 15:21:00 | 显示全部楼层
《梁工 STC32G12K128 - STC8H8K64U 实验箱 开源示波器实战路线》2023/9/8



电路讲解: ±5V电源产生电路(负电压芯片),    产生正弦波电路(P2.3 PWM输出后调制,滤掉非方波成分.   5洁低通滤波),   示波器(输入电路: BNC接头 拨动开关(AC DC) 交直流转换  电容补偿RC电路对正弦波影响,匹配、可调, 欠补偿、过补偿,   第一级运放、(两个二极管用来钳位,运放的要求-高阻、带宽增益要大、 电流皮安级), 电压提升实现偏置(0点), 二级运运放 保障0~2.5V输入, 二极管钳位负电压、电容滤波),8档数控增益放大器设计:选择不同的增益、不同的放大倍数,得到不同的信号观察。

截图202310051459357014.jpg    截图202310051501508648.jpg

搞模拟电路需要实际经验积累

ADC按键设计,一端接地、不同的触点开关串联不同的电阻实现检测。防止漏电,IO口用完设高阻模式。

硬件设置项,重新打开,重新load。硬件仿真,要实际连接MCU。

仿真讲解,寄存器、内存、IO、串口等参数观察内容和变化,debug。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-6 08:34:16 | 显示全部楼层
《STC MCU USB研讨会 - USB大型实战研讨会,冲哥重披战袍》 -- 2023/8/18 Fri


1、虚拟串口的应用
方案一USB转TTL,外接typeC电脑串口通信
方案二:PCB板上SD卡槽
三: 外置USB转串口线升级程序(定制线)
四:使用USB功能,USB线联电脑,通过CDC进行数据交互  基于USB功能开发,通信块、稳定、校验可靠(车机)

USB-CDC功能
1、UCap 2、  P3.0 P3.1 usb 的 D- D+  3、P3.2 HID下载,接上,外接上拉电阻,防止持续进入下载模式,不跑用户程序
1、USB库文件下载和工程搭建
      1、库文件下载
      2、库文件关联进Keil
      3、Keil工程头文件
      4、main.c文件,增加USB初始化代码
      5、添加文件到工程
      6、设置工程选项()target、output、L251 MISC
      7、下载进MCU STC_ISP
      8\CDC 串口出现
      9、链接串口实现USB串口数据发接
      10、CDC串口不停电下载!
截图202310051640247415.jpg 没有使用的函数不编译 Warning消除 不占用程序内存
下载,主频24Mhz
代码分析:

#include "stc32g.h" 调用头文件
#include "stc32_stc8_usb.h"
#define FOSC 24000000UL     24MHz主频定义
char *USER_DEVICEDESC  = NULL;                CDC串口必用       
char *USER_PRODUCTDESC = NULL;                CDC串口必用       
char *USER_STCISPCMD   = "@STCISP#";    不停电下载
void main()
{
    WTST=0;
    CKCON=0;
    EAXFR=1;   STC MCU速度更快的几行代码
    P0M1=0x00;  P0M0=0x00;
    P1M1=0x00;  P1M0=0x00;
    P2M1=0x00;  P2M0=0x00;
    P3M1=0x00;  P3M0=0x00;
    P4M1=0x00;  P4M0=0x00;
    P5M1=0x00;  P5M0=0x00;
    P6M1=0x00;  P6M0=0x00;
    P7M1=0x00;  P7M0=0x00;   引脚都初始化为准双向
    P3M0 &=~0x03;                                                   // P3.0,P3.1 USB  D-D+
    P3M1 =  0x03;                                                   //P3.1
    IRC48MCR=0x80;                                                                        //使能内部USB专用时钟                                                                                                  
    while (!(IRC48MCR & 0x01));                                           等它稳定了切换过去
    USBCLK = 0x00;                                                                       
    USBCON = 0x90;                                                        使能USB功能                                                                                                                  
    usb_init();                                                                                调用Lib初始化男塾
    EUSB=1;                                                                                 使能USB                                                                                                  
    EA=1;                                                       打开总中断
    while (DeviceState != DEVSTATE_CONFIGURED);         等USB配置完成
    while (1)执行51函数
        {
                if (bUsbOutReady) 硬件接收完串口数据后,自动将bUsbOutReady位置1

                {

                        USB_SendData(UsbOutBuffer,OutNumber);        接收字节数OutNumber 数据保存在UsbOutBuffer数组
                                                                                                        USB_SendData 上位机发的发回来
                        usb_OUT_done();                             

                                                                                                        关闭
                }                       
        }
}

串口助手调试
使用默认的内部自定义命令“@STCISP”
不停电下载, 程序自动跳转到烧录区域   IAP

基于Lib库的USB_CDC串口中断通信:
      1、 删除原有的查询Lib库
      2、粘贴带有interrupt的lib库
      3、打开工程许纳泽新的lib库
      4、删除原有的查询代码
      5、增加USB中断代码,再中断里添加用户代码即可

void Delay3000ms()                //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 17999998UL;
        while (i) i--;
}


while (1)
        {
                P20 = !P20;
                Delay3000ms();               

}

/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
                  回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
                  返回0:USB会暂停接收串口数据,直到用户自行调用
                                 usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
                  只有返回0时才需要调用usb_OUT_done()进行手动收尾
                  强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()
{
        P21 = !P21;
        USB_SendData(UsbOutBuffer,OutNumber);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
       
        return 1;
}

及时响应,立即中断
基于CDC串口的printf函数,printf的使用
#define PRINTF_HID            

printf("HELLO STC\r\n");
Delay1000ms;

基于CDC串口发送特定指令获取参数
1、创建命令行
2、字符串比较函数
3、增加接收数据和零零行的比较,一样就执行
4、触发软件复位,从ISP开始执行

int strcmp(char *p1,char *p2)
{
        int num=0;
        for(;*p1!='\0'||*p2!='\0';p1++,p2++)
         if(*p1!=*p2)
         {
                num=*p1-*p2;
                break;
        }
        return num;
}

char i=0;


for( i=0;i<64;i++ )
                UsbOutBuffer=0;

if (bUsbOutReady)                                                        //如果USB接收到数据
                {
                        UsbOutBuffer[OutNumber] = '\0';
                        if( strcmp(UsbOutBuffer,CMD_ReadParm) == 0 )
                        {
//                                printf("需要获取的系统内部的关键信息!\r\n");
                                USBCON = 0x00;      //清除USB设置
                                USBCLK = 0x00;
                                IRC48MCR = 0x00;
                               
                                Delay1000ms();
                                IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行
                               
                        }
                        for( i=0;i<64;i++ )
                                UsbOutBuffer=0;                       
//                        USB_SendData(UsbOutBuffer,OutNumber);        // 使用USB_SendData可向上位机发送数据
                                                                                                        // 这里的代码为将接收到的数据原样返回
                        usb_OUT_done();



基于LIB库的USB-CDC转串口
1、移植串口的驱动,选择合适的主频,初始化串口
2、USB收到的数据通过串口发送出去
3、串口接收到的数据通过USB-CDC发出去


精确的主频选择,决定误差
波特率设置、串口初始化、串口中断

USBCDC转双串口 一箭双雕 烧录器功能 10MBPS  (转双路CAN)
CDC  COMMUNICATION DEVICE CLASS

1、USB硬件初始计划
2、编写读取函数和写入函数
3、配置USB中断
4、配置设备的设备描述符、标识符等等(自动执行识别和信息)
5、配置端点输入
6、配置端点输出

收藏:USB中文网 在线Unicode转换工具

代码讲解:首先主函数 第一步系统初始化 --提高访问速度、端口设置、P30P31高阻、 USB时钟, 第二部串口初始化函数、实现串口数据,选择引脚UART ,串口初始化寄存器配置, 为了方便USB读取数据(USB请求该数据发送上位机端)
第三步USB初始化函数, 串口结构体定义

void usb_init()
{
    usb_write_reg(FADDR, 0x00);                                        //¸üÐÂUSBµØÖ·ºÍ±£´æ¹¦ÄܵØÖ·
    usb_write_reg(POWER, 0x08);                                        //Ç¿ÖÆUSB¸´Î»Ò»Ï                                       
    usb_write_reg(INTRIN1E, 0x3f);                                //¿ªÆôÎå¸öUSB¶ËµãµÄ·¢ËÍÖжÏ
    usb_write_reg(INTROUT1E, 0x3f);                                //¿ªÆôÎå¸öUSB¶ËµãµÄ½ÓÊÜÖжÏ
    usb_write_reg(INTRUSBE, 0x07);                                //¿ªÆôUSB¸´Î»£¬»Ø¸´£¬¹ÒÆðÐźÅÖжÏ
    usb_write_reg(POWER, 0x00);                                        //¹Ø±Õ¸´Î»

    DeviceState = DEVSTATE_DEFAULT;                                //µ±Ç°É豸״̬ΪĬÈÏ       
    Ep0State.bState = EPSTATE_IDLE;                                //¶Ëµã0µÄ״̬Ϊ¿ÕÏÐ
    InEpState = 0x00;                                                        //ËùÓж˵ãµÄ·¢ËÍλÇå0
    OutEpState = 0x00;                                                        //ËùÓж˵ãµÄ½ÓÊÕλÇå0

    UsbInBusy = 0;                                                                //ËùÓж˵ãµÄ·¢ËÍæµλÇå0
    UsbOutBusy = 0;                                                                //ËùÓж˵ãµÄ½ÓÊÕæµλÇå0
       
    RxRptr = 0;                                                                        //´®¿ÚºÍUSBת·¢µÄÏà¹Ø´æ´¢±äÁ¿
    RxWptr = 0;
    TxRptr = 0;
    TxWptr = 0;

    EUSB = 1;                                                                        //ÔÊÐíUSBÖжÏ
}

读取函数写入函数usb从指定寄存器读,往指定寄存器写
USB中断函数
发送和接收函数的处理
USB相关主机设置!USB协议实现!框架、模板基本不变

USB-HID通信

1、修改设备符等信息,新增HID信息表是
2、替换HID的class类
3、std请求 增加HID标识符信息
4、删除串口相关函数
5、usb端点1改为输出
6、增加读取和输出函数
截图202310060802233714.jpg

UsbTreeView


基于HID协议的简易键盘
WINUSB通信 速度快 即插即用 基于VID PID的通讯手段



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-6 16:08:20 | 显示全部楼层
《陈教授 --STC最新8051单片机原理及应用 --STC8H8K64U》--9月25日 --DMA模块应用


x86 arm芯片 DMA功能 先进技术 设置及应用 直接存储器存取 外设和存储器/存储器和存储器高速数据传输 无需CPU干预 现代计算机的重要特色
CPU只需向DMA控制器下达指令,剩下的数据传输过程DMA专门负责。 应用于批量交换数据。进一步减少快熟设备输入输出操作过程中对CPU的中断。
DMA操作XRAM不占用CPU控制总线。
STC8H8K64U 的 DMA控制器用来管理来自一个或多个外设对存储器访问的请求:M2M_DMA  ADCV SPI_DMA UR1T_DMA UR1R_DMA UR2T_DMA UR2R_DMA UR3T_DMA UR3R_DMA UR4T_DMA UR4R_DMA LCM_DMA
功能结构图:DMA控制单元  8位数据总线  16位地址总线
截图202310061349318905.jpg 4个串行口等,共享数据总线,同时访问,仲裁 , Intel将 DMA的缓冲器放在了XDATA里!DMA数据传输的最大量256字节 (128 int)。
DMA对XRAM的读写操作设置为4级访问优先级,硬件自动访问仲裁

怎么去用,相关寄存器多, 例XRAM《==》DMA《==》串口2
UR2T_DMA_CFG:中断使能控制位、中断优先级控制位、总线访问优先级控制位
UR2T_DMA_CR:控制寄存器 使能、触发
状态寄存器UR2T_STA: 中断请求标志位 数据覆盖标志位
传输总字节寄存器UR2T_AMT:  +1
传输完成字节寄存器
发送地址寄存器 16位的内存地址,两个字节 ADDR【15:8】ADDR【7:0】
UR2R 对称

配置过程:
1、选择串口2的引脚
2、串口2的工作模式和波特率
3、进行DMA配置
4、开放CPU中断
5、在中断服务程序中,对相应的标志位进行处理

小实例 在XRAM中开辟256字节发送缓冲区,利用DMA控制器实现将发动缓冲区的内容通过串口2自动发送缓冲区的数据
代码讲解:

小实例 利用DMA控制器实现ADC数据自动存储到XRAM中
ADC_DMA配置寄存器
控制寄存器
状态寄存器
接收地址存储器
配置寄存器2
通道使能寄存器,  对应通道置1
截图202310061550417655.jpg

设置过程
1、ADC通道使用引脚 高阻模式
2、ADC模块初始化, 数据格式、时间设置、速度设置,上电
3、DMA设置,中断语序、ADC数据存储地址、每个ADC转换次数、ADC通道使能、使能DMA 、启动DMA
4、开放CPU
5、在中断服务程序中,对相应的标志位进行处理
代码讲解:

感谢陈老师!

###############一箭双雕CDC1仿真、CDC2通信(一边。。。一边。。。)######################

###############DMA双缓冲区数据交替传输######################

截图202310061601185446.jpg 截图202310061604271366.jpg 图片BIN文件到Flash,DMA送 LCM

比较器、EEPROM、RTC待复习

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-7 15:22:16 | 显示全部楼层
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/9/19 (下)



STC32G 内置5个24位定时器/计数器(8位预分频器+16位计数器)
T0 ~T4 可设置为计数 或 定时模式  : 如果计数脉冲来自系统时钟,为定时方式。如果计数脉冲来自外部引脚,为计数模式
T0和T1  通过寄存器TMOD内C/T位设置方式
T2 AUXR
T3 T4 T4T3M
定时器/计数器核心单元一个加法计数器,该计数器在内部/外部脉冲的驱动下执行递增操作
通过相应寄存器设置计数脉冲频率是选择系统时钟频率/12 还是系统时钟频率/1(不分频)
“编程序更喜欢底层寄存器的描述操作,关注原理和应用,不喜欢图形化的工具、要查询API函数手册”
T0 4种工作模式 T2 串口比特率发生器
T0 模式0 :
硬件实现,硬件描述语言 HDL,数字电路和数字逻辑,外面端口:地址、数据、控制总线, 寄存器行为, 电路实现功能
设计电路:系统灵活性和实用性、软件控制部分、硬件控制部分
截图202310071449579401.jpg 辅助电路(前) 送时钟, 辅助电路(后)送出溢出(加法器回卷)标志,核心电路影子寄存器,寄存器

重加载,影子寄存器16位数据重新装入TH0和TL0
MCU 本质是软件,软件灵活性,提供硬件电路(数字电路:组合逻辑、数字逻辑),来运行硬件
T0 模式1: 不能重加载的16位计数器  65535   没有影子寄存器,不能自动重加载了,要通过软件重新赋值TL0和TH0,才能再让它在周期范围继续计数
截图202310071513482683.jpg

T0 模式2:38位的自动重加载模式
截图202310071516072159.jpg

模式3: 只需允许ET0/IE.1 时间片 不可屏蔽
定时器/计数器2:

软甲和硬件的关联
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-7 16:49:33 | 显示全部楼层
本帖最后由 大亮 于 2023-10-7 16:53 编辑

《何教授 STC32位8051单片机原理及应用-STC32G12K128--2023/9/22--Fri--T/C寄存器和实例--串口开篇



寄存器介绍:定时器/计数器组
控制寄存器TCON
工作模式寄存器TMOD
辅助寄存器AUXR
计数寄存器TH0和TL0
中断与时钟输出控制寄存器INT_CLKO
预分频寄存器TM0PS


截图202310071547441846.jpg

设计实例一

void main()                //1Ãë@12MHz
{
        P4=0;
        P4M0=0;
        P4M1=0;
        P6M0=0;
        P6M1=0;
        P6=0;
  EAXFR = 1; //扩展寄存器(XFR)访问使能, 存储器结构, 外部数据存储空间,这部分叫存储器映射外设
        TM0PS = 0x0F;                        // 设置定时器时钟分频
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xDC;                                //设置定时器初始值
        TH0 = 0x0B;                                //设置定时器初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        EA=1;
        while(1);
}

间隔到了,进入中断

void Timer0_Isr() interrupt 1
{
P6=~P6;
}


设计实例二
随着集成电路制造技术的进化,设计技术的发展,把以前外部电路、分离元器件都集成到IC里面去,有片上系统SOC的概念,发展
IO口的设置


void main()               
{
        EAXFR = 1;
        P4=0;
        P4M0=0;
        P4M1=0;
        P6M0=0;
        P6M1=0;
        P6=0x00;
        P3M0=0;
        P3M1=0;
  P3PU=0x10;  端口配上拉电阻
        TMOD=0x04;                           //设置定时器模式
  TL0=0xff;         //低8位赋值给TL0寄存器
        TH0=0xff;        //高8位赋值给TH0寄存器
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        EA=1;
        while(1);
}



################串口  UART 精彩###########################
RS-232 COM1 COM2 工业中重要作用,2022年标准还有修订,虚拟出来串口
比特流方式,一根线

USB CDC(Universal Serial Bus Communications Device Class)是一种USB设备类别,用于在计算机和外部设备之间进行通信和数据传输。
USB CDC类定义了一组通用的通信协议和命令,使外部设备可以通过USB接口与计算机进行通信。这些外部设备可以是调制解调器、串口设备、网络适配器、打印机等。
USB CDC类提供了一种简单而灵活的方式来实现串行通信,它支持常见的串口通信协议,如RS-232、RS-485等。通过USB CDC,外部设备可以通过USB接口与计算机进行数据传输和控制,而无需使用传统的串口接口。
USB CDC类具有以下特点和功能:
  • Plug-and-Play:USB CDC设备可以通过USB接口与计算机连接,无需安装额外的驱动程序。计算机可以自动检测和识别USB CDC设备,并为其分配相应的驱动程序。
  • 数据传输:USB CDC设备可以通过USB接口进行双向数据传输。它可以向计算机发送数据,也可以接收计算机发送的数据。数据可以是文本、图像、音频等各种形式。
  • 控制命令:USB CDC设备可以通过USB接口接收和执行计算机发送的控制命令。这些命令可以用于控制设备的功能和行为,如开关设备、调整参数等。
  • 多个接口:USB CDC设备可以支持多个接口,每个接口可以提供不同的功能和服务。例如,一个USB CDC设备可以同时提供串口通信和网络适配器功能。


USB CDC类在许多应用中得到广泛应用,特别是在嵌入式系统、物联网设备和通信设备中。它提供了一种方便和标准化的方式来实现USB通信,简化了设备与计算机之间的连接和数据传输过程。


截图202310071638307195.jpg 数据定义   打包(头部、尾部、同步、怎么解包)   恢复回来 移位寄存器,还原

接收要知道多块的速度。异步:发送方不考虑接收方时钟,接收方通过手段同步时钟
截图202310071641421737.jpg 额外的通讯开销


通过时钟推动触发器工作的!







回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-7 17:55:10 | 显示全部楼层
《何教授 STC32位8051单片机原理及应用-STC32G12K128--9月26日(上)


波特率 每秒中发送比特位的个数 码元退化为波特(位) 典型波特率,  移位寄存器:并口转串口,时钟推动移位寄存器,发送的速度,时钟的频率、以什么频率发送码元
校验位:数字通讯数字传输 接收方验证接收数据的正确性,继续逻辑运算,校验的标准,发送方和接收方达成一直、约定,协议。
截图202310071707557040.jpg

停止位:
流量控制:握手
RS-232发明为PC连接调制解调器     连接串口的叫D型插座
STC32G具有两个全双工同步/异步串行通信接口USART1和USART2,以及两个全双工的异步串行通信接口UART3和UART4
用户通过软件设置比特率
通过寄存器控制的多路选择器,充分利用有限的引脚
所有串口模块:
1、两个数据缓冲区:连个物理独立的缓冲区,但使用了通过一个地址,读使能信号和写使能信号区分
2、一个移位寄存器: 缓冲区内并行数据转串行
3、一个串行控制寄存器:串行数据转并行数据
4、一个波特率发生器:为串口模块提供基准时钟


串口1可以在4组引脚之间进行切换,通过相关寄存器字段控制


龙芯处理器Risc(跑Linux系统)架构     STC32G Cisc架构(实时操作系统)  互联互通 组合起来


设计实例1:串口重点位的设计与实现
串口重定位技术是嵌入式系统应用中经典的设计案例: 将C语言中的scanf()和printf()重新定位到串口上,即把串口作为scanf()函数的输入设备,将串口作为printf()函数的输出设备
retarget
为scanf和printf底层的代码进行修改,修改底层函数   putchar.c   getkey.c 底层函数
代码讲解:
<type.h>头文件

#ifndef __TYPE_H_
#define __TYPE_H_
#include "stdio.h"
#include "stc32g.h"
typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;
#define MAIN_Fosc     22118400L
#endif

<uart.h>头文件

#ifndef __UART1_H_
#define __UART1_H_
#include "type.h"
#define     Baudrate2       115200L
/*************  本地函数声明    **************/
void    UART1_init();   //
char    putchar(char c);     //retarget
char    _getkey();           //retarget

void    MCU_init();
#endif

<uart.c>
#include "uart.h"

/***********************UART1初始化******************************/
void UART1_init()   
{   u16 dat;
          dat = (u16)(65536UL - (MAIN_Fosc / 4) / Baudrate2);
    T2R = 0;                                    //Timer stop
    T2_CT = 0;                            //Timer2 set As Timer
    T2x12 = 1;                            //Timer2 set as 1T mode
    T2H = (u8)(dat / 256);
    T2L = (u8)(dat % 256);
    ET2 = 0;                        //
    T2R = 1;                                    //
       
          SCON = (SCON & 0x3f) | 0x40;    //
    REN = 1;                        
    P_SW1 &= 0x3f;                  //

}


/************************printf重定向******************************/
char putchar(char c)
{
  SBUF = c;               //以单字节形式发送
  while(TI != 1);         //     待发送完成
  TI=0;                   //完成清零TI
        return c;
}


/************************scanf retarget*******************************/
char _getkey()
{
        char value;
  while(RI != 1);            //待接收完成
        RI = 0;                    //完成清零RI
        value = SBUF;              //取出接收到的数据
        return value;
}


void MCU_init()
{
                WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È
    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
}
<main.c>

void main()
{
        int a,b;
        int sum;
        MCU_init();
        UART1_init();
        while(1)
        {
                printf("please input two number\r\n");
                scanf("%d %d",&a,&b);
                sum = a + b;
                printf("\r\n");
                printf("%d + %d = %d\r\n",a,b,sum);
        }
}

串口调试助手


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-8 10:05:34 | 显示全部楼层
《何教授 STC32位8051单片机原理及应用-STC32G12K128--9月26日(下)


基于红外线的无线通信也是串行通信的一种,基于红外线的无线通信使用了调制与解码
NEC协议:载波波形
截图202310080935189223.jpg

数据格式
截图202310080936196227.jpg

截图202310080939068169.jpg 455KHz晶体,12分频,信号调制在37.91KHz,占空比1/3

位定义
截图202310080939501877.jpg PWM脉冲宽度调制   脉冲位置调制PPM  占空比

位时间恒定
P3.5引脚中断向量号大于13,C语言中断号大于13它不识别的问题,keil处理方法:
两连跳:
CSEG AT 0143H
JMP P3INT_ISR;
P3INT_ISR;

JMP 0068H;
END
相关寄存器:
使能引脚中断 寄存器P3INTE
P3端口中断模式配置寄存器
代码讲解:


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-8 19:19:01 | 显示全部楼层
本帖最后由 大亮 于 2023-10-8 19:25 编辑

《何教授 STC32位8051单片机原理及应用-STC32G12K128--9月27日--ADC DMA


截图202310081545432318.jpg
模拟多路选择开关由ADC_CONTROL寄存器的CHS3~CHS0字段控制
ADC配置寄存器ADCFG中的SPEED[3:0]控制采样频率

三个公式:转换速度、转换结果计算公式(8位寄存器构成12位精度结果)、
截图202310081617209016.jpg

MCU 单片机 软硬件结合
寄存器组:控制寄存器、配置寄存器、转换结果寄存器、时序控制寄存器
设计案例:要求STC官方实验箱玩得很清楚
组成电阻分压网络
做设计得时候先分析
杜邦线直连1602字符LCD屏
截图202310081648173604.jpg 截图202310081649499043.jpg

代码详解:电压显示

STC开创性贡献: 单片机DMA控制器   CPu与外设交互方式三种: 轮询、中断、DMA
吞吐量提高:CPU处理Task1,DMA同时处理Task2
某些硬件在没有CPU干预下,访问存储系统XDATA
截图202310081846282643.jpg while(1)

截图202310081846558228.jpg 告诉CPU发送缓冲区为空了,释放了写CPU资源,  消耗周期

截图202310081848139396.jpg DMA来了,效率最高,,DMA也有掌握总线得能力,CPU和DMA两个主设备,仲裁

截图202310081854177721.jpg 直接建立传输通道, DMA有一套独立得总线结构

截图202310081855493447.jpg


Cisc 和 Risc 架构

xdata到xdata dma搬数据
M2M_DMA_CFG配置寄存器
控制寄存器DMA_M2M_CR
DMA_M2M_STA状态寄存器
传输总字节寄存器16bit
传输总字节寄存器
发送地址寄存器
接收地址寄存器

保留中断,Keil不能大于31,写到中断号13得地址里去跳转
截图202310081912196124.jpg

插嵌入式汇编,利用保留的中断区域
代码详解:搬移128字节数据

#include "uart.h"
bit        DmaFlag;  //程序变量一个位
u8 xdata DmaTxBuffer[256];
u8 xdata DmaRxBuffer[256];
void DMA_Config(void)
{
  DMA_M2M_CFG = 0x80;     //r++ = t++
        DMA_M2M_STA = 0x00;
        DMA_M2M_AMT = 0x7f;               
        DMA_M2M_TXAH = (u8)((u16)&DmaTxBuffer >> 8);
        DMA_M2M_TXAL = (u8)((u16)&DmaTxBuffer);
        DMA_M2M_RXAH = (u8)((u16)&DmaRxBuffer >> 8);
        DMA_M2M_RXAL = (u8)((u16)&DmaRxBuffer);
        DMA_M2M_CR = 0xc0;
}
void M2M_DMA_Interrupt(void) interrupt 13
{
        if (DMA_M2M_STA & 0x01)        
        {
                DMA_M2M_STA &= ~0x01;
                DmaFlag = 1;
        }}
void main()
{
        u16 i;
        DmaFlag = 0;
        WTST = 0;  
  EAXFR = 1;
  CKCON = 0;
        
        MCU_init();
        
        for(i=0; i<256; i++)
        {
                DmaTxBuffer = i;
                DmaRxBuffer = 0;
        }
        
        UART1_init();
        printf("DMA is ready\r\n");
        DMA_Config();
        
        EA=1;
        
        while(1)
        {
                if(DmaFlag)
                {
                        DmaFlag = 0;
                        for(i=0; i<256; i++)
                        {
                                printf("%02X ", DmaRxBuffer);
                                if((i & 0x0f) == 0x0f)
                                        printf("\r\n");
                        }}}}


QQ图片20231008192459.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-10 12:36:41 | 显示全部楼层
对于简单的汽车电子系统,可以没有嵌入式操作系统就那个,仅存在设备驱动程序和应用程序,但是这种情况现在已经非常少见,对于大多数系统,由于对功能实时性和可扩充性的要求 ,通常需要嵌入式操作系统。基于AUTOSAR操作系统。

多核架构 处理器性能=主频*IPC instruction per clock  主频上升、功耗三次方急剧上升    提高IPC每时钟周期内执行的指令数,提高并行度!
微架构提高、多核提高
1993年OSEK/VDX操作系统,不足:硬件平台几百个、厂家工具联/编译器      手写代码MISRA C     生命周期
现有AUTOSAR规范更名为AUTOSAR Classic Platform 最新4.3.0 2016年11月
为信息娱乐系统量身定制一套新的规范,命名为AUTOSAR Adaptive Platform
自顶向下的AUTOSAR设计方法:
应用层软件组件独立于硬件,应用开发者可以在应用软件中指定各个车辆功能的细节,不用关心底层软件服务核硬件接口
基础软件是标准化软件 BSW Basic Software,为位于其上的RTE提供硬件相关服务
当应用层中定义的AUTOSAR SWC请求服务时,RTE将其映射到实际的ECU上进行实现
电子电气系统功能安全保证,ISO26262 汽车安全完成性等级 ASIL AUTOMOTIVE SAFETY INTERITY LEVEL
车联网下的 网络安全和信息安全 SEA有指导手册
多核处理器   并行计算提高整个处理器系统的计算能力  可在较低工作频率下高效执行指令,将功耗
同时,由于多核处理器性能的提高,在汽车电子系统中所需要的控制器的数量也会减少,降低了开发成本
CPU负载并不均衡;      任务必然有依赖关系,核间要通信,核间通信有开销;     为保证数据的完整性核安全性,必须使用锁定和串行化技术
多核处理器 OS面对挑战: 提升多核处理器的并行计算能力,保障共享数据的安全性, 同时又要满足实时性要求。   对应方案:将任务和中断合理的分配到各个核中
软件开发按照AUTOSAR规范进行程序设计
即满足实时性要求、又满足功能安全要求
AUTOMOTIVE REALTIME INTEGRATED NEXT GENERATION ARCHITECTURE AURIX 32位微控制器 性能和安全两方面要求 三颗TriCore处理器内核 65nm
精简指令集的处理器架构;      数字信号处理器隐形及寻址模式;      丰富的片上存储单元和外设;
ISO26262 认证,  进行中,10月审核,
===预计2023年10月底,或11月初完成认证 !
AEC-Q100 认证,  进行中,STC32G12K128,  
===预计2024年1月完成认证 !

内置一个硬件安全模块 Hardware Security Module  HSM
截图202310101103033755.jpg

三核处理器,包括一个高效能E核,两个高性能P核
外设资源:
DSADC :
电机转子旋转位置的检测 霍尔传感器(精度低) 光学编码器(抗震抗腐蚀弱),胜任现代电动汽车工作环境-旋转变压器
截图202310101122168117.jpg

单片机上集成专门由于旋变位置解码的DSADC模块  Delat Sigma ADC
截图202310101126233871.jpg 旋变激励信号发生单元 carrier generator CG 通过编程产生旋变所需的正弦激励信号,同时对旋变的两路反馈信号进行同步采样,并并且内部集成了滤波器和积分器单元,通过配置单片机寄存器可以直接得到旋变位置解码所需的正余弦电压转换结果。

最后,通过软件算法便可解算出旋变的位置和转速       采样技术、噪声整形技术、数字滤波技术,很低的采样分辨率和很高的采样速率,使模拟信号数字化,将高分辨率转换问题简化为低分辨率转换问题。
单片机提供6路DSADC通道,每通道支持差分或单端信号输入,每通道都可以在专用寄存器控制下独立工作,转换结果存储在各自专用的结果寄存器中。(还支持两个通道级联使用提高转换精度)
GTM:
截图202310101141441259.jpg GTM 通用定时器模块 GENERAL TIMER MODULE

定时器输入模块 TIM TIMER INPUT MODULE
定时器出书模块 TOM TIMER OUTPUT MODULE
连接ARU的定时器输出模块 ARU CONNECTED TIMER OUTPUT MODULE ATOM

VADC:多功能模数转换器(versatile analog to digital converter)

AUTOSAR 一套标准协议 一套标准化的软件架构
开发流程: 先使用DaVinci进行控制器软件系统结构建模,随后自动化生成软件组件描述文件,在将软件组件描述文件导入Simulink中进行功能建模以及自动代码生成。

AUTOSAR分层模型: 应用层     运行时环境      基础软件     微控制器抽象
AUTOSAR方法论:
AUTOSAR定制各种应用的接口规范
截图202310101227163600.jpg 系统配置阶段、ECU设计和配置阶段、代码生成阶段


具体开发流程:
1、编写系统配置输入秒速文件 ARXML 软件组件描述(数据类型、端口、接口等)、ECU资源描述、系统约束描述(通信矩阵、SWC拓扑结果、映射关系)
2、系统配置  SWC映射ECU 系统配置描述文件
3、提取特定ECU的描述  ECU提取文件(通信矩阵、拓扑结果、映射到ECU上的所有软件组件)
4、ECU配置 信息数据认为调度,可构造出该ECU所有运行的软件
5、生成可执行文件
工具链:
截图202310101236283210.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-03-18 20:40:21

1

主题

75

回帖

345

积分

中级会员

积分
345
发表于 2023-10-12 07:22:59 | 显示全部楼层
AUTOSAR软件体系结构:应用层,基础软件层,运行时环境

AUTOSAR基础软件层:   微控制器抽象层,    ECU抽象层,  服务层,  复杂驱动
对于和内存映射星官的外部器件,其驱动程序是直接对微控制器进行存取访问,所以这部分驱动程序属于微控制器抽象层
MCAL:微控制器驱动、存储器驱动、通信驱动、IO驱动
通过调用函数还启动和停止定时器通道
ECU抽象层:板载设备抽线、存储器硬件抽象、通信硬件抽线、IO硬件抽象
Flash EEPROM  Emulation FEE该模块使用Flash存储器来仿真EEPROM功能。
通信硬件抽象中的CANIF (CANInterface):CAN接口位于底层CAN驱动(CAN控制器驱动和CAN收发器驱动)和上层的通信服务层(网络管理、传输协议等)之间,CAN接口通过连接PDU Protocol; Data Unit路由和上层AUTOSAR通信栈的通信模块
截图202310111605056184.jpg 服务层是基础软件层的最高层,它可以实现与应用层软件的关联(服务层还提供了诊断服务,包含同意诊断服务UDS、错误记忆和故障处理)

AUTOSAR COM、通用网络管理接口以及诊断通信管理器DCM 对所有的车辆网络系统都是通用的,并且作为每个ECU的一个实例而存在
底层软件的系统服务模块中的,针对错误处理的不同方面的专有模块: Debugging 诊断事件管理器 诊断记录和追踪模块 诊断通信管理
截图202310112109101658.jpg


回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-24 13:02 , Processed in 0.144708 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表