CC254X 8051芯片手册介绍

news2024/12/24 3:48:59

1 8051CPU

8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公司,相继开发了功能更多、更强大的兼容产品。

总体架构 

CPU主要由以下几个部分组成:
(1)运算器: 运算器由算术/逻辑运算单元ALU、累加器ACC、寄存器B、暂存寄存器、程序状态字寄存器PSW组成。
(2)控制器: 控制器由指令寄存器IR、指令译码及控制逻辑电路组成。
(3)其他寄存器: 程序计数器PC、数据指针DPTR、堆栈指针SP、工作寄存器R0~R7

内存映射

SRAM映射到地址范围为0x0000到(SRAMSIZE-1) 

XREG区域映射到1KB地址范围(0x6000-0x63FF)中。这些寄存器是附加寄存器,有效地扩展了SFR寄存器空间。一些外围寄存器和大多数无线电控制和数据寄存器都映射在这里。

SFR寄存器映射到地址范围(0x7080-0x70FF)闪存信息页(2KB)陕射到地址范围(0x7800-0x7FFF)中。这是一个只读区域,包含有关设备的各种信息。

SFR寄存器地址总览

2 基础实验

2.1 流水灯

实验目的 

1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 操作 IO 口控制 3 LED 灯的全亮和全灭、闪烁、流水灯

 相关寄存器

下面我们以 P1.0 控制的 LED1 为例,操作 P1.0 时我们需要掌握相关寄存器的作用和配置方法。

下面我们以 P1.0 控制的 LED1 为例,操作 P1.0 时我们需要掌握相关寄存 器的作用和配置方法。

/****************************************************************************
* 文 件 名: main.c
* 作    者: 
* 网    站: 
* 修    订: 
* 版    本: 1.0
* 描    述: 操作IO口控制4盏LED灯的全亮和全灭、闪烁、流水灯
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int 

#define LED1 P1_0       //定义P1.0口为LED1控制端
#define LED2 P1_1       //定义P1.1口为LED2控制端
#define LED3 P0_4       //定义P0.4口为LED3控制端


/****************************************************************************
* 名    称: Delay_ms()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMs(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯    
* 入口参数: mode为1时LED灯亮  mode为0时LED灯灭, 共阴极
* 出口参数: 无
****************************************************************************/
void LedOnOff(uchar mode)
{
    LED1 = mode;
    LED2 = mode;
    LED3 = mode;
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x03;      //P1.0、P1.1定义为输出
    P0DIR |= 0x10;      //P0.4定义为输出
    LedOnOff(0);      //使所有LED灯默认为熄灭状态
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar i;
    
    InitLed();               //设置LED灯相关IO口
    
    while(1)                 //死循环
    {  
        LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
        DelayMs(200);         
        LED2 = !LED2;         
        DelayMs(200);            
        LED3 = !LED3;        
        DelayMs(200);         
        
        for (i=0; i<2; i++)   //所有灯闪烁2次
        {
           LedOnOff(0);    //关闭所有LED灯
           DelayMs(200);
           LedOnOff(1);    //打开所有LED灯
           DelayMs(200);
           
        }
        LedOnOff(0);    //使所有LED灯熄灭状态
        DelayMs(200);
        LedOnOff(1);       
        DelayMs(500);
        LedOnOff(0);    //使所有LED灯熄灭状态
        DelayMs(200);
    }
}

 2.2 按键控制 LED 跑马灯

实验目的
1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 操作 IO 口控制 4 LED 灯的全亮和全灭、闪烁、流水灯
原理图同上
/****************************************************************************
* 文 件 名: main.c
* 作    者:
* 网    站: 
* 修    订: 
* 版    本: 1.0
* 描    述: 按下按键S1控制LED1.LED2.LED3实现跑马灯效果
****************************************************************************/
#include <ioCC2540.h>

#define uchar unsigned char 
#define uint unsigned int 

#define LED1 P1_0        // 定义P1.0口为LED1控制端
#define LED2 P1_1        // 定义P1.1口为LED2控制端
#define LED3 P0_4        // 定义P0.4口为LED3控制端
#define KEY1 P0_1        // 定义P0.1口为S1控制端
#define ON      1
#define OFF     0

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯    
* 入口参数: mode为1时LED灯亮  mode为0时LED灯灭
* 出口参数: 无
****************************************************************************/
void LedOnOrOff(uchar mode)
{
    LED1 = mode;
    LED2 = mode;
    LED3 = mode; 
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x03;  // P1.0、P1.1定义为输出
    P0DIR |= 0x10;  // P0.4定义为输出
    LedOnOrOff(0);  // 使所有LED灯默认为熄灭状态  
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey(void)
{
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

/****************************************************************************
* 名    称: KeyScan()
* 功    能: 读取按键状态
* 入口参数: 无
* 出口参数: 0为抬起   1为按键按下
****************************************************************************/
uchar KeyScan(void)
{
    if (KEY1 == 0)
    {
        DelayMS(10);      //延时10MS去抖
        if (KEY1 == 0)
        {
            while(!KEY1); //松手检测
            return 1;     //有按键按下
        }
    }
    return 0;             //无按键按下
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		      //设置LED灯相应的IO口
    InitKey();            //设置按键S1相应的IO口
    
    while(1)
    {
        DelayMS(2);
        if (KeyScan())    //扫描按键当前状态,按下按钮 松开 后执行
        {
            LED1 = ON;    //点亮LED1      
            DelayMS(200); 
            LED1 = OFF;   //熄灭LED1 
            LED2 = ON;                
            DelayMS(200); 
            LED2 = OFF;            
            LED3 = ON;           
            DelayMS(200); 
            LED3 = OFF; 
        }
    }
}

2.3 外部中断

实验目的
1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 通过按键 S1 产生外部中断改变 LED1 状态

原理同上

 

/****************************************************************************
* 文 件 名: main.c
* 描    述: 通过按键S1产生外部中断改变LED1状态
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.1口控制S1

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}


/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;   //P1.0定义为输出口
    LED1 = 0;        //LED1灯灭 
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置KEY相应的IO口,采用中断方式 
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
    P0IEN |= 0x02;    // P0.1 设置为中断方式 1:中断使能
    PICTL |= 0x02;    //下降沿触发   
    IEN1 |= 0x20;    //允许P0口中断; 
    P0IFG = 0x00;    //初始化中断标志位
    EA = 1;          //打开总中断
}

/****************************************************************************
* 名    称: P0_ISR(void) 中断处理函数 
* 描    述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P0INT_VECTOR    
__interrupt void P0_ISR(void) 
{ 
    DelayMS(10);     //延时去抖
    LED1 = ~LED1;    //改变LED1状态
    P0IFG = 0;       //清中断标志 
    P0IF = 0;        //清中断标志 
} 

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();   //设置LED灯相应的IO口
    InitKey();   //设置S1相应的IO口
    while(1)
    {
    }
}

2.4 定时器 T1-查询方式

1) 通过实验掌握 CC2540 芯片
GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 通过按键 S1 产生外部中断改变 LED1 状态

定时器T1的时钟频率为32MHz / 128 = 250kHz。

在这个配置下,当T1计数器溢出时,中断标志位IRCON会被置位。通过查询IRCON的值是否大于0,代码检测是否发生了定时器T1的中断。

在每次中断发生时,count会自增,并且当count累积到一定值时,LED1会翻转状态,实现LED的周期性闪烁。在这段代码中,count达到1时LED状态翻转,因此要实现约1秒的周期性闪烁,需要count累积到1。

/****************************************************************************
* 文 件 名: main.c
* 描    述: 定时器T1通过查询方式控制LED1周期性闪烁
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int

#define LED1 P1_0       // P1.0口控制LED1

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;      //P1.0定义为输出
    LED1 = 0;           //使LED1灯下电默认为熄灭     
}

/****************************************************************************
* 名    称: InitT1()
* 功    能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT1()
{
    T1CTL = 0x0d;       //128分频,自动重装 0x0000-0xFFFF 
    T1STAT= 0x21;       //通道0,中断有效   
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar count=0;
    
    InitLed();		     //调用初始化函数
    InitT1();
    
    while(1)
    {
        if(IRCON > 0)
        { 
            IRCON=0;
            if(count++ >= 1) //约1s周期性闪烁,示波器测大约为1025MS
            {
              count=0;
              LED1 = !LED1;  //LED1闪烁        
            }
        } 
    }
}

2.5 定时器T3-中断方式

实验目的
1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 掌握定时器 T3(8 ) 通过中断方式控制 LED1 周期性闪烁
CC2530 T3 定时器( 8 位)需要了解
T3CTL,T3CCTL0,T3CC0,T3CCTL1,T3CC 寄存器
/****************************************************************************
* 文 件 名: main.c
* 描    述: 定时器T3通过中断方式控制LED1周期性闪烁
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int

#define LED1 P1_0       // P1.0口控制LED1

uint count;             //用于定时器计数

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;           //P1.0定义为输出
    LED1 = 0;                //使LED1灯下电默认为熄灭     
}

/****************************************************************************
* 名    称: InitT3()
* 功    能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT3()
{     
    T3CTL |= 0x08 ;          //开溢出中断     
    T3IE = 1;                //开总中断和T3中断
    T3CTL |= 0xE0;           //128分频,128/16000000*N=0.5S,N=62500
    T3CTL &= ~0x03;          //自动重装 00->0xff  62500/255=245(次)
    T3CTL |= 0x10;           //启动
    EA = 1;                  //开总中断
}

//定时器T3中断处理函数
#pragma vector = T3_VECTOR 
__interrupt void T3_ISR(void) 
{ 
    IRCON = 0x00;            //清中断标志, 也可由硬件自动完成 
    if(count++ > 245)        //245次中断后LED取反,闪烁一轮(约为0.5 秒时间) 
    {                        //经过示波器测量确保精确
        count = 0;           //计数清零 
        LED1 = ~LED1;        //改变LED1的状态
    } 
}


/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		     //设置LED灯相应的IO口
    InitT3();            //设置T3相应的寄存器
    while(1)
    {};
}

 2.6 串口通信--收发字符串

实验目的
1) 通过实验掌握 CC2530 芯片串口配置与使用,实现串口接收和串口
发送
相关寄存器 UxCSR UxCSR UxGCR UxBUF UxBAUD CLKCONCMD 、CLKCONSTA 详见数据手册的第 16 章节的 16.8

/****************************************************************************
* 文 件 名: main.c
* 描    述: 设置串口调试助手波特率:115200bps 8N1
*           串口调试助手给CC254x发字符串时,开发板会返回接收到的字符串
****************************************************************************/
#include <ioCC2541.h>   //<ioCC2540.h> 
#include <string.h>

#define uchar unsigned char 
#define uint unsigned int 

#define UART0_RX    1
#define UART0_TX    2
#define SIZE       51

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];        //存储发送字符串

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}


/****************************************************************************
* 名    称: InitUart()
* 功    能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |= 0x84;            //开总中断允许接收中断  
}

/****************************************************************************
* 名    称: UartSendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数 
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;       // 清中断标志 
    RxBuf = U0DBUF;                           
}


/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{	
    CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   
   
    InitUart();                                //调用串口初始化函数   
    UartState = UART0_RX;                      //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              //接收状态 
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符            
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 50)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = UART0_TX;  //进入发送状态 
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == UART0_TX)              //发送状态 
        {                         
            U0CSR &= ~0x40;                    //禁止接收 
            UartSendString(RxData, count);     //发送已记录的字符串。
            UartSendString("\r\n",2);          //发送回车。
            U0CSR |= 0x40;                     //允许接收 
            UartState = UART0_RX;              //恢复到接收状态 
            count = 0;                         //计数清0
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }    
    }
}

2.7 AD 采集 cc2530 温度串口显示

实验目的
1) 通过实验掌握 CC2540 CC2541 芯片串口配置与使用
2) 采集到内部温度传感器信息通过串口发送到上位机
P0_2 P0_3 配置为外设功能时: P0_2 RX P0_3 TX USART0
USART1 是串行通信接口,它们能够分别运行于异步 UART 模式或者同
SPI 模式。两个 USART 具有同样的功能,可以设置在单独的 I/O 引脚。

 相关寄存器如下表所示

main.c 

/****************************************************************************
* 文 件 名: main.c
* 描    述: ADC把芯片温度通过串口发给电脑,部分芯片误差较大需校准
*           手摸芯片温度有明显变化
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "UartTimer.h"

#define HAL_ADC_REF_1V25                0x00
#define ADC_12_BIT                      0x30
#define ADC_EMP_SENS                    0x0E
#define ADC_TO_CELSIUS(ADC_VALUE)       ((ADC_VALUE>>4)-334)   //温度校正

/****************************************************************************
* 名    称: InitSensor()
* 功    能: 温度传感器初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitSensor(void)
{ 
   DISABLE_ALL_INTERRUPTS();     //关闭所有中断 
   InitClock();                  //设置系统主时钟为 32M 
   TR0=0x01;                     //设置为1来连接温度传感器到SOC_ADC
   ATEST=0x01;                   //使能温度传感
}   

/****************************************************************************
* 名    称: GetTemperature()
* 功    能: 获取温度传感器 AD 值
* 入口参数: 无
* 出口参数: 通过计算返回实际的温度值
****************************************************************************/
float GetTemperature(void)
{ 
   unsigned int  value; 
   unsigned char tmpADCCON3 = ADCCON3;
   
   ADCIF = 0;   
   
   //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
   ADCCON3  = (HAL_ADC_REF_1V25 | ADC_12_BIT | ADC_EMP_SENS);            
   
   while(!ADCIF);                     //等待 AD 转换完成 
   value =  ADCL >> 2;                //ADCL 寄存器低 2 位无效 
   value |= (((unsigned int)ADCH) << 6);

   ADCCON3 = tmpADCCON3;

   return ADC_TO_CELSIUS(value);                               
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void) 
{   
    char i; 
    float AvgTemp;   
    char strTemp[6];
    
    InitUART();                           //初始化串口 
    InitSensor();                         //初始化 ADC 
    
    while(1) 
    { 
        AvgTemp = 0;          
        for (i=0; i<64; i++) 
        {    
            AvgTemp += GetTemperature();              
        }
        
        AvgTemp = AvgTemp/64;             //每次累加后除 64
       
        memset(strTemp, 0, 6);
        sprintf(strTemp,"%.02f", AvgTemp);//将浮点数转成字符串
        UartSendString(strTemp, 5);       //通过串口发给电脑显示芯片温度
        UartSendString("\r\n",2);
        DelayMS(1000);                    //延时
    } 
}

UartTimer.h

#include <ioCC2541.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)//三个


void InitClock(void)
{   
    CLKCONCMD &= ~0x40;              //设置系统时钟源为 32MHZ晶振
    while(CLKCONSTA & 0x40);         //等待晶振稳定 
    CLKCONCMD &= ~0x47;              //设置系统主时钟频率为 32MHZ
}

/****************************************************************************
* 名    称: InitT3()
* 功    能: 定时器初始化
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT3(void)
{
    T3CCTL0 = 0x44;        //T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
    T3CC0 = 0xFA;          //T3CC0设置为250
    T3CTL |= 0x9A;         //启动T3计数器,计数时钟为16分频。使用MODULO模式
    IEN1 |= 0x08;     
    IEN0 |= 0x80;          //开总中断,开T3中断
}

/****************************************************************************
* 名    称: InitUart()
* 功    能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUART(void)
{
    PERCFG = 0x00;                   //位置1 P0口
    P0SEL = 0x3C;                    //P0用作串口
    
    P2DIR &= ~0xC0;                  //P0优先作为UART0    
    U0CSR |= 0x80;                   //串口设置为UART方式
    U0GCR |= 11;				
    U0BAUD |= 216;                   //波特率设为115200
    
    UTX0IF = 1;                      //UART0 TX中断标志初始置位1  
    U0CSR |= 0x40;                   //允许接收
    IEN0 |= 0x84;                    //开总中断,接收中断
}

/****************************************************************************
* 名    称: UartSendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
   
    U0DBUF = 0x0A;                   //输出换行
    while(UTX0IF == 0);
    UTX0IF = 0;
}

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时 16M时大约为530,32M需要调整,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<1060; j++);
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨&#xff0c;结合最新的研究和实际应用案例&#xff0c;我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent&#xff08;数字代理&#xff09;: 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

redis_watchDog机制

文章目录 介绍机制介绍任务开始任务释放 介绍 redis的watchDog机制实现了超时续约的功能&#xff0c;简单来说就是在获取锁成功以后&#xff0c;开启一个定时任务&#xff0c;这个任务每隔一段时间(relaseTime / 3)&#xff0c;重置超时时间&#xff0c;避免的因业务阻塞导致锁…

比特币L2项目主网密集上线:新业态背后的挑战与机遇

随着加密货币行业的快速发展&#xff0c;比特币Layer 2&#xff08;以下简称L2&#xff09;项目的主网密集上线成为了近期的热点话题。这一潮流不仅是对比特币网络扩展的重要里程碑&#xff0c;也为新的商业模式和生态系统带来了无限可能。然而&#xff0c;随之而来的是各种挑战…

支付宝支付之SpringBoot整合支付宝入门

支付宝支付 对接流程 申请阿里支付官方企业账号配置应用签约产品获取RSAKey&#xff08;非对称加密&#xff09;必须获得两个加密串&#xff1a;一个公钥&#xff0c;一个密钥SDK功能开发业务对接支付回调支付组件 核心所需的参数 APPID商家私钥支付宝公钥支付回调地址网关…

实战纪实 | 学工平台平行越权

一.账号密码可爆破&#xff08;无验证码&#xff09; 1.学校学工平台用于请假跟每日上报健康信息&#xff0c;登录框如下&#xff1a; 2.经过测试发现这里不存在验证码验证&#xff0c;并且存在初始密码&#xff0c;可以尝试使用默认密码爆破账号&#xff1a; 3.经测试&#x…

【无标题】PHP-parse_str变量覆盖

[题目信息]&#xff1a; 题目名称题目难度PHP-parse_str变量覆盖1 [题目考点]&#xff1a; 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值&#xff0c;一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有&#xff1a;$$&…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

护网行动 | 蓝队应急响应流程概述

了解蓝队应急响应的流程 应急响应通常是指为了应对各种意外事件发生前所做的准备&#xff0c;以及在意外事件发生后所采取的措施。 网络安全应急响应是指对已经发生或可能发送的安全事件进行监控、分析、协调、处理、保护资产安全。 网络安全应急响应主要是为了让人们对网络安全…

idea2023专业版安装破解+maven配置教程

前言 上一篇文章已经介绍了maven在Win10系统的安装配置教程。基于Win10的maven配置环境&#xff0c;本篇文章将介绍idea2023的安装破解教程及maven在idea2023的配置教程&#xff08;同时会将maven在idea2023的配置教程内容补充至上一篇文章&#xff09;。 一、idea2023下载安…

【学习】jemter中如何高效使用正则表达式

在Jemter的世界里&#xff0c;正则表达式无疑是一把锐利的剑&#xff0c;它可以帮助我们轻松地解决许多问题。在Jemter的性能测试过程中&#xff0c;我们常常需要提取响应中的某些数据&#xff0c;以便在后续的请求中使用。这时&#xff0c;正则表达式就派上用场了。通过学习如…

Linux进阶篇:Centos7搭建smb服务

Centos7搭建smb服务 1 smb介绍 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域…

C语言学习笔记之指针(二)

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…

内网隧道技术总结

隧道技术解决的是网络通信问题&#xff0c;因为在内网环境下&#xff0c;我们不同的内网主机管理员会进行不同的网络配置&#xff0c;我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程&#xff0c;是可以是我们已经取得了一定的权限&#xff0c;在这…

元数据管理Atlas

文章目录 一、Atlas概述1、Atlas入门2、Atlas架构原理 二、Atlas安装1、安装环境准备1.1 安装Solr-7.7.31.2 Atlas2.1.0安装 2、Atlas配置2.1 Atlas集成Hbase2.2 Atlas集成Solr2.3 Atlas集成Kafka2.4 Atlas Server配置2.5 Kerberos相关配置2.6 Atlas集成Hive 3、Atlas启动 三、…

一次配置Docker环境的完整记录

一次配置Docker环境的完整记录 Docker环境搭建报错与解决报错一报错二报错三 Docker环境搭建 本节介绍了一次配置docker环境的完整记录&#xff1a; 编写Dockerfile文件&#xff1a; FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develRUN rm /etc/apt/sources.list.d/cuda.l…

【每日力扣】15. 三数之和与11. 盛最多水的容器

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k…

安全认证Kerberos详解

文章目录 一、Kerberos入门与使用1、Kerberos概述1.1 什么是Kerberos1.2 Kerberos术语1.3 Kerberos认证原理 2、Kerberos安装2.1 安装Kerberos相关服务2.2 修改配置文件2.3 其他配置与启动 3、Kerberos使用概述3.1 Kerberos数据库操作3.2 Kerberos认证操作 二、Hadoop Kerberos…

10个常用的损失函数及Python代码实现

本文深入理解并详细介绍了10个常用的损失函数及Python代码实现。 什么是损失函数&#xff1f; 损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误&#xff0c;损失函数值越低则预测越接近真实值…

Day99:云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

目录 云原生-K8s安全-横向移动-污点Taint 云原生-K8s安全-Kubernetes实战场景 知识点&#xff1a; 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 云原生-K8s安全-横向移动-污点Taint 如何判断实战中能否利用污点Taint&#xff1f; 设置污点…

【项目实战】记录一次PG数据库迁移至GaussDB测试(上)

目录 一、说明 1.1、参考文档 1.2、注意事项 1.3、环境基本情况 二、GaussDB新环境安装 2.1 配置操作环境变量 2.1.1 关闭防火墙 步骤1 执行以下命令&#xff0c;检查防火墙是否关闭。 步骤2 执行以下命令&#xff0c;关闭防火墙并禁止开机启动。 步骤3 修改/etc/sel…