stm32 HAL库分析之CAN

发布者:SparkCrafter最新更新时间:2019-03-11 来源: eefocus关键字:stm32  HAL库  CAN 手机看文章 扫描二维码
随时随地手机看文章

stm32 HAL库分析之CAN

阻塞发送

 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)                       

 565 {                                                                                                   

 566   uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;                                                

 567   uint32_t tickstart = 0U;                                                                          

 568                                                                                                     

 569   /* Check the parameters */                                                                        

 570   assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));                                                   

 571   assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));                                                      

 572   assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));                                                      

 573                                                                                                     

 574   if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \                                                                                                                           

 575      ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \                                      

 576      ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))                                          

 577   {                                                                                                 

 578     /* Process locked */                                                                            

 579     __HAL_LOCK(hcan);                                                                               

 580                                                                                                     

 581     /* Change CAN state */                                                                          

 582     switch(hcan->State)                                                                             

 583     {                                                                                               

 584       case(HAL_CAN_STATE_BUSY_RX0):                                                                 

 585           hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;                                                  

 586           break;                                                                                    

 587       case(HAL_CAN_STATE_BUSY_RX1):                                                                 

 588           hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;                                                  

 589           break;                                                                                    

 590       case(HAL_CAN_STATE_BUSY_RX0_RX1):                                                             

 591           hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;                                              

 592           break;                                                                                    

 593       default: /* HAL_CAN_STATE_READY */                                                            

 594           hcan->State = HAL_CAN_STATE_BUSY_TX;                                                      

 595           break;                                                                                    

 596     }                                                                                               

 597                                                                                                     

 598     /* Select one empty transmit mailbox */                                                         

 599     if ((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)                                         

 600     {                                                                                               

 601       transmitmailbox = CAN_TXMAILBOX_0;                                                            

 602     }                                                                                               

 603     else if ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)                                    

 604     {                                                                                               

 605       transmitmailbox = CAN_TXMAILBOX_1;                                                            

 606     }                                                                                               

 607     else                                                                                            

 608     {                                                                                               

 609       transmitmailbox = CAN_TXMAILBOX_2;                                                            

 610     }                                                                                               

 611  

 612     /* Set up the Id */                                                                             

 613     hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;                               

 614     if (hcan->pTxMsg->IDE == CAN_ID_STD)                                                            

 615     {                                                                                               

 616       assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));                                                                                                                                   

 617       hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21U) | \          

 618                                                   hcan->pTxMsg->RTR);                               

 619     }                                                                                               

 620     else                                                                                            

 621     {                                                                                               

 622       assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));                                              

 623       hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3U) | \           

 624                                                   hcan->pTxMsg->IDE | \                             

 625                                                   hcan->pTxMsg->RTR);                               

 626     }                                                                                               

 627                                                                                                     

 628     /* Set up the DLC */                                                                            

 629     hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;                                                       

 630     hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U;                      

 631     hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;                          

 632                                                                                                     

 633     /* Set up the data field */                                                                     

 634     hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) | 

 635                                              ((uint32_t)hcan->pTxMsg->Data[2U] << 16U) |            

 636                                              ((uint32_t)hcan->pTxMsg->Data[1U] << 8U) |             

 637                                              ((uint32_t)hcan->pTxMsg->Data[0U]));                   

 638     hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) | 

 639                                              ((uint32_t)hcan->pTxMsg->Data[6U] << 16U) |            

 640                                              ((uint32_t)hcan->pTxMsg->Data[5U] << 8U) |             

 641                                              ((uint32_t)hcan->pTxMsg->Data[4U]));                   

 642     /* Request transmission */                                                                      

 643     hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;                               

 644                                                                                                     

 645     /* Get tick */                                                                                  

 646     tickstart = HAL_GetTick();                                                                      

 647                                                                                                     

 648     /* Check End of transmission flag */                                                            

 649     while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))                                      

 650     {                                                                                               

 651       /* Check for the Timeout */                                                                   

 652       if(Timeout != HAL_MAX_DELAY)                                                                  

 653       {                                                                                             

 654        if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))

  655        {                                                                                            

 656          hcan->State = HAL_CAN_STATE_TIMEOUT;                                                       

 657                                                                                                     

 658          __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);                                          

 659                                                                                                     

 660          /* Process unlocked */                                                                     

 661          __HAL_UNLOCK(hcan);                                                                        

 662          return HAL_TIMEOUT;                                                                        

 663         }                                                                                           

 664       }                                                                                             

 665     }                                                                                               

 666                                                                                                     

 667     /* Change CAN state */                                                                          

 668     switch(hcan->State)                                                                             

 669     {                                                                                               

 670       case(HAL_CAN_STATE_BUSY_TX_RX0):                                                              

 671           hcan->State = HAL_CAN_STATE_BUSY_RX0;                                                     

 672           break;                                                                                    

 673       case(HAL_CAN_STATE_BUSY_TX_RX1):                                                              

 674           hcan->State = HAL_CAN_STATE_BUSY_RX1;                                                     

 675           break;                                                                                    

 676       case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):                                                          

 677           hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;                                                 

 678           break;                                                                                    

 679       default: /* HAL_CAN_STATE_BUSY_TX */                                                          

 680           hcan->State = HAL_CAN_STATE_READY;                                                        

 681           break;                                                                                    

 682     }                                                                                               

 683                                                                                                     

 684     /* Process unlocked */                                                                          

 685     __HAL_UNLOCK(hcan);                                                                             

 686                                                                                                     

 687     /* Return function status */                                                                    

 688     return HAL_OK;                                                                                                                                                                       

 689   }                                                                                                 

 690   else                                                                                              

 691   {                                                                                                 

 692     /* Change CAN state */                                                                          

 693     hcan->State = HAL_CAN_STATE_ERROR;                                                              

 694                                                                                                     

 695     /* Return function status */                                                                    

 696     return HAL_ERROR;                                                                               

 697   }                                                                                                 

 698 }                            



代码分析: 

1. 检查参数,根据TSR发送状态寄存器,判断可用的发送邮箱的个数,如果有可用邮箱的话就继续往下走,没有的话就报错. 

2. 由小往大选定一个可用的邮箱. 

3. 对邮箱的TIR寄存,标识寄存器器进行配置,主要是ID和发送的帧的数据类型,数据帧还是遥控帧. 

这里写图片描述

4. 将数据的长度放到长度控制和时间戳控制寄存器TDTR 

5. 将8个字节的数据放到邮箱的数据寄存器,分别是TDLR,TDHR,每个寄存器各放4个字节的数据. 

6. 将TIR寄存器的TXRQ置位,请求发送邮箱里面的数据. 

7. 循环等待,CAN_TSR_RQCP(上一次发送成功置位),CAN_TSR_TXOK(邮箱请求完成置位),CAN_TSR_TME(邮箱为空置位)这3个寄存器是否被置位.并且判断整个发送过程中是否超时. 

8. 根据状态返回值.


无阻塞发送

706 HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)                                      

 707 {                                                                                                   

 708   uint32_t  transmitmailbox = CAN_TXSTATUS_NOMAILBOX;                                               

 709                                                                                                     

 710   /* Check the parameters */                                                                        

 711   assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));                                                   

 712   assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));                                                      

 713   assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));                                                      

 714                                                                                                     

 715   if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \                                                                                                                           

 716      ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \                                      

 717      ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))                                          

 718   {                                                                                                 

 719     /* Process Locked */                                                                            

 720     __HAL_LOCK(hcan);                                                                               

 721                                                                                                     

 722     /* Select one empty transmit mailbox */                                                         

 723     if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)                                          

 724     {                                                                                               

 725       transmitmailbox = CAN_TXMAILBOX_0;                                                            

 726     }                                                                                               

 727     else if((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)                                     

 728     {                                                                                               

 729       transmitmailbox = CAN_TXMAILBOX_1;                                                            

 730     }                                                                                               

 731     else                                                                                            

 732     {                                                                                               

 733       transmitmailbox = CAN_TXMAILBOX_2;                                                            

 734     }                                                                                               

 735                                                                                                     

 736     /* Set up the Id */                                                                             

 737     hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;                               

 738     if(hcan->pTxMsg->IDE == CAN_ID_STD)                                                             

 739     {                                                                                               

 740       assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));                                              

 741       hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21U) | \          

 742                                                 hcan->pTxMsg->RTR);                                 

 743     }                                                                                               

 744     else                                                                                            

 745     {                                                                                               

 746       assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));                                              

 747       hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3U) | \           

 748                                                 hcan->pTxMsg->IDE | \                               

 749                                                 hcan->pTxMsg->RTR);                                 

 750     }                                                                                               

 751

  752     /* Set up the DLC */                                                                            

 753     hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;                                                       

 754     hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U;                      

 755     hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;                          

 756                                                                                                     

 757     /* Set up the data field */                                                                                                                                                          

 758     hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) | 

 759                                            ((uint32_t)hcan->pTxMsg->Data[2U] << 16U) |              

 760                                            ((uint32_t)hcan->pTxMsg->Data[1U] << 8U) |               

 761                                            ((uint32_t)hcan->pTxMsg->Data[0U]));                     

 762     hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) | 

 763                                            ((uint32_t)hcan->pTxMsg->Data[6U] << 16U) |              

 764                                            ((uint32_t)hcan->pTxMsg->Data[5U] << 8U) |               

 765                                            ((uint32_t)hcan->pTxMsg->Data[4U]));                     

 766                                                                                                     

 767     /* Change CAN state */                                                                          

 768     switch(hcan->State)                                                                             

 769     {                                                                                               

 770       case(HAL_CAN_STATE_BUSY_RX0):                                                                 

 771           hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;                                                  

 772           break;                                                                                    

 773       case(HAL_CAN_STATE_BUSY_RX1):                                                                 

 774           hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;                                                  

 775           break;                                                                                    

 776       case(HAL_CAN_STATE_BUSY_RX0_RX1):                                                             

 777           hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;                                              

 778           break;                                                                                    

 779       default: /* HAL_CAN_STATE_READY */                                                            

 780           hcan->State = HAL_CAN_STATE_BUSY_TX;                                                      

 781           break;                                                                                    

 782     }                                                                                               

 783                                                                                                     

 784     /* Set CAN error code to none */                                                                

 785     hcan->ErrorCode = HAL_CAN_ERROR_NONE;                                                           

 786                                                                                                     

 787     /* Process Unlocked */                                                                          

 788     __HAL_UNLOCK(hcan);                                                                             

 789                                                                                                     

 790     /* Request transmission */                                                                      

 791     hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;                               

 792

  793     /* Enable Error warning, Error passive, Bus-off,                                                

 794        Last error and Error Interrupts */                                                           

 795     __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG |                                                          

 796                               CAN_IT_EPV |                                                          

 797                               CAN_IT_BOF |                                                          

 798                               CAN_IT_LEC |                                                          

 799                               CAN_IT_ERR |                                                          

 800                               CAN_IT_TME);                                                          

 801   }                                                                                                 

 802   else                                                                                              

 803   {                                                                                                 

 804     /* Change CAN state */                                                                          

 805     hcan->State = HAL_CAN_STATE_ERROR;                                                              

 806                                                                                                     

 807     /* Return function status */                                                                    

 808     return HAL_ERROR;                                                                               

 809   }                                                                                                 

 810                                                                                                     

 811   return HAL_OK;                                                                                                                                                                         

 812 }                                                                                       


代码分析: 

前面1-6的步骤和阻塞是发送都是一样的. 

7. 开启中断 

一帧数据发送完成之后,进入can的中断. 

注意开启的中断:


449 #define CAN_IT_TME                  ((uint32_t)CAN_IER_TMEIE)   /*!< Transmit mailbox empty interrupt */


463 /* Error Interrupts */                                                                                                            

464 #define CAN_IT_EWG                  ((uint32_t)CAN_IER_EWGIE) /*!< Error warning interrupt   */     

465 #define CAN_IT_EPV                  ((uint32_t)CAN_IER_EPVIE) /*!< Error passive interrupt   */     

466 #define CAN_IT_BOF                  ((uint32_t)CAN_IER_BOFIE) /*!< Bus-off interrupt         */     

467 #define CAN_IT_LEC                  ((uint32_t)CAN_IER_LECIE) /*!< Last error code interrupt */     

468 #define CAN_IT_ERR                  ((uint32_t)CAN_IER_ERRIE) /*!< Error Interrupt           */ 


一个发送邮箱空中断,还有5种错误情况引起的中断


1251   if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))                                                     

1252   {                                                                                                 

1253     tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);                                        

1254     tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);                                        

1255     tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);                                                                     

1256     if(tmp1 || tmp2 || tmp3)                                                                                                     

1257     {                                                                                                                            

1258       tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);                                                            

1259       tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);                                              

1260       tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);                                              

1261       /* Check Transmit success */                                                                  

1262       if(tmp1 || tmp2 || tmp3)                                                                      

1263       {                                                                                             

1264         /* Call transmit function */                                                                                             

1265         CAN_Transmit_IT(hcan);                                                                                                   

1266       }                                                                                                                          

1267       else /* Transmit failure */                                                                                                

1268       {                                                                                                                          

1269         /* Set CAN error code to TXFAIL error */                                                                                 

1270         errorcode |= HAL_CAN_ERROR_TXFAIL;                                                                                       

1271       }                                                                                                                          

1272                                                                                                                                  

1273       /* Clear transmission status flags (RQCPx and TXOKx) */                                       

1274       SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \              

1275                                    CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);               

1276     }                                                                                               

1277   }  


其中判断,发送是否完成的代码. 

1. 第一句话还是和之前的一样,读取到三个邮箱的状态,也就是RQCP, TXOK,TME,三个寄存器的状态. 

2. 第二句话就是进一步去判断,TXOK寄存器,检查三个寄存器中是否有发送完成的邮箱. 

 


这里写图片描述 
这里写图片描述

具体的判断逻辑如上所示,也就是去检查TSR这个寄存器的第1,9,11位来判断是否发送完成.如果发送完成就可去调用CAN_Transmit_IT,在这个里面主要是关中断,再调用用户的回调函数. 

3. 清掉RQCP, TXOK寄存器的标志位


题外话: 

公司的代码,移植的是can的驱动代码,里面有一句话让我觉得很奇怪:


    if(HAL_CAN_Transmit(&g_sCAN_Handler[dwDevice], 10) != HAL_OK)

    {//注:如果发送中断使能,因在发送中断里会清相关标志,这样会导致此函数会超时,而发送实际是成功的

        return FALSE; 

    }


为什么会有这样一句奇怪的注释,这里使用的阻塞的方式发送数据,那么计算超时的时候就会检查RQCP, TXOK,这两个位用来判断是否发送完成。但是在hal库里面没有发送时中断是关掉了,根本就不会在中断里面清掉标志位,根本就不存在这个问题。当我们使用中断的方式发送时, 又不会进行超时判断。因此只有在使用不规范的时候才会出现这个问题,因此这句注释就是无稽之谈。


关键字:stm32  HAL库  CAN 引用地址:stm32 HAL库分析之CAN

上一篇:stm32踩内存的问题
下一篇:stm32 hal库分析之uart

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

Canalys:小米销量同比增长9%表现最好,华为海外出货暴跌35%
北京时间5月1日上午消息,市场研究公司Canalys周五发布报告称,新冠病毒疫情对2020年第一季度的全球智能手机市场造成了严重影响,出货量同比下降13%,至2.72亿部。 根据Canalys的报告,第一季度三星重新成为市场第一,但出货量同比下滑17%,至6000万部。华为的出货量为4900万部,同比下降17%。该公司正继续从海外市场向中国市场转移。苹果排名第三,出货量同比下滑8%,至3700万部。前五名中表现最好的是小米,排名第四,销量同比增长9%,达到3000万部。Vivo排名第五,销量为2400万部,同比增长3%。 在进入2020年之初,全球智能手机市场表现良好,此前已连续两个季度实现增长。Canalys高级分析师本·斯
[手机便携]
<font color='red'>Can</font>alys:小米销量同比增长9%表现最好,华为海外出货暴跌35%
CAN现场总线的计算机与PLC通信
    1 引言   在现代工业中,PLC 之间或PLC 与计算机之间的通信联网应用日益广泛。PLC 的联网功能越来越强。以欧姆龙CP1、CJ1 和CS1 系列PLC 为例,配合使用各种模块,可以支持工业以太网、Controller Link 等现场总线通信联网功能。但是,应用广泛的CPM1A、CPM2A等中小型PLC 的通信联网一般只能采用工业总线的物理层形式(如RS232 或RS485),通信的稳定性与抗干扰能力并不是很强。   本文选用欧姆龙的CPM2A 机型,配合使用RS232-CAN 适配器,实现了计算机与PLC 的通信联网,方法简单, 实用性强。   2 CAN 总线简介   CAN 总线由德国BOSCH 公
[嵌入式]
STM32单片机 GPIO寄存器
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。 数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端
[单片机]
stm32启动文件详解及SystemInit函数分析
;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 ;然后在RAM中分配变量使用的堆 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配 ;分配完成后,再定义和实现相应的中断函数, ;所有的中断函数全部带有 特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。 ;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称 ;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后, ;从0x0800_0000处取出栈顶地址存放于M
[单片机]
stm32的TIM定时器HAL库函数的使用
相关具体内容参考 stm32f4xx_hal_time.h 几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。 /****** xxx使用上述几种模式的英文替换即可*******/ HAL_TIM_xxx_Init HAL_TIM_xxx_DeInit HAL_TIM_xxx_MspInit HAL_TIM_xxx_MspDeInit /***轮询方式启动/停止/ HAL_TIM_xxx_Start HAL_TIM_xxx_Stop /***中断方式启动/停止/ HAL_TIM_xxx_Start_IT HAL_TIM
[单片机]
关于STM32与SD卡通信的一些理解
SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是STM32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的.c
[单片机]
嵌入式系统的CAN总线设计
  CAN总线概述   CAN(Controller Area Network)总线即控制器局域网络,是现场总线之一,由德国Bosch公司为汽车的监测、控制系统而设计的总线式串行通讯网络,适合于工业过程控制设备和监控设备之间的互联。是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。主要应用于汽车电控制系统、电梯控制系统、安全监控系统、医疗仪器、纺织机械、船舶运输等方面。CAN具有下下列主要特性:①低成本;②远距离传输(长达lOKm);③高速的数据传输速率(高达1Mbit/s);④可根据报文的ID决定接收或屏蔽该报文;⑤可靠的错误处理和检错机制;⑥发送的信息遭到破坏后,可自动重发
[嵌入式]
基于MCP2502X/05X的CAN总线节点设计
1 引言     CAN总线以其成本低廉、通信实时性好、纠错能力强等优点广泛应用于汽车工业、电力系统变电站自动化、智能大厦等系统。J1939协议是SEA于1998年提出的,主要应用于运输、农林机车、船舶等大型交通工具。Microchip公司推出的MCP2502X/2505X CAN I/O系列扩展器可独立作为CAN扩展节点,通过配置实现不同的CAN协议。本文以J1939为通信协议,基于该器件设计CAN扩展节点,方便实现汽车的前端测控功能,并且与整个车载CAN网络相连。 2 MCP2502X/05X CAN I/O扩展器简介     MCP2502X/5X器件可作为CAN系统的I/O扩展器使用,支持CANV2.0B Active
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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