精华内容
下载资源
问答
  • PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置时间:2018-11-23 14:20:01[导读]开发环境:MAPLAB X IDE v1.85编译器:MPLAB XC 321.使用说明:PIC32外设库提供用于设置和控制32位外设的函数和宏。希望使用...

    PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置

    时间:2018-11-23 14:20:01

    [导读]开发环境:MAPLAB X IDE v1.85编译器:MPLAB XC 321.使用说明:PIC32外设库提供用于设置和控制32位外设的函数和宏。希望使用外设库的应用程序只需在其源文件中包含一个头文件即可访问任意受支持的函数和宏。 备注:

    开发环境:MAPLAB X IDE v1.85编译器:MPLAB XC 321.使用说明:PIC32外设库提供用于设置和控制32位外设的函数和宏。希望使用外设库的应用程序只需在其源文件中包含一个头文件即可访问任意受支持的函数和宏。 备注:plib.h默认安装下的位置 C program Files Microchip xc32 v1.21 pic32mx include plib.h2.PIC32外设库支持以下外设模块函数:■系统级函数■ 预取高速缓存■ DMA■ 总线矩阵函数■ 复位/控制、省电函数■ 振荡器、定时器、输入捕捉/输出比较■ I/O端口和外部中断■ PMP函数■ UART、SPI、I2C、CAN、以太网和USB函数■ RTCC函数■ 10位A/D转换器■ 比较器和看门狗■ CVref■ 看门狗定时器3.主要特点■ 外设库得到了优化,执行速度更快,并且占用更小的 代码存储空间■ 只需一个外设库文件即可访问多个外设模块功能■ C头文件用于启用预定义常量以将参数传递到各个库 函数,以及用于每个外设模块的文件■ 可从采用适合PIC32 MCU的MPLAB C编译器或PIC32汇 编语言编写的应用程序调用预编译库中的 函数■ 包含C源代码以根据特定应用需求定制函数■ 利用C头文件中的预定义常量,在初始化外设或检查状 态位时,无需参考每个特殊功能寄存器的细 节和结构■ API与16位器件兼容4.实例应用4.1 基本I/O控制步骤一:配置IO口。I/O口数字或模拟功能选择,I/O口输入或输出方向选择。(说明:一些I/O口具备数字 口和模拟口功能,这时若想用数字功能能,需要关闭模拟功能。)库函数调用模型:/****************************************************************************功能:设置PORTG口的第15位为输入功能。**输入1:IOPORT_G -- 对应PORTG口**输入2:BIT_15 -- 对应选定PORTG口的第16位**说明:调用该函数会自动关闭掉带模拟功能I/O口的模拟功能。***************************************************************************/ PORTSetPinsDigitalIn(IOPORT_G, BIT_15);同理,若是想设置PORTG口的第16位为输出功能,可以使用函数为:PORTSetPinsDigitalOut(IOPORT_G, BIT_15);某些时候我们会遇到PIC32外部为5V系统,而PIC32为3.3V系统,如果要用PIC32 I/O口驱动外部5V系统的电路时,就需要对I/O口做开漏设置,并在该I/O引入5V系统的上拉电阻,物理模型如图1。

    图 1如图1所示,左边为I/O图腾柱的示意结构,而所谓的I/O口开漏设置实际上就是把I/O上面的那个MOSFET(示意图中画成了三极管,红圈里那个)管关掉,如果不关,就会有5V通过上拉电阻向3.3V流入电流,这样I/O高电平依然停在3.3V水平,而无法到5V. 现在原理明白了,那么如何软件关掉上面那个MOSFET管呢?mPORTDOpenDrainOpen(BIT_3)就是用这条宏定义来设置,显然,这条宏定义也是库里的,蓝色部分对应用的实际需求做出相应的更改。注意:在实际的应用中,我们应该确认该I/O口能否承受5V耐压,这是很重要的,可以查看芯片的直流特性,如图2所示。

    图 2步骤二:设置I/O口的值/****************************************************************************功能:设置PORTG的第16根口线值为0。**输入1:IOPORT_G -- 对应PORTG口**输入2:BIT_15 -- 对应选定PORTG口的第16位**说明:调用该函数会自动关闭掉带模拟功能I/O口的模拟功能。***************************************************************************/PORTClearBits(IOPORT_G, BIT_15);同理,若是想设置PORTG口的第16位为输出"1",可以使用函数为:PORTSetBits(IOPORT_G,BIT_15);同理,若只是想翻转原来的I/O口值,也可以直接使用库函数PORTToggleBits(IOPORT_G, BIT_15);4.2 振荡器控制PIX32X系列单片机有多个时钟源,基本可以分为内部时钟源及外部时钟源两大类,振荡器库函数提 供了单片机时钟源的各种配置功能。/****************************************************************************函数原型void OSCConfig(unsigned long int config1, unsigned long int config2, unsigned long int config3, unsigned long int config4);**功能:该函数用于设置振荡源、PLL分频器、PLL倍频器、和FRC除数因子**输入1:config1-- 包含时钟源选择的位段(即选择一下宏定义就能选择对应的时钟源)OSC_FRC_DIVOSC_FRC_DIV16OSC_LPRCOSC_SOSCOSC_POSC_PLLOSC_POSCOSC_FRC_PLLOSC_FRC ——内部8M振荡器**输入2:config2-- PLL倍频器位段选择 OSC_PLL_MULT_15OSC_PLL_MULT_16OSC_PLL_MULT_17OSC_PLL_MULT_18OSC_PLL_MULT_19OSC_PLL_MULT_20OSC_PLL_MULT_21OSC_PLL_MULT_24**输入3:config3-- PLL分频位段选择OSC_PLL_POST_1OSC_PLL_POST_2OSC_PLL_POST_4OSC_PLL_POST_8OSC_PLL_POST_16OSC_PLL_POST_32OSC_PLL_POST_64OSC_PLL_POST_256**输入4:config4-- FRC除法因子选择OSC_FRC_DIV_1OSC_FRC_DIV_2OSC_FRC_DIV_4OSC_FRC_DIV_8OSC_FRC_DIV_16OSC_FRC_DIV_32OSC_FRC_DIV_64OSC_FRC_DIV_256**说明:调用该函数会自动关闭掉带模拟功能I/O口的模拟功能。***************************************************************************/实际代码分析main() {// this example sets the cpu clock to FRC and then to POSC PLL OSCConfig(OSC_FRC, 0, 0, 0); //选择内部FRC 8M 晶振 mOSCSetPBDIV(OSC_PB_DIV_8); //外设时钟分频器选择}说明:关于输入参数的具体含义需要找到相关的宏定义及对芯片的时钟源架构有很好的了解,此处笔者选用内部FRC 8M晶振。4.3定时器控制目标:制作500ms定时器,用于LED的闪烁控制/****************************************************************************函数原型void OpenTimer1(unsigned int config, unsigned int period),**功能:定时器1配置**输入1:config1-- 定时器1配置位段 Timer Module On/Off(定时器1模块开启 或 关闭)Tx_ONTx_OFF Asynchronous Timer Write Disable (同步定时器写使能)T1_TMWDIS_ONT1_TMWDIS_OFF Timer Module Idle mode On/Off (定时器空闲模式开启 或 关闭)Tx_IDLE_CONTx_IDLE_STOP Timer Gate time accumulation enableTx_GATE_ONTx_GATE_OFF Timer Prescaler (1) ----Timer Input Clock Prescale Select bits,timer1只有这个选项T1_PS_1_1T1_PS_1_8T1_PS_1_64T1_PS_1_256 Timer PrescalerTx_PS_1_1Tx_PS_1_2Tx_PS_1_4Tx_PS_1_8Tx_PS_1_16Tx_PS_1_32Tx_PS_1_64Tx_PS_1_256Timer Synchronous clock enable (1)Tx_SYNC_EXT_ONTimer Clock sourceTx_SOURCE_EXT --External clock from TxCKI pinT1_SOURCE_INT --Internal peripheral clock输入2:period -- This argument contains the 16-bit period value for the Timer.**说明:This macro clears theTMRxregister, writes periodto thePRxregisterand writes configto theTxCONregister***************************************************************************/实际代码分析:void TIMER_Config(){//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//STEP 1. configure the Timer1OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, 0x7A1); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// STEP 2. set the timer interrupt to prioirty level 2ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// STEP 3. enable multi-vector interrupts INTEnableSystemMultiVectoredInt();}Timer 定时器工作原理浅析:经过上面设置,定时器从0开始计数,当计数值与period(此代码为0x100) 时产生中断,中断后会清标志,并清period值,重新从0开始计数(period对应寄存器PR1)void __ISR(4, ipl2) _Timer1Handler(void){// clear the interrupt flagmT1ClearIntFlag();// .. things to do ..OPEN_LED_D4();}下面我们可以一起验证下时钟配置是否正确:目标:产生500ms的定时器。1.系统时钟选择为FRC = 8M2.系统外设时钟为系统时钟的8分频 = 8M/8 = 1M3.定时器时钟源选择为内部系统外设时钟,且做了256次分频 1M/256 = 39064.500ms转换成频率就是2(HZ)那么PR1的值应该是多少呢? 3906/2 = 1953 转换成16进制就是7A1,这样一来就得出了配置时钟1时period应该写入的值了。用示波器观察LED_D4指示灯的高低电平时间为504ms,考虑到一定的误差,总体设计应该是对的。

    来源:互联网

    作者:karen

    换一批

    延伸阅读

    上周三(2020.10.28)的时候,我登陆立创商城,搜索stm32f103c8t6,单价15左右,100片的话,价格不到13。...

    要:可靠性设计是单片机应用系统设计必不可少的设计内容。

    本文从现代电子系统的可靠性出发,...

    这里利用一个实际发生的例子,针对初级工程师经常犯的一个小错误,或者经常要走的一个弯路,做了针对性的纠正。希望可以帮到大家,文笔不好文章中有叙述不清的地方大家多多指教。...

    在现代离线AC-DC电源解决方案中,可编程性和自适应控制提供了智能家居设备所需的灵活性和智能性,以便更好地与电源系统连接。在这些系统中,次级侧单片机(MCU)通常无法在不使用独立偏置电源的情况下启动系统。Microchip

    Techn...

    在工作中经过摸索实验,总结出单片机大致应用程序的架构有三种:

    1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。

    2. 时间片轮询法,此方...

    出品 21ic中国电子网

    一路向北lm

    网站:bbs.21ic.com

    第一个问题,究竟要玩哪一个芯?...

    来来来,让我们一起,左手右手一个慢动作。

    每一个方向都值得一个人用一生去钻研,每一个步骤都有其自身的魅力。...

    串口发送数据

    1、串口发送数据最直接的方式就是标准调用库函数 。

    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)...

    在知乎看到的,觉得见解不错,看完我觉得会对嵌入式有些见解,分享给大家。

    今年...

    展开全文
  • 记得那刚上大一的时候,学校电子设计创新实验室的学长们自发的组织单片机技能培训,每次周末都会安排几个小时的培训,那时候自学了C语言,开始了自己的单片机之旅,记得那时候拿着个51单片机控制LED跑流水灯、做个...

     

    一、前言

    记得那是刚上大一的时候,学校电子设计创新实验室的学长们自发的组织单片机技能培训,每次周末都会安排几个小时的培训,那时候自学了C语言,开始了自己的单片机之旅,记得那时候拿着个51单片机控制LED跑流水灯、做个避障小车什么的还挺好玩的,大一下学期加入了实验室,在学长的建议下积累下来了当时的一些模块代码,做成了一套属于自己的库函数,整套代码注释非常详细,都是自己当时用心一个字一个字手敲上去的,通过那段时间对51单片机的学习,接触到了各种各样的常用传感器模块和单片机技术,受益良多。现在很难用到51单片机了,最近又找到了这套代码,于是分享出来,大家觉得有帮助的可以自己下载。

     

    二、工程涉及到的模块

    1、较为精确的软件延时函数

    2、定时器

    3、中断

    4、I2C协议

    5、SPI协议

    6、LCD1602液晶

    7、LCD12864液晶

    8、PCF8591 AD和DA模块

    9、DS18B20温度传感器

    10、DS1302时钟

    11、IR红外解码

    12、RS232串口通信

    13、AT24C02 存储模块

    14、数码管显示

    15、PWM产生

    16、超声波模块

    17、TFT点阵屏显示

    18、GUI绘图函数

    19、ASCII字库显示、中文显示

    20、图片显示。

    21、NRF24L01 2.4G无线通信模块

    22、TFT点阵屏贪吃蛇游戏

     

     

    三、代码一览

    这里贴上来一些代码预览一下:

    外部中断

    #include "interrupt.h"
    
    /****************************************************
      函数名称: Interrupt_Falling
      函数简介: 配置外部中断下降沿触发函数
      入口参数: Interrupt_Num 外部中断号
    						 Interrupt_NVIC 中断优先级(NVIC_Low或NVIC_High)
      出口参数: 无
      其他:    下降沿触发是通常外部中断的用法,中断后要处
    						理的数据自己在exti.c中编写。
    *****************************************************/
    void Interrupt_Falling(u8 Interrupt_Num,NVIC_Select Interrupt_NVIC)
    {
    	if(Interrupt_Num==0)
    	{
    		IT0=1;  //下降沿触发
    		EX0=1;  //开中断0
    		EA=1;  //开总中断
    		PX0=Interrupt_NVIC;  //外部中断0优先级 1高优先级,0低优先级
    	}
    	else
    	{
    		IT1=1;  //下降沿触发
    		EX1=1;  //开中断1
    		EA=1;  //开总中断
    		PX1=Interrupt_NVIC;  //外部中断1优先级 1高优先级,0低优先级
    	}
    }
    
    /****************************************************
      函数名称: Interrupt_Stop
      函数简介: 禁止中断函数
      入口参数: Interrupt_Num 外部中断号
      出口参数: 无
      其他:    无
    *****************************************************/
    void Interrupt_Stop(u8 Interrupt_Num)
    {
    	if(Interrupt_Num==0)
    	{
    		EX0=0;  //关中断0
    	}
    	else
    	{
    		EX1=0;  //关中断1
    	}
    }

    LCD1602

    #ifndef _LCD1602_H
    #define _LCD1602_H
    #include "public.h"
    
    /***********管脚定义**********************************************/
    sbit LCD1602_E=P2^7;
    sbit LCD1602_RS=P2^6;
    sbit LCD1602_RW=P2^5;
    #define LCD1602_Dataport P0
    
    /**********宏定义命令控制*****************************************/
    #define Com_ClearScreen           0x01  //清显示
    #define Com_CursorReturn          0x02  //光标返回
    #define Com_CursorAndDisplayMode  0x40  //置输入模式
    #define Com_DisplayOnOff          0x80  //显示开/关控制
    #define Com_CursorOrDisplayMove   0x10  //光标或字符移位
    #define Com_SetFuntion            0x20  //置功能
    #define Com_SetRamAdd             0x40  //置字符发生存贮器地址
    #define Com_SetDDRamAddr          0x80  //置数据存贮器地址
    
    /***********函数声明*****************************************/  
    void LCD1602_CheckBusy(void);														//判忙函数
    void LCD1602_WriteCom(uchar com);                       //写命令函数
    void LCD1602_WriteDat(uchar dat);                       //写数据函数
    void LCD1602_WriteAddress(uchar x,uchar y);             //写地址函数
    void LCD1602_WriteString(uchar x,uchar y,uchar *str);   //写字符串函数
    void LCD1602_Init(void);                                //初始化函数
    
    #endif
    
    #include "LCD1602.h"
    
    /****************************************************
      函数名称: LCD1602_CheckBusy
      函数简介: 判忙函数
      入口参数: 无
      出口参数: 无
      其他:    无
    *****************************************************/
    void LCD1602_CheckBusy(void)
    {
    	LCD1602_Dataport=0x00;
    	LCD1602_E=0;
    	LCD1602_RS=0;
    	LCD1602_RW=1;
    	LCD1602_E=1;
    	while(LCD1602_Dataport&0x80);
    	LCD1602_E=0;
    }
    
    /****************************************************
      函数名称: LCD1602_WriteCom
      函数简介: 写命令函数
      入口参数: com,待写入命令
      出口参数: 无
      其他:    无
    *****************************************************/
    void LCD1602_WriteCom(uchar com)
    {
    	LCD1602_CheckBusy();
    	LCD1602_E=0;
    	LCD1602_RS=0;
    	LCD1602_RW=0;
    	LCD1602_Dataport=com;
    	LCD1602_E=1;
    	delay_ms(5);
    	LCD1602_E=0;
    }
    
    /****************************************************
      函数名称: LCD1602_WriteDat
      函数简介: 写数据函数
      入口参数: dat,待写入数据
      出口参数: 无
      其他:    无
    *****************************************************/
    void LCD1602_WriteDat(uchar dat)
    {
    	LCD1602_CheckBusy();
    	LCD1602_E=0;
    	LCD1602_RS=1;
    	LCD1602_RW=0;
    	LCD1602_Dataport=dat;
    	LCD1602_E=1;
    	delay_ms(5);
    	LCD1602_E=0;
    }
    
    /****************************************************
      函数名称: LCD1602_WriteAddress
      函数简介: 写地址函数
      入口参数: x列地址0~15,y行地址0~1
      出口参数: 无
      其他:    无
    *****************************************************/
    void LCD1602_WriteAddress(uchar x,uchar y)
    {
    	if(y==0)
    		x+=0x80;
    	else
    		x+=0xc0;
    	LCD1602_WriteCom(x);
    }
    
    /****************************************************
      函数名称: LCD1602_WriteString
      函数简介: 写字符串函数
      入口参数: x列地址0~15,y行地址0~1,str待写入字符
    						 串地址指针
      出口参数: 无
      其他:    注意计算好对应的显示位数,避免字符写入错
    						误的地址
    *****************************************************/
    void LCD1602_WriteString(uchar x,uchar y,uchar *str)
    {
    	LCD1602_WriteAddress(x,y);
    	while(*str!=0)
    	{
    	LCD1602_WriteDat(*str);
    	str++;
    	}
    }
    
    /****************************************************
      函数名称: LCD1602_Init
      函数简介: 初始化函数
      入口参数: 无
      出口参数: 无
      其他:    无
    *****************************************************/
    void LCD1602_Init(void)
    {
      LCD1602_WriteCom(0x38);  //开显示
    	LCD1602_WriteCom(0x0c);  //开显示不显示光标
    	LCD1602_WriteCom(0x06);  //写一个指针加1
    	LCD1602_WriteCom(0x01);  //清屏
    	LCD1602_WriteCom(0x80);  //设置数据指针起点
    
    }
    

    IR红外解码

    #ifndef _IR_H
    #define _IR_H
    #include "public.h"
    
    /*************管脚定义***************************************/
    sbit IR_DP=P3^2;  //红外传感器数据线
    
    /*************变量定义***************************************/
    extern u8 IR_OK;              //红外信号接收完成标志
    extern u8 IR_Dat[4];  //存储红外解码的数据(用户码,用户反码,数据码,数据反码)
    
    /*************函数声明***************************************/
    void delay800us(void);  //延时函数
    void IR_Init(void);                  //红外接收初始化函数
    //void IR_Interrupt0() interrupt 0;  //外部中断0中断服务函数
    
    #endif
    
    
    #include "IR.h"
    
    /****************************************************
      注意:红外接收头信号线发出的电平信号和接收的是相反的
    				即接收到的红外信号编码其实和遥控发出来的红外信
    				号是各位取反的关系。
    *****************************************************/
    
    u8 IR_OK=0;              //红外信号接收完成标志
    u8 IR_Dat[4]={0,0,0,0};  //存储红外解码的数据(用户码,用户反码,数据码,数据反码)
    
    /****************************************************
      函数名称: delay800us
      函数简介: 延时函数
      入口参数: 无
      出口参数: 无
      其他:    800us延时可以区分出信号0和1
    *****************************************************/
    void delay800us(void)
    {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
            for(b=2;b>0;b--)
                for(a=197;a>0;a--);
    }
    
    /****************************************************
      函数名称: IR_Init
      函数简介: 红外接收初始化函数
      入口参数: 无
      出口参数: 无
      其他:    调用此函数对红外接收做好配置,注意每接收一
    						次红外数据都要初始化一次(调用一次该函数)
    *****************************************************/
    void IR_Init(void)
    {
    	u8 i;
    	IR_DP=1;    //先把红外传感器数据线拉高
    	IT0=1;      //中断0,下降沿触发
    	EX0=1;      //开中断0
    	EA=1;       //开总中断
    	for(i=0;i<4;i++)
    	{
    			IR_Dat[i]=0;  //清除红外数据,注意一定要清除,否则中断中用移位的方式接收数据时会出错。
    	}
    	IR_OK=0;    //接收完成标志置0(未接收)
    }
    
    /****************************************************
      函数名称: IR_Interrupt0
      函数简介: 外部中断0中断服务函数
      入口参数: 无
      出口参数: 无
      其他:    调用此函数进行红外解码,注意使用红外解码时
    							在exti.c中注释掉相应的外部中断0,避免冲突
    *****************************************************/
    void IR_Interrupt0() interrupt 0
    {
    	u8 i;
    	u16 temp;  //等待时间控制变量
    	if(IR_DP==0&&IR_OK==0)  //如果红外接收头数据线确实是低电平且红外数据未接收
    	{
    		EX0=0;  //关外部中断0,防止中断不断进入
    		while(!IR_DP)    //等待9ms的低电平过去
    		{
    			temp++;
    			if(temp>10000)  //如果等待时间超出正常范围,直接退出中断,避免程序死在这里
    			{
    				EX0=1;  //接收到错误信号后要重新打开中断,否则下次接收不了红外信号
    				return;
    			}
    		}
    		temp=0;
    		while(IR_DP)     //等待4.5ms的高电平过去
    		{
    			temp++;
    				if(temp>10000)  //如果等待时间超出正常范围,直接退出中断,避免程序死在这里
    				{
    					EX0=1;  //接收到错误信号后要重新打开中断,否则下次接收不了红外信号
    					return;
    				}
    		}
    		temp=0;
    		for(i=0;i<32;i++)
    		{
    			IR_Dat[i/8]>>=1;  //数据是从低位开始发送的,所以向右移位
    			while(!IR_DP)  //等待0.56ms低电平过去,因为数据0和1前部分都是0.56ms低电平,无区分度
    			{
    				temp++;
    				if(temp>10000)  //如果等待时间超出正常范围,直接退出中断,避免程序死在这里
    				{
    					EX0=1;  //接收到错误信号后要重新打开中断,否则下次接收不了红外信号
    					return;
    				}
    			}
    			temp=0;
    			delay800us();
    			if(IR_DP==1)  //800us过去,IR_DP为1则是信号1,为0则是信号0
    			{
    				IR_Dat[i/8]|=0x80;  //读取计数次数,存入数组中
    				while(IR_DP)
    				{
    					temp++;
    					if(temp>10000)  //如果等待时间超出正常范围,直接退出中断,避免程序死在这里
    					{
    						EX0=1;  //接收到错误信号后要重新打开中断,否则下次接收不了红外信号
    						return;
    					}
    				}
    				temp=0;
    			}
    		}
    		if(i==32)  //如果接收数据是32位完整的,表明是红外信号
    		{
    			for(i=0;i<4;i++)
    			{
    				IR_Dat[i]=~IR_Dat[i];  //数据取反,因为直接从红外接收头读到的信号与遥控的信号是各位取反的
    			}
    			IR_OK=1;                    //数据接收完成
    		}
    	}
    }
    

    RS232串口通信

    #ifndef _RS232_H
    #define _RS232_H
    #include "public.h"
    
    void RS232_Init(u16 Baudrate);  //串口通信初始化函数
    
    #endif
    
    
    #include "RS232.h"
    
    /****************************************************
      函数名称: RS232_Init
      函数简介: 串口通信初始化函数
      入口参数: Baudrate 通信波特率
      出口参数: 无
      其他:    注意晶振频率为11.0592MHZ使用串口通信后定
    						时器1被占用,串口通信中断向量号为4。
    *****************************************************/
    void RS232_Init(u16 Baudrate)
    {
    	SCON = 0x50;   // 设定通信方式为方式1,允许接收,相当于SM1 = 1; REN = 1;(注意顺序不能颠倒!)    
      PCON = 0x00;   //SMOD=0,该语句可去掉(波特率正常),若SMOD=1则(波特率加倍)
    	TMOD = 0x20;   //设置TI定时器于工作方式2
    	switch (Baudrate)   //确定波特率
    	{
    		case 300: {TH1 = 0xA0;TL1 = 0xA0;} break;
    		case 600: {TH1 = 0xD0;TL1 = 0xD0;} break;
    		case 1200: {TH1 = 0xE8;TL1 = 0xE8;} break;
    		case 2400: {TH1 = 0xF4;TL1 = 0xF4;} break;
    		case 3600: {TH1 = 0xF8;TL1 = 0xF8;} break;
    		case 4800: {TH1 = 0xFA;TL1 = 0xFA;} break;
    		case 7200: {TH1 = 0xFC;TL1 = 0xFC;} break;
    		case 9600: {TH1 = 0xFD;TL1 = 0xFD;} break;
    		case 14400: {TH1 = 0xFE;TL1 = 0xFE;} break;
    		case 28800: {TH1 = 0xFF;TL1 = 0xFF;} break;
    	}
    	TR1 = 1;//启动定时器1
    	EA  = 1;//开总中断
    	ES  = 1;//开串行口中断		
    }

    超声波传感器

    #ifndef _ChaoShengBo_H
    #define _ChaoShengBo_H
    #include "public.h"
    
    /*************管脚定义**********************************************/
    sbit ChaoShengBo_TRIG=P2^0;  //触发控制信号输入
    sbit ChaoShengBo_ECHO=P2^1;  //回响信号输出
    
    /*************变量声明**********************************************/
    extern u8 ChaoShengBo_Flag;  //定时器中断溢出标志
    
    /*************函数声明**********************************************/
    u16 ChaoShengBo_Measure(void);  //超声波测距函数
    
    #endif
    
    
    #include "ChaoShengBo.h"
    
    u8 ChaoShengBo_Flag=0;  //定时器中断溢出标志
    
    /****************************************************
      函数名称: ChaoShengBo_Measure
      函数简介: 超声波测距函数
      入口参数: 无
      出口参数: 0 测量失败 非0 测得的返回信号时间(单位us)
      其他:    测试距离=(高电平时间×声速(340M/S))/2,该函数
    						测量返回值为时间(单位us),需要转换成怎样的
    						精度自己转换一下就可以了。
    						注意:该函数调用时占用定时器0,请在(public.h)
    						中使能相关的宏定义,失能其余的宏定义。
    *****************************************************/
    u16 ChaoShengBo_Measure(void)  //0.17毫米每微秒
    {
    	u16 i=20;
    	ChaoShengBo_Flag=0;  //定时器溢出标志位清0
    	TR0=0;
    	TMOD=0x11;  //定时器0工作方式1,16位计数器
    	TH0=TL0=0;
    	EA=1;
    	ChaoShengBo_TRIG=1;
    	while(i--);  //只要保持10us以上即可启动一次信号发送
    	ChaoShengBo_TRIG=0;
    	while(ChaoShengBo_ECHO==0); //等待低电平过去,加上i做判断防止程序死在这里
    	TR0=1;  //高电平到来,开启定时器测量
    	while(ChaoShengBo_ECHO==1);  //定时器测量期间程序一直等待,加上i做判断防止程序死在这里
    	TR0=0;  //测量完成,关闭定时器
    	if(ChaoShengBo_Flag!=1)  //若定时器未溢出
    	{
    		return TH0*256+TL0;  //返回测量值按12M晶振算,单位是us
    	}
    	else  //若定时器溢出按理为65536*340/2/1000000=11.14112米,超出测量范围2cm~400cm
    	{
    		return 0;  //定时器已经溢出,返回最大值表示测量失败
    	}
    }

     

    四、工程下载

    《51单片机外设及常用传感器库》https://download.csdn.net/download/qq_34254642/12398307

     

     

    展开全文
  • 我一看,我问领导这个项目还有没有其他相关资料,领导回复两个字:“没有”,我顿时蒙了,又这样子,每次由他安排的项目总是坑,还问我什么大概什么时候可以做好,什么时候可以提交一份Demo. 此时,想哭的心都有。...

    1. 前言

         最近领导安排一个项目,直接丢了一个机器给我,和两份通讯协议给我,让我完成Android 端和微信小程序平台的蓝牙BLE项目开发。我一看,我问领导这个项目还有没有其他相关资料,领导回复两个字:“没有”,我顿时蒙了,又是这样子,每次由他安排的项目总是坑,还问我什么大概什么时候可以做好,什么时候可以提交一份Demo. 此时,想哭的心都有。领导没有相关项目资料,只能自己想办法了,后来看协议,发现这种蓝牙设备是微信蓝牙设备。就是蓝牙模块是符合微信蓝牙规范的设备,单片机通过是一个支持蓝牙Airsync协议 的模块,使用其中的通道指令进行通讯。

     

    2. 基本知识

    2.1 微信蓝牙外设是符合微信官方规定的蓝牙设备规范的蓝牙设备,其包括经典蓝牙和 4.0 BLE 蓝牙,目前支持 ios 和 andriod 两个系统。

    2.2 微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了《微信蓝牙外设协议》,这份协议像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口。。

    2.3 微信蓝牙物联是一种近场控制场景

    微信硬件平台支持蓝牙和Wifi/3G/GPRS接入。蓝牙接入则是一种近场控制手段,用户只能利用微信通过手机的蓝牙来控制20米左右的蓝牙设备。也即是,当蓝牙设备离开手机蓝牙的连接范围,那么用户是控制不了该设备的。

    对于蓝牙外设来说,手机就像一个蓝牙网关一样,手机通过蓝牙来跟蓝牙外设进行通信,将得到的数据通过手机的wifi或者3G/4G信号与云后端(微信公众平台、第三方云服务端)交互。前者是基于微信Airsync协议,后者则是微信制定的基于TCP/IP协议的《设备接入接口协议》。

     

    3. 微信蓝牙硬件设备

    3.1  服务UUID 和 读写特征和指示特征的UUID

    名称                 值

    ServiceUUID 0xFEE7(该 uuid 经蓝牙官方授权)

    Write Characteristics UUID 0xFEC7

    Indicate Characteristics UUID 0xFEC8

    Read Characteristics UUID 0xFEC9Andriod RFCOMM UUID e5b152ed-6b46-09e9-4678-665e9a972cbc

     

    3.2 蓝牙广播

    3.2.1 广播模式

    BLE 中有两种角色 Central 和 Peripheral,也就是中心设备和外围设备。中心设备可以主动连接外围设备,外围设备发送广播或者被中心设备连接。外围通过广播被中心设备发现,广播中带有外围设备自身的相关信息。

    对于蓝牙设备来说,主要的状态是,包括未连接和已连接两种。

    在未连接时,它需要进行广播。其广播的目的是为了让手机能够扫描蓝牙知到这个蓝牙设备是支持Airsync协议的设备。

    那么,广播数据需要包含什么格式的数据才能被手机微信所识别到呢?这就是蓝牙Airsync协议规定的内容。

    根据微信规范定义,

    蓝牙普通广播包格式::manufature specific data 需以 MAC 地址(6 字节)结尾。

    并且 manufature specific data 长度需大于等于 8 字节(最前两个字节为 company id,没有的话随便填)。

    确认广播包:manufature specific data 需以下面格式结尾,

    0xfe 0x01 0x01 + MAC 地址(6 字节)。并且 manufature specific data 长度需大于等于

    8 字节(最前两个字节为 company id,没有的话随便填)。

     

    3.2.2 BLE 蓝牙广播包

    3.2.2.1 BLE广播概述

     BLE 连接过程中有三个重要的数据包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ。
     SCAN_REQ:  扫描请求,由主设备(MASTER DEVICE)向从设备(SLAVE DEVICE)发出,目的是为了获得从设备的响应以得到更多的从设备广播数据信息(包括设备名字,或者服务UUID,及其它如厂家特定格式的信息(如硬件版本,软件版本号,设备系列号等等)


    SCAN_RSP:  从设备对就主设备发起的SCAN_REQ的响应,作为广播包的补充,从设备可以给主设备更多的广播数据,比如说,有些设备在广播包里面没有设备名字,这个时候就可以把设备名字放在这个包里面发给主设备


    CONNECT_REQ:主设备向从设备发出连接请求。至此连接建立完成(从设备不会响应这个请求),如果从设备没有连接上面的问题的话,以后主从双方会开始相互交换有效数据(基于GAP,GATT及SMP协议)或者交换空包。
       
     

    3.2.2.2 BLE 广播包报文结构 (摘:《ble 广播数据格式细致分析》)

    BLE报文结构如下,他由下图所示的各个域组成。因为有的域的长度超过了一个字节,所以在传输的过程中就涉及到多字节域中哪个字节先传输的问题,BLE报文传输时的字节序和比特序如下:

    •  字节序:大多数多字节域是从低字节开始传输的。注意,并不是所有的多字节域都是从低字节开始传输的。
    • 比特序:各个字节传输时,每个字节都是从低位开始。

    具体每个部分的详细解析可以查看《ble 广播数据格式细致分析》 这篇文章。

    其中,本文关注PDU 中的数据段(AdvData)

    • 广播报文:长度域包含6个比特,有效值的范围是6~37。
    •  数据报文:长度域包含5个比特,有效值的范围是0~31。

      广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要包含6个字节的广播设备地址。6+31=37,所以需要6比特的长度域。

      再次强调:广播时必须要包含6个字节的广播设备地址。

    3..2.2.3 数据(AdvData)

      广播和扫面响应的数据格式如下图所示,由有效数据部分和无效数据部分组成。

                                                             图8:广播和扫描响应的数据格式

      1)  有效数据部分:包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成。其中:

    • Length:AD Type和AD Data的长度。
    • AD Type:指示AD Data数据的含义。

     

    3.2.3.4  广播包可以在 Android 代码中可以使用 BluetoothAdapter 来发起扫描得到,基本用法如下:
    BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback()
    {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            //其中,scanRecord 就是广播包的二进制数据
            //这个广播包,其位置是在, BLE 广播报文格式中的PDU(协议数据单元)中的AdvData 段,
            //而且,AdvData 段由有效数据部分和无效数据部分组成,
            //有效数据部分:包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成。其中:

            //Length:AD Type和AD Data的长度。
            //AD Type:指示AD Data数据的含义。
        }
    };

    安卓蓝牙在扫描设备后,回调方法 onLeScan(...)中的参数 scanRecord 就是广播数据,这里同时包含广播数据扫描应答数据(均为31字节),所以长度一般就是 62 字节,BLE4.0规定,如果广播包和扫描应答包不足字节,则以0补齐.

     

    3.2.2.5 广播数据格式

    所有的 AD type 的定义在文档 ​Core Specification Supplement 中。 AD Type 包括如下类型:

    • Flags: TYPE = 0x01。这个数据用来标识设备 LE 物理连接的功能。DATA 是 0 到多个字节的 Flag 值,每个 bit 上用 0 或者 1 来表示是否为 True。如果有任何一个 bit 不为 0,并且广播包是可连接的,就必须包含此数据。各 bit 的定义如下:

      • bit 0: LE 有限发现模式
      • bit 1: LE 普通发现模式
      • bit 2: 不支持 BR/EDR
      • bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR
      • bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
      • bit 5..7: 预留
    • Service UUID: 广播数据中一般都会把设备支持的 GATT Service 广播出来,用来告诉外面本设备所支持的 Service。有三种类型的 UUID:16 bit, 32bit, 128 bit。广播中,每种类型类型有有两个类别:完整和非完整的。这样就共有 6 种 AD Type。

      • 非完整的 16 bit UUID 列表: TYPE = 0x02;
      • 完整的 16 bit UUID 列表: TYPE = 0x03;
      • 非完整的 32 bit UUID 列表: TYPE = 0x04;
      • 完整的 32 bit UUID 列表: TYPE = 0x05;
      • 非完整的 128 bit UUID 列表: TYPE = 0x06;
      • 完整的 128 bit UUID 列表: TYPE = 0x07;
    • Local Name: 设备名字,DATA 是名字的字符串。Local Name 可以是设备的全名,也可以是设备名字的缩写,其中缩写必须是全名的前面的若干字符。

      • 设备全名: TYPE = 0x08
      • 设备简称: TYPE = 0x09
    • TX Power Level: TYPE = 0x0A,表示设备发送广播包的信号强度。DATA 部分是一个字节,表示 -127 到 + 127 dBm。

    • 带外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每个 bit 表示一个功能:

      • bit 0: OOB Flag,0 表示没有 OOB 数据,1 表示有
      • bit 1: 支持 LE
      • bit 2: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
      • bit 3: 地址类型,0 表示公开地址,1 表示随机地址
    • 外设(Slave)连接间隔范围:TYPE = 0x12。数据中定义了 Slave 最大和最小连接间隔,数据包含 4 个字节:

      • 前 2 字节:定义最小连接间隔,取值范围:0x0006 ~ 0x0C80,而 0xFFFF 表示未定义;
      • 后 2 字节:定义最大连接间隔,同上,不过需要保证最大连接间隔大于或者等于最小连接间隔。
    • 服务搜寻:外围设备可以要请中心设备提供相应的 Service。其数据定义和前面的 Service UUID 类似:

      • 16 bit UUID 列表: TYPE = 0x14
      • 32 bit UUID 列表: TYPE = 0x??
      • 128 bit UUID 列表: TYPE = 0x15
    • Service Data: Service 对应的数据。

      • 16 bit UUID Service: TYPE = 0x16, 前 2 字节是 UUID,后面是 Service 的数据;
      • 32 bit UUID Service: TYPE = 0x??, 前 4 字节是 UUID,后面是 Service 的数据;
      • 128 bit UUID Service: TYPE = 0x??, 前 16 字节是 UUID,后面是 Service 的数据;
    • 公开目标地址:TYPE = 0x17,表示希望这个广播包被指定的目标设备处理,此设备绑定了公开地址,DATA 是目标地址列表,每个地址 6 字节。

    • 随机目标地址:TYPE = 0x18,定义和前一个类似,表示希望这个广播包被指定的目标设备处理,此设备绑定了随机地址,DATA 是目标地址列表,每个地址 6 字节。

    • Appearance:TYPE = 0x19,DATA 是表示了设备的外观。

    • 厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义。

    3.2.2.6  微信蓝牙设备广播包数据:

    02 01 06 05 02 E7 FE E0 FF 09 FF FF FF  F3 3F 31 F3 FF 3F 0D 09 41 46 47 46 34 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

    上面蓝牙广播包中,包含广播包和应答包,各个AD Structure 解析如下:

    1个AD Structure 02 01 06

    Length

    AD Type

    AD Data

    02

    01

    06

    2字节

    AD type为“Flag”

    flag说明了物理连接功能,比如有限发现模式,不支持经典蓝牙等。

    bit 0: LE 有限发现模式。

    bit 1: LE 普通发现模式。

    bit 2: 不支持 BR/EDR。

    bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR。

    bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR。

    bit 5..7: 预留。

     

    2个AD Structure 05 02 E7 FE E0 FF 

    Length

    AD Type

    AD Data

    05

    02

    E7 FE E0 FF 

    5字节

    AD type为“SERVICE_UUID_MORE_AVAILABLE”

    非完整的 16 bit UUID 列表

    E7 FE 为 微信蓝牙硬件指定的服务UUID ,根据微信蓝牙外设协议介绍 (该 uuid 经蓝牙官方授权)

    FF E0 为 另外一个服务 UUID

    3个AD Structure 09 FF FF FF F3 3F 31 F3 FF 3F  

    Length

    AD Type

    AD Data

    09

    FF

    FF FF F3 3F 31 F3 FF 3F

    9字节

    AD type为“Manufacturer Specific Data”

     

    厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义

    根据微信蓝牙外设规定,

    普通广播包:manufature specific data 需以 MAC 地址(6 字节)结尾。 并且 manufature

    specific data 长度需大于等于 8 字节(最前两个字节为 company id,没有的话随便填)。

    确认广播包:manufature specific data 需以下面格式结尾,

    0xfe 0x01 0x01 + MAC 地址(6 字节)。 并且 manufature specific data 长度需大于等于

    8 字节(最前两个字节为 company id,没有的话随便填)。

     

    因此: FF FF F3 3F 31 F3 FF 3F  , FF FF 为厂商ID,   F3 3F 31 F3 FF 3F , 为蓝牙设备的MAC 地址

    4个AD Structure 0D 09 41 46 47 46 34 20 20 20 20 20 20 20  

    Length

    AD Type

    AD Data

    0D

    09

    41 46 47 46 34 20 20 20 20 20 20 20

    13字节

    AD type为“完整的本地名称”

    41 46 47 46 34 20 20 20 20 20 20 20  蓝牙名称的ASCII 码的16进制

    以上就是微信蓝牙广播包解析。

     

     

     

     

    参考文章

    以蓝牙开发的视觉解读微信Airsync协议

    ble 广播数据格式细致分析

    BLE 广播数据解析

    展开全文
  • 在《为什么需要DMA?你知道吗?》中说明了为什么需要DMA。单片机DMA原理都类似的,以STM32F303VTX为例,这个片子有二个DMA控制器,每个控制器控制几个DMA通道。两个所谓的控制器,就开发者的角度而言,就是两个...

    在《为什么需要DMA?你知道吗?》中说明了为什么需要DMA。单片机DMA原理都是类似的,以STM32F303VTX为例,这个片子有二个DMA控制器,每个控制器控制几个DMA通道。两个所谓的控制器,就开发者的角度而言,就是两个寄存器:一个中断标识寄存器,一个中断清除寄存器,这两个寄存器的位是一一对应的,都包含了所有通道的中断信息。真正的各通道控制与中断设置都在各通道控制寄存器内。一个DMA通道是可以支持多个外设的。为DMA是怎么实现与数据源关联的呢,请下图:

    f441e9cf9ccc27bd453ac119ab5e814c.png

    DMA

    这是DMA控制器1通道7所支持外设的示意图。可以看到,每一个通道都支持数个设备的数据传输。而每个源设备控制寄存器都有一个DMA控制位,来实现其与DMA通道的关联(比如ADC控制器和DMAEN位,USART有DMAT发送、DMAR接收位)。但是一个通道下只能关联一个源设备,这一点由开发者来保证,假如你万一关联了几个设备,那么它们都会触发DMA,就乱套了。在DMA初始化完成之后,DMA处理待机状态,真正的DMA传输是由关联的外设启动的某些事件启动的。

    展开全文
  • 单片机都靠串行总线和外设连接的,所以那些公司招聘要求都写着总线协议有道理的啊!!!!!一个嵌入式系统无非就是主控和外设,连接主控和外设的就是串行总线!!!!!就这么简单的道理。什么样的传感器选用...
  • 什么是CSL?

    千次阅读 2011-01-12 11:03:00
    1,DSP片上外设种类及其应用日趋复杂 2,提供一组标准的方法用于访问和控制片上外设 3,免除用户编写配置和控制片上外设所必需的定义和代码 什么是CSL? 1,用于配置、控制和管理DSP片上...
  • 什么是CSL?

    千次阅读 2007-01-23 22:49:00
    1,DSP片上外设种类及其应用日趋复杂 2,提供一组标准的方法用于访问和控制片上外设 3,免除用户编写配置和控制片上外设所必需的定义和代码 什么是CSL?1,用于配置、控制和管理DSP片上外设 2,已为C6000和C5000系列DSP...
  • stm32f10x_conf.h什么东东?

    千次阅读 多人点赞 2019-03-03 13:34:24
    相信大家都会异口同声的说把这两个外设的头文件包含进来不就可以了吗,确实这样的。但是当多个文件需要包含各种外设头文件的时候,是不是得为每个文件逐个的添加这些头文件呢?如果这样的话,还真有点繁琐,这时...
  • 首先说一下什么是DC(设备描述表) 解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC一种包含设备信息的数据...
  • 什么是瘦客户机?

    2011-03-14 00:00:38
    不可移除地用于存储操作系统的本地闪存、以及本地系统内存、网络适配器、显卡和其它外设的标配输入 / 输出选件。瘦客户机没有可移除的部件,可以提供比普通 PC 更加安全可靠的使用环境,以及更低的功耗,更高的...
  • RV-STAR开发板初体验在芯来科技的公众号上看到,他们...整个板子周围布满了各种外设接口,非常有科技感。官方的文档说,它采用的TYPEC的供电口,还可以用来下载程序。这个还蛮方便,我的小米手机线直接就可以上岗...
  • 在Device Tree中,可描述的信息包括:CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和中断使用情况,GPIO控制器和GPIO使用情况,Clock控制器和Clock使用情况。设备树基本上就是画一棵电路板上...
  • 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以SRAM 或者FLASH 。DMA 控制器包含了DMA1 和DMA2,其中DMA1 有7 个通道, DMA2 有5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的...
  • 在Device Tree中,可描述的信息包括:CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和中断使用情况,GPIO控制器和GPIO使用情况,Clock控制器和Clock使用情况。设备树基本上就是画一棵电路板上...
  • 串口协议的接收及解析处理

    千次阅读 2020-03-10 15:34:07
    串口单片机应用中应用最多的外设之一。很多电子硬件都会提供串口,如蓝牙模块、WIFI模块、串口屏等。如果我们想开发基于串口通信的产品或使用基于串口通信的电子硬件时,都避不开通信协议。 通信协议 通信协议听...
  • 在“Step by Step为HPS添加UART外设”章节,我们讲解了如何使用SoC EDS软件为创建好的包含HPS的Qsys系统添加UART外设并生成相应的设备树(dts)文件。在“基于Linux应用程序的HPS配置FPGA”章节,我们也提到了使用开发...
  • 在“Step by Step为HPS添加UART外设”章节,我们讲解了如何使用SoC EDS软件为创建好的包含HPS的Qsys系统添加UART外设并生成相应的设备树(dts)文件。在“基于Linux应用程序的HPS配置FPGA”章节,我们也提到了使用开发...
  • 现在我要设计一个嵌入式系统,...我添加一个外设的标准流程是什么样的?一个外设里面应该包含哪些函数?需要配置什么? 你现在还是乱的,叫你去看acfly的程序你已经把握不下来。 。 ...
  • 问题背景:假设本机ip设为172.29.26.1。自己这有一个cpu,内存到外设的软件仿真环境,有基本的网卡功能,上面跑一个elf格式linux内核。...为什么本机都收到arp应答了仍然获取不到26.200的mac地址?
  • 欢迎走进本期大型驱动科普益智课堂什么是驱动?驱动程序硬件厂商根据操作系统编写的配置文件,即添加到操作系统中包含有关硬件设备的信息的一小块代码。由它把硬件本身的功能告诉给系统,同时也将操作系统指令转化...
  • 创作不易,如果你觉得文章对你有帮助,请点赞收藏,不定时更新,避免找不到回家的路。欢迎阅读数码外设产品的系列文章:今年由于疫情的原因,越来越多人购买平板电脑用于上网课,甚至...购买平板电脑的需求是什么...
  • CSL(chip support library)中包含了很多的TI封装好了的API和MACRO. 为什么要设计CSL? 1,DSP片上外设种类及其应用日趋复杂 ...什么是CSL? 1,用于配置、控制和管理DSP片上外设 2,已为C6000和C5000系列DSP设计
  • 要说我们日常办公的需要的一些小工具,除了鼠标,键盘,鼠标垫,笔记本,扩展坞,还有一个就是U盘了,前段时间由于朗科的20年U盘设计发明专利过期,意味着市场上的多家U盘大厂再也不用给朗科缴纳巨额专利费用,而...
  • 说到储存管理器,就要想到SDRAM,DM9000一些外设,CPU并不直接去访问SDRAM,DM9000,而是通过储存管理器来访问。 那么就我们要访问一个芯片,需要完成什么工作呢? 例如SDRAM: 1.地址线 2.数据线 3.时钟/频率 4....
  • 什么叫做裸设备? 裸设备,也叫裸分区(原始分区),一种没有经过格式化,不被Unix通过文件系统来读取的... 字符设备特殊文件进行I/O操作不经过操作系统的缓冲区,而块设备特殊文件用来同外设进行定长的传输。
  • 本文笔者就结合上一篇文章《学习STM32mini版(流水灯)》,来解释什么是固件库以及他怎么工作的。 STM32的固件库又叫固件函数,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括...
  • 3. 在8086中,逻辑地址、偏移地址、物理地址分别指的是什么?具体说明。 4. 什么是硬件中断和软件中断?在PC机中两者的处理过程有什么不同? 六、综合应用题(每题10分,共20 分) 现有16K×1位的动态...
  • AHB和APB

    千次阅读 2013-05-29 21:07:22
    AHB高级高性能总线,包含多个主机、从机、一个仲裁器和一个中央译码器,挂在这个总线上面的都高速的东东,处理器、rom、ram、DMA等等,32位地址总线和32的数据总线,知道为什么叫STM32了吧,呵呵。 APB高级...
  • CSL(chip support library)

    2011-07-28 22:38:42
    CSL(chip support library)中包含了很多的TI封装好了的...1,DSP片上外设种类及其应用日趋复杂 2,提供一组标准的方法用于访问和控制片上外设 3,免除用户编写配置和控制片上外设所必需的定义和代码什么是CSL?1,用于配

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 144
精华内容 57
关键字:

外设包是什么