STM32 CAN总线说明

发布者:疯狂小马最新更新时间:2018-06-07 来源: eefocus关键字:STM32  CAN总线 手机看文章 扫描二维码
随时随地手机看文章

简介:

  1. CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。

  2. CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。

  3. CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。

特点:

  1. 多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

  2. 系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。

  3. 速度快,距离远。最高1Mbps(距离<40M),最远可达10KM(速率<5Kbps)。

  4. 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

  5. 故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

  6. 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

物理特征:

总线电平=CAN_H的电压-CAN_L的电压 
显性电平对应逻辑0=总线电平为2V左右 
隐性电平对应逻辑0=总线电平为0V 
这里写图片描述

显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

帧种类介绍:

帧种类帧作用
数据帧用于发送单元向接收单元传送数据的帧
遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧用于当检测出错误时向其它单元通知错误的帧
过载帧用于接收单元通知其尚未做好接收准备的帧
间隔帧用于将数据帧及遥控帧与前面的帧分离开来的帧

注:其中,数据帧和遥控帧有标准格式和扩展格式两种格式。 
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。

STM32 CAN控制器简介:

  1. 支持CAN协议2.0A和2.0B主动模式

  2. 波特率最高达1Mbps

  3. 支持时间触发通信

  4. 具有3个发送邮箱

  5. 具有3级深度的2个接收FIFO

  6. 可变的筛选器组(也称过滤器组,最多28个,F1普通为14个,互联和F4为28个,另外F4有两个can,F1只有一个)

3种模式: 
工作模式:

  • 初始化模式(INRQ=1,SLEEP=0)

  • 正常模式(INRQ=0,SLEEP=0)

  • 睡眠模式(SLEEP=1)

测试模式:

  • 静默模式( LBKM=0,SILM=1 )

  • 环回模式( LBKM=1,SILM=0 )

  • 环回静默模式(LBKM=1,SILM=1)

调试模式(不常用)

STM32 CAN筛选器位宽和模式配置:

CAN的标识符不表示目的地址而是表示发送优先级,接收节点根据标识符的值,来决定是否接收对应消息。 
这里写图片描述

标识符屏蔽模式:过滤一组标识符 
标识符列表模式:过滤一个标识符

例:设置筛选器组0工作在:1个32位筛选器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。

波特率设置:

STM32F103,设TS1=8、TS2=7、BRP=3,波特率=36000/[(9+8+1)*4]=500Kbps。

STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps。


寄存器:


CAN主控制寄存器(CAN_MCR)


该寄存器的我们仅介绍下INRQ位,该位用来控制初始化请求。 

设置INRQ=0,可使CAN从初始化模式进入正常工作模式。 

设置INRQ=1,可使CAN从正常工作模式进入初始化模式。 

CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置INRQ=0,进入正常工作模式。


CAN位时序寄存器(CAN_BTR)设置波特率 

CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R) 

CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2) 

CAN发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0~2) 

低4位用于设置发送多少个字节,最多为8个字节 

CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR) (x=0~2) 

CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1) 

CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0/1) 

CAN接收FIFO邮箱邮箱数据寄存器(CAN_RDLxR/CAN_RDHxR) (x=0/1) 

CAN筛选器模式寄存器(CAN_FM1R)(0标识符屏蔽,1标识符列表) 

CAN筛选器尺度寄存器(CAN_FS1R)(0双16位,1单32位) 

CAN筛选器FIFO关联寄存器(CAN_FFA1R)(0筛选器分到FIFO0,1筛选器分到FIFO1) 

CAN筛选器激活寄存器(CAN_FA1R)(0未激活,1激活) 

CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)(F103筛选器只有14个)


配置步骤:


①配置相关引脚的 复用功能,使能CAN时钟。


N的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX引脚),并使能PA口的时钟(CAN_TX引脚),并使能PA口的时钟

②设置CAN工作模式及波特率等。


通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。

③设置滤波器。


本例程,我们将使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。

CODE:

//can.c

#include "can.h"

#include "led.h"

#include "delay.h"

#include "usart.h" 


//CAN初始化

//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq

//tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;

//tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq

//brp :波特率分频器.范围:1~1024;  tq=(brp)*tpclk1

//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);

//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;

//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);

//则波特率为:36M/((8+9+1)*4)=500Kbps

//返回值:0,初始化OK;

//    其他,初始化失败; 

u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)

    GPIO_InitTypeDef        GPIO_InitStructure; 

    CAN_InitTypeDef         CAN_InitStructure;

    CAN_FilterInitTypeDef   CAN_FilterInitStructure;

#if CAN_RX0_INT_ENABLE 

    NVIC_InitTypeDef        NVIC_InitStructure;

#endif


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA时钟                                                                

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);    //使能CAN1时钟  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽

    GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化IO

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入

    GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化IO

    //CAN单元设置

    CAN_InitStructure.CAN_TTCM=DISABLE;         //非时间触发通信模式  

    CAN_InitStructure.CAN_ABOM=DISABLE;         //软件自动离线管理   

    CAN_InitStructure.CAN_AWUM=DISABLE;         //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)

    CAN_InitStructure.CAN_NART=ENABLE;          //禁止报文自动传送 

    CAN_InitStructure.CAN_RFLM=DISABLE;         //报文不锁定,新的覆盖旧的  

    CAN_InitStructure.CAN_TXFP=DISABLE;         //优先级由报文标识符决定 

    CAN_InitStructure.CAN_Mode= mode;          //模式设置: mode:0,普通模式;1,回环模式; 

    //设置波特率

    CAN_InitStructure.CAN_SJW=tsjw;             //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq    CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq

    CAN_InitStructure.CAN_BS1=tbs1;             //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq

    CAN_InitStructure.CAN_BS2=tbs2;             //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~    CAN_BS2_8tq

    CAN_InitStructure.CAN_Prescaler=brp;        //分频系数(Fdiv)为brp+1  

    CAN_Init(CAN1, &CAN_InitStructure);         //初始化CAN1 


    CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0

    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;   //屏蔽位模式

    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;  //32位宽 

    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;    //32位ID

    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK

    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0

    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0

    CAN_FilterInit(&CAN_FilterInitStructure);           //滤波器初始化


#if CAN_RX0_INT_ENABLE 

    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);              //FIFO0消息挂号中断允许.            


    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

#endif

    return 0;

}   


#if CAN_RX0_INT_ENABLE  //使能RX0中断

//中断服务函数                

void USB_LP_CAN1_RX0_IRQHandler(void)

{

  CanRxMsg RxMessage;

    int i=0;

  CAN_Receive(CAN1, 0, &RxMessage);

    for(i=0;i<8;i++)

    printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);

}

#endif


//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)   

//len:数据长度(最大为8)                     

//msg:数据指针,最大为8个字节.

//返回值:0,成功;

//       其他,失败;

u8 Can_Send_Msg(u8* msg,u8 len)

{   

    u8 mbox;

    u16 i=0;

    CanTxMsg TxMessage;

    TxMessage.StdId=0x12;           // 标准标识符 

    TxMessage.ExtId=0x12;           // 设置扩展标示符 

    TxMessage.IDE=CAN_Id_Standard;  // 标准帧

    TxMessage.RTR=CAN_RTR_Data;     // 数据帧

    TxMessage.DLC=len;              // 要发送的数据长度

    for(i=0;i

    TxMessage.Data[i]=msg[i];                     

    mbox= CAN_Transmit(CAN1, &TxMessage);   

    i=0; 

    while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束

    if(i>=0XFFF)return 1;

    return 0;    

}

//can口接收数据查询

//buf:数据缓存区;     

//返回值:0,无数据被收到;

//       其他,接收的数据长度;

u8 Can_Receive_Msg(u8 *buf)

{                  

    u32 i;

    CanRxMsg RxMessage;

    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;     //没有接收到数据,直接退出 

    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据 

    for(i=0;i<8;i++)

    buf[i]=RxMessage.Data[i];  

    return RxMessage.DLC;   

}



main.c


#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "lcd.h"

#include "usart.h"   

#include "can.h" 


 int main(void)

 {   

        u8 key;

    u8 i=0,t=0;

    u8 cnt=0;

    u8 canbuf[8];

    u8 res;

    u8 mode=CAN_Mode_LoopBack;//CAN工作模式;CAN_Mode_Normal(0):普通模式,CAN_Mode_LoopBack(1):环回模式


    delay_init();            //延时函数初始化    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

    uart_init(115200);      //串口初始化为115200

    LED_Init();             //初始化与LED连接的硬件接口

    LCD_Init();             //初始化LCD    

    KEY_Init();             //按键初始化         


    CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN初始化环回模式,波特率500Kbps    


    POINT_COLOR=RED;//设置字体为红色 

    LCD_ShowString(60,50,200,16,16,"WarShip STM32");    

    LCD_ShowString(60,70,200,16,16,"CAN TEST"); 

    LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

    LCD_ShowString(60,110,200,16,16,"2015/1/15");

    LCD_ShowString(60,130,200,16,16,"LoopBack Mode");    

    LCD_ShowString(60,150,200,16,16,"KEY0:Send WK_UP:Mode");//显示提示信息        

    POINT_COLOR=BLUE;//设置字体为蓝色    

    LCD_ShowString(60,170,200,16,16,"Count:");          //显示当前计数值   

    LCD_ShowString(60,190,200,16,16,"Send Data:");      //提示发送的数据   

    LCD_ShowString(60,250,200,16,16,"Receive Data:");   //提示接收到的数据      

    while(1)

    {

        key=KEY_Scan(0);

        if(key==KEY0_PRES)//KEY0按下,发送一次数据

        {

            for(i=0;i<8;i++)

            {

                canbuf[i]=cnt+i;//填充发送缓冲区

                if(i<4)LCD_ShowxNum(60+i*32,210,canbuf[i],3,16,0X80);   //显示数据

                else LCD_ShowxNum(60+(i-4)*32,230,canbuf[i],3,16,0X80); //显示数据

            }

            res=Can_Send_Msg(canbuf,8);//发送8个字节 

            if(res)LCD_ShowString(60+80,190,200,16,16,"Failed");        //提示发送失败

            else LCD_ShowString(60+80,190,200,16,16,"OK    ");          //提示发送成功                                   

        }else if(key==WKUP_PRES)//WK_UP按下,改变CAN的工作模式

        {      

            mode=!mode;

            CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN普通模式初始化, 波特率500Kbps 

            POINT_COLOR=RED;//设置字体为红色 

            if(mode==0)//普通模式,需要2个开发板

            {

                LCD_ShowString(60,130,200,16,16,"Nnormal Mode ");       

            }else //回环模式,一个开发板就可以测试了.

            {

                LCD_ShowString(60,130,200,16,16,"LoopBack Mode");

            }

            POINT_COLOR=BLUE;//设置字体为蓝色 

        }        

        key=Can_Receive_Msg(canbuf);

        if(key)//接收到有数据

        {           

            LCD_Fill(60,270,130,310,WHITE);//清除之前的显示

            for(i=0;i

            {                                       

                if(i<4)LCD_ShowxNum(60+i*32,270,canbuf[i],3,16,0X80);   //显示数据

                else LCD_ShowxNum(60+(i-4)*32,290,canbuf[i],3,16,0X80); //显示数据

            }

        }

        t++; 

        delay_ms(10);

        if(t==20)

        {

            LED0=!LED0;//提示系统正在运行   

            t=0;

            cnt++;

            LCD_ShowxNum(60+48,170,cnt,3,16,0X80);  //显示数据

        }          

    }

}


关键字:STM32  CAN总线 引用地址:STM32 CAN总线说明

上一篇:STM32之Core Coupled Memory(CCM)内存
下一篇:嵌入式学习--step4 STM32F4总线架构

推荐阅读最新更新时间:2024-03-16 16:04

安全启动 - STM32安全启动应用
安全启动实现了信任根。 为了整体安全的需要,需要将信任传递到下一级。这个信任传递是通过加解密技术完成的。 在启动时,我们要至少保证下一级固件的完整可靠性。意味着,我们要使用认证技术,对用户固件进行验证。对用户固件进行验证可以使用哈希函数,也可以使用基于对称密钥的验证码 AES-GCM。 系统在安全启动前,需要保存已经烧录到 Flash 里的用户固件的哈希值。这个哈希值,通过前面所提到的 STM32 安全技术,保证它不会被内外攻击所改变。 系统在安全启动时,利用前面所构造的安全执行环境,对需要进一步执行的用户固件,进行一个哈希运算。哈希运算一般是采用 SHA256。 系统比较这两个值。如果计算出来的哈希值,与存储的哈希值相同,我们
[单片机]
stm32CAN波特率计算小程序(QT源码)
软件:Qt Creator 开发环境:Window7 用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler=5; 波特率计算小程序的截图: 根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。 据网上资料,采样点的设置有以下规律: 75% when 波特率
[单片机]
stm32CAN波特率计算小程序(QT源码)
STM32—cubeMX+DMA+USART 接收任意长度的数据
前言     之前的一篇文章中我为了可以实现USART接收任意长度的数据,对HAL的库进行了修改,可以实现接收以0x0a结尾的任意长度数据,即认为接收到0x0a时接收结束,见链接:HAL USART接收任意长度。   然而,上述这种方法并不合适,原则上HAL库一般不去修改,不便于其他人移植程序,降低了程序中库的适用性,这是很不好的习惯,所以这种方法并不可取。   后查资料得知STM32中还可以利用DMA的方式实现串口的任意长度数据的接收,故开始学习DMA+串口接收任意长度的数据这种方式。 cubeMX软件配置过程 首先,第一步都是进行时钟树的配置,配置好系统的时钟,不同的芯片配置不同的时钟频率,如图。
[单片机]
<font color='red'>STM32</font>—cubeMX+DMA+USART 接收任意长度的数据
CRC校验、STM32中CRC计算单元、CRC应用
从这一段时间后台反馈的问题可以看得出来,好些朋友对CRC没有什么概念,今天就在这里讲述一下关于CRC校验、STM32中CRC计算单元相关内容。 1关于CRC校验 CRC:Cyclic Redundancy Check,即循环冗余校验码。 CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ---来自百度百科 学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,
[单片机]
CRC校验、<font color='red'>STM32</font>中CRC计算单元、CRC应用
stm32 栈的大小问题
前几天写stm32程序,遇到一个奇怪的问题,有一个数组的值总被非法修改。 开始以为是哪里数组访问越界了,查了半天没发现有越界访问的数组。后来把程序一部分一部分注释掉,发现调用一个根本不相干,也不存在什么问题的函数时,那个数组就会被修改。然后又是不断地试,注释掉各个部分。最终也没有找到规律。没办法只好将两个局部数组移到外面,定义成全局变量,结果问题解决。 网上一查才发现,栈的大小是需要定义的,默认0x200。几天的工作啊,就是因为这个问题。记一辈子了。
[单片机]
STM32串口DMA问题详解
昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解。 讨论三个问题: 1、什么叫串口DMA 请求; 2、串口简要复习; 3、串口DMA发送流程。 1、什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,
[单片机]
<font color='red'>STM32</font>串口DMA问题详解
基于CAN总线的电梯呼梯控制器的设计与实现
  1 引言   目前电梯的生产情况和使用数量成为一个国家现代化程度的标志之一。电梯是机电一体的高层建筑的复杂运输设备。它涉及机械工程、电子技术、电力电子技术、电机与拖动理论、自动控制理论等多个科学领域。电梯呼梯控制器是电梯的一个重要组成部分, 位于每一层楼电梯门的左边或者右边,是每一层楼的呼叫装置,用于给出每一楼层的呼叫请求信息,并显示电梯当前运行情况。乘客可以通过显示器、按键等了解到电梯运行的大量信息。本文采用CAN总线技术设计呼梯控制器,各控制器之间只需一对双绞线以一定的网络拓扑结构连接即可,安装极为方便,且可靠性高。对于不同楼层数的控制系统只需在CAN总线中加入相应数目的呼梯控制器即可,主控制器硬件软件不需做任何改动
[嵌入式]
STM32的一些基本知识总结
Cortex-M3缩略语 AMBA:先进单片机总线架构 ADK:AMBA设计套件 AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线 ARM ARM:ARM架构参考手册 ASIC:行业领域专用集成电路 ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿真器 IDE:集成开发环境 IRQ:中断请求(通常是外中断请求) ISA:指令系统架构 ISR:中断服务例程 I
[单片机]
<font color='red'>STM32</font>的一些基本知识总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved