亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? can.c

?? STM32F103 cortex-m3 can總線例程
?? C
字號:
/*----------------------------------------------------------------------------
 * Name:    Can.c
 * Purpose: CAN interface for STM32
 * Version: V1.00
 *----------------------------------------------------------------------------
 * This file is part of the uVision/ARM development tools.
 * This software may only be used under the terms of a valid, current,
 * end user licence from KEIL for a compatible version of KEIL software
 * development tools. Nothing else gives you the right to use this software.
 *
 * Copyright (c) 2005-2007 Keil Software. All rights reserved.
 *----------------------------------------------------------------------------*/

#include <stm32f10x_lib.h>                        // STM32F10x Library Definitions
#include "STM32_Reg.h"                            // STM32 register and bit Definitions
#include "STM32_Init.h"                           // STM32 Initialization
#include "CAN.h"                                  // STM32 CAN adaption layer

CAN_msg       CAN_TxMsg;                          // CAN messge for sending
CAN_msg       CAN_RxMsg;                          // CAN message for receiving                                

unsigned int  CAN_TxRdy = 0;                      // CAN HW ready to transmit a message
unsigned int  CAN_RxRdy = 0;                      // CAN HW received a message

/*----------------------------------------------------------------------------
  setup CAN interface
 *----------------------------------------------------------------------------*/
void CAN_setup (void)  {
  unsigned int brp = stm32_GetPCLK1();

  RCC->APB1ENR |= RCC_APB1ENR_CANEN;              // enable clock for CAN

                                                  // Note: MCBSTM32 uses PB8 and PB9 for CAN
  RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;             // enable clock for Alternate Function
  AFIO->MAPR   &= 0xFFFF9FFF;                     // reset CAN remap
  AFIO->MAPR   |= 0x00004000;                     //   set CAN remap, use PB8, PB9
												  
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;             // enable clock for GPIO B
  GPIOB->CRH &= ~(0x0F<<0);
  GPIOB->CRH |=  (0x08<<0);                       // CAN RX pin PB.8 input push pull 
  
  GPIOB->CRH &= ~(0x0F<<4);
  GPIOB->CRH |=  (0x0B<<4);                       // CAN TX pin PB.9 alternate output push pull 

  NVIC->Enable[0] |= (1 << (USB_HP_CAN_TX_IRQChannel  & 0x1F));// enable interrupt
  NVIC->Enable[0] |= (1 << (USB_LP_CAN_RX0_IRQChannel & 0x1F));// enable interrupt

  CAN->MCR = (CAN_MCR_NART | CAN_MCR_INRQ);       // init mode, disable auto. retransmission
                                                  // Note: only FIFO 0, transmit mailbox 0 used
  CAN->IER = (CAN_IER_FMPIE0 | CAN_IER_TMEIE);    // FIFO 0 msg pending, Transmit mbx empty

  /* Note: this calculations fit for PCLK1 = 36MHz */
  brp  = (brp / 18) / 500000;                     // baudrate is set to 500k bit/s
                                                                          
  /* set BTR register so that sample point is at about 72% bit time from bit start */
  /* TSEG1 = 12, TSEG2 = 5, SJW = 4 => 1 CAN bit = 18 TQ, sample at 72%    */
  CAN->BTR &= ~(((        0x03) << 24) | ((        0x07) << 20) | ((         0x0F) << 16) | (          0x1FF)); 
  CAN->BTR |=  ((((4-1) & 0x03) << 24) | (((5-1) & 0x07) << 20) | (((12-1) & 0x0F) << 16) | ((brp-1) & 0x1FF));
}


/*----------------------------------------------------------------------------
  leave initialisation mode
 *----------------------------------------------------------------------------*/
void CAN_start (void)  {

  CAN->MCR &= ~CAN_MCR_INRQ;                      // normal operating mode, reset INRQ
  while (CAN->MSR & CAN_MCR_INRQ);

}

/*----------------------------------------------------------------------------
  set the testmode
 *----------------------------------------------------------------------------*/
void CAN_testmode (unsigned int testmode) {

  CAN->BTR &= ~(CAN_BTR_SILM | CAN_BTR_LBKM);     // set testmode
  CAN->BTR |=  (testmode & (CAN_BTR_SILM | CAN_BTR_LBKM));
}

/*----------------------------------------------------------------------------
  check if transmit mailbox is empty
 *----------------------------------------------------------------------------*/
void CAN_waitReady (void)  {

  while ((CAN->TSR & CAN_TSR_TME0) == 0);         // Transmit mailbox 0 is empty
  CAN_TxRdy = 1;
 
}

/*----------------------------------------------------------------------------
  wite a message to CAN peripheral and transmit it
 *----------------------------------------------------------------------------*/
void CAN_wrMsg (CAN_msg *msg)  {

  CAN->sTxMailBox[0].TIR  = (unsigned int)0;      // Reset TIR register
                                                  // Setup identifier information
  if (msg->format == STANDARD_FORMAT)  {          //    Standard ID
      CAN->sTxMailBox[0].TIR |= (unsigned int)(msg->id << 21) | CAN_ID_STD;
  }  else  {                                      // Extended ID
      CAN->sTxMailBox[0].TIR |= (unsigned int)(msg->id <<  3) | CAN_ID_EXT;
  }
                                                  // Setup type information
  if (msg->type == DATA_FRAME)  {                 // DATA FRAME
      CAN->sTxMailBox[0].TIR |= CAN_RTR_DATA;
  }
  else {                                          // REMOTE FRAME
      CAN->sTxMailBox[0].TIR |= CAN_RTR_REMOTE;
  }
                                                  // Setup data bytes
  CAN->sTxMailBox[0].TDLR = (((unsigned int)msg->data[3] << 24) | 
                             ((unsigned int)msg->data[2] << 16) |
                             ((unsigned int)msg->data[1] <<  8) | 
                             ((unsigned int)msg->data[0])        );
  CAN->sTxMailBox[0].TDHR = (((unsigned int)msg->data[7] << 24) | 
                             ((unsigned int)msg->data[6] << 16) |
                             ((unsigned int)msg->data[5] <<  8) |
                             ((unsigned int)msg->data[4])        );
                                                  // Setup length
  CAN->sTxMailBox[0].TDTR &= ~CAN_TDTxR_DLC;
  CAN->sTxMailBox[0].TDTR |=  (msg->len & CAN_TDTxR_DLC);

  CAN->IER |= CAN_IER_TMEIE;                      // enable  TME interrupt 
  CAN->sTxMailBox[0].TIR |=  CAN_TIxR_TXRQ;       // transmit message
}

/*----------------------------------------------------------------------------
  read a message from CAN peripheral and release it
 *----------------------------------------------------------------------------*/
void CAN_rdMsg (CAN_msg *msg)  {
                                                  // Read identifier information
  if ((CAN->sFIFOMailBox[0].RIR & CAN_ID_EXT) == 0) { // Standard ID
    msg->format = STANDARD_FORMAT;
    msg->id     = (u32)0x000007FF & (CAN->sFIFOMailBox[0].RIR >> 21);
  }  else  {                                          // Extended ID
    msg->format = EXTENDED_FORMAT;
    msg->id     = (u32)0x0003FFFF & (CAN->sFIFOMailBox[0].RIR >> 3);
  }
                                                  // Read type information
  if ((CAN->sFIFOMailBox[0].RIR & CAN_RTR_REMOTE) == 0) {
    msg->type =   DATA_FRAME;                     // DATA   FRAME
  }  else  {
    msg->type = REMOTE_FRAME;                     // REMOTE FRAME
  }
                                                  // Read length (number of received bytes)
  msg->len = (unsigned char)0x0000000F & CAN->sFIFOMailBox[0].RDTR;
                                                  // Read data bytes
  msg->data[0] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR);
  msg->data[1] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 8);
  msg->data[2] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 16);
  msg->data[3] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 24);

  msg->data[4] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR);
  msg->data[5] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 8);
  msg->data[6] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 16);
  msg->data[7] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 24);

  CAN->RF0R |= CAN_RF0R_RFOM0;                    // Release FIFO 0 output mailbox
}


void CAN_wrFilter (unsigned int id, unsigned char format)  {
  static unsigned short CAN_filterIdx = 0;
         unsigned int   CAN_msgId     = 0;
  
  if (CAN_filterIdx > 13) {                       // check if Filter Memory is full
    return;
  }
                                                  // Setup identifier information
  if (format == STANDARD_FORMAT)  {               // Standard ID
      CAN_msgId  |= (unsigned int)(id << 21) | CAN_ID_STD;
  }  else  {                                      // Extended ID
      CAN_msgId  |= (unsigned int)(id <<  3) | CAN_ID_EXT;
  }

  CAN->FMR  |=  CAN_FMR_FINIT;                    // set Initialisation mode for filter banks
  CAN->FA0R &=  ~(unsigned int)(1 << CAN_filterIdx); // deactivate filter

                                                  // initialize filter   
  CAN->FS0R |= (unsigned int)(1 << CAN_filterIdx);// set 32-bit scale configuration
  CAN->FM0R |= (unsigned int)(1 << CAN_filterIdx);// set 2 32-bit identifier list mode

  CAN->sFilterRegister[CAN_filterIdx].FR0 = CAN_msgId; //  32-bit identifier
  CAN->sFilterRegister[CAN_filterIdx].FR1 = CAN_msgId; //  32-bit identifier
    													   
  CAN->FFA0R &= ~(unsigned int)(1 << CAN_filterIdx);  // assign filter to FIFO 0
  CAN->FA0R  |=  (unsigned int)(1 << CAN_filterIdx);  // activate filter

  CAN->FMR &= ~CAN_FMR_FINIT;                     // reset Initialisation mode for filter banks

  CAN_filterIdx += 1;                             // increase filter index
}

/*----------------------------------------------------------------------------
  CAN transmit interrupt handler
 *----------------------------------------------------------------------------*/
void USB_HP_CAN_TX_IRQHandler (void) {

  if (CAN->TSR & CAN_TSR_RQCP0) {                 // request completed mbx 0
    CAN->TSR |= CAN_TSR_RQCP0;                    // reset request complete mbx 0
    CAN->IER &= ~CAN_IER_TMEIE;                   // disable  TME interrupt
	
	CAN_TxRdy = 1; 
  }
}

/*----------------------------------------------------------------------------
  CAN receive interrupt handler
 *----------------------------------------------------------------------------*/
void USB_LP_CAN_RX0_IRQHandler (void) {

  if (CAN->RF0R & CAN_RF0R_FMP0) {			      // message pending ?
	CAN_rdMsg (&CAN_RxMsg);                       // read the message

    CAN_RxRdy = 1;                                // set receive flag
  }
}


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91高清视频免费看| 国产精品久久久久久久第一福利| 国产成人精品亚洲日本在线桃色| 欧美国产一区在线| 日韩你懂的在线观看| 波多野洁衣一区| 麻豆精品蜜桃视频网站| 亚洲精品视频自拍| 欧美国产日韩在线观看| 日韩欧美在线1卡| 在线视频欧美区| 岛国一区二区三区| 久久97超碰国产精品超碰| 亚洲高清在线精品| 亚洲欧美日韩久久| 国产精品三级久久久久三级| 日韩欧美另类在线| 在线不卡欧美精品一区二区三区| 色综合天天视频在线观看 | 91丨porny丨首页| 免费看黄色91| 午夜精品久久久久久久| 亚洲精品国产精华液| 欧美极品少妇xxxxⅹ高跟鞋 | 91福利资源站| 成人av在线资源网站| 国产成人一区在线| 国产一区二区三区四| 精品一二线国产| 久久99精品国产91久久来源| 日本成人中文字幕在线视频| 亚洲国产三级在线| 亚洲国产人成综合网站| 夜夜亚洲天天久久| 一区二区三区视频在线看| 亚洲精品国产一区二区精华液| 亚洲视频综合在线| 亚洲免费av高清| 亚洲天堂久久久久久久| 中文字幕一区二区三中文字幕| 国产精品―色哟哟| 综合av第一页| 亚洲一区二区精品3399| 亚洲成av人影院| 午夜成人在线视频| 免费观看在线综合| 国产一区二区三区在线观看免费| 国产乱淫av一区二区三区| 粗大黑人巨茎大战欧美成人| hitomi一区二区三区精品| 99久久国产综合精品色伊| 在线免费不卡视频| 欧美日韩视频一区二区| 欧美一区二区三区四区五区| 日韩欧美黄色影院| 中文字幕免费在线观看视频一区| 国产精品麻豆久久久| 亚洲精品国产无套在线观 | 大桥未久av一区二区三区中文| 不卡一卡二卡三乱码免费网站| 91看片淫黄大片一级| 欧美日韩视频在线第一区| 日韩一卡二卡三卡国产欧美| 欧美精品一区二区三区在线播放| 欧美高清在线视频| 一区二区三区.www| 蜜臀av国产精品久久久久| 国产一区不卡视频| 91丨九色丨蝌蚪丨老版| 欧美日韩免费电影| 久久亚洲影视婷婷| 一区二区三区欧美在线观看| 男人的j进女人的j一区| 国产超碰在线一区| 在线观看91视频| 精品嫩草影院久久| 136国产福利精品导航| 天天影视网天天综合色在线播放| 国产在线视频精品一区| 91麻豆福利精品推荐| 欧美日韩国产成人在线免费| 国产亚洲一二三区| 一区二区三区日韩精品视频| 久久99热这里只有精品| aaa欧美大片| 欧美成人r级一区二区三区| 国产精品青草综合久久久久99| 亚洲444eee在线观看| 丰满少妇久久久久久久| 欧美日韩一区二区三区高清| 国产日韩影视精品| 天堂蜜桃91精品| 成人免费高清视频在线观看| 欧美一区二区三区不卡| 亚洲三级在线免费观看| 国产精品影视在线观看| 在线播放日韩导航| 中文字幕日韩一区| 国产一区二三区| 这里只有精品视频在线观看| 综合色中文字幕| 国产高清精品久久久久| 91麻豆精品国产91| 亚洲精品美腿丝袜| 成人精品视频一区| 精品国产成人在线影院| 五月天精品一区二区三区| 色999日韩国产欧美一区二区| 久久久国产午夜精品| 久久精品欧美一区二区三区麻豆| 偷拍一区二区三区四区| 欧美在线三级电影| 最新高清无码专区| 国产成人8x视频一区二区| 国产午夜精品久久久久久免费视| 日本亚洲一区二区| 欧美三级在线播放| 一区二区三区精品在线| 99久久婷婷国产综合精品| 国产日本欧洲亚洲| 国产麻豆精品95视频| 精品国产一区二区精华| 美女任你摸久久| 日韩一区二区三区电影在线观看| 亚洲国产你懂的| 精品视频1区2区| 亚洲曰韩产成在线| 欧美在线free| 午夜精品久久久久久久久久久 | 色综合网站在线| 136国产福利精品导航| 成人黄色免费短视频| 中文字幕免费不卡在线| 福利电影一区二区三区| 亚洲国产精品二十页| 国产suv精品一区二区三区| 国产午夜亚洲精品理论片色戒 | 国产裸体歌舞团一区二区| 精品久久久久一区二区国产| 麻豆精品精品国产自在97香蕉| 日韩一区二区三区高清免费看看| 奇米一区二区三区| 欧美变态口味重另类| 国产麻豆精品视频| 国产精品久久久久一区 | 欧美日韩高清一区二区| 丝袜美腿亚洲色图| 欧美一二三区在线| 国产老肥熟一区二区三区| 亚洲国产精品高清| 色噜噜狠狠成人网p站| 视频一区视频二区在线观看| 91精品婷婷国产综合久久性色| 免费观看91视频大全| 久久―日本道色综合久久| 国产精品综合一区二区| 亚洲欧洲成人精品av97| 欧美网站一区二区| 久久99久国产精品黄毛片色诱| 久久久91精品国产一区二区精品| 成人a免费在线看| 亚洲综合色区另类av| 欧美一区二区福利在线| 粉嫩一区二区三区性色av| 国产又黄又大久久| 亚洲视频精选在线| 88在线观看91蜜桃国自产| 久久www免费人成看片高清| 国产精品久久久久久久久快鸭| 欧美亚一区二区| 激情综合色播激情啊| 国产精品久久久久久久久果冻传媒| 在线观看免费亚洲| 精品一区二区三区在线播放 | 亚洲一区在线视频| 日韩精品中午字幕| 91麻豆蜜桃一区二区三区| 免费精品视频在线| 综合色中文字幕| 精品毛片乱码1区2区3区| a亚洲天堂av| 美日韩一区二区三区| 中文字幕在线不卡一区| 9191精品国产综合久久久久久| 成人在线视频一区| 丝袜亚洲另类丝袜在线| 国产精品女主播av| 日韩一区二区三区三四区视频在线观看| 国产成人综合在线观看| 日韩中文字幕1| 国产精品另类一区| 日韩欧美在线综合网| 色婷婷久久久综合中文字幕| 激情五月婷婷综合| 丝袜美腿亚洲一区| 亚洲欧美激情在线| 26uuu精品一区二区| 欧美日韩一区二区三区不卡| 波多野结衣亚洲| 黄色日韩三级电影|