久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4718|回復: 4
打印 上一主題 下一主題
收起左側

STM32源碼 PC機通過CAN總線采用主從方式采集總線上的多塊MINI板

[復制鏈接]
跳轉到指定樓層
樓主
stm32F1高級例程-PC機通過CAN總線采用主從方式采集總線上的多塊MINI板



用MINI板實現CAN轉RS232 用于跟PC機串口連接(主從方式)

單片機源程序如下:
  1. /******************** 浩普電子工作室 ********************
  2. * 文件名  :main.c
  3. * 描述    :通過CAN總線采用主從方式采集總線上的兩個板子        

  4. * 庫版本  :ST3.0.0                                                                                                                                                           
  5. *********************************************************/
  6. #include "stm32f10x.h"
  7. #include "can.h"
  8. #include "led.h"
  9. #include "usart1.h"




  10. int main(void)
  11. {  
  12.           u8 i=0;
  13.          SystemInit(); //設置系統時鐘為72M           
  14.          LED_GPIO_Config();//LED管腳初始化                 
  15.     CAN_GPIO_Config();//CAN管腳初始化
  16.         USART1_Config();//USART1管腳初始化        
  17.         CAN_NVIC_Configuration(); //CAN中斷初始化   
  18.         CAN_INIT();//CAN初始化N模塊        
  19.     printf("-------------------------------操作說明-------------------------------\r\n");         
  20.         printf("-------在發送欄輸入十六進制”11”,發送出去,可讀取ID為0x11板子的采集數據------\r\n");         
  21.         printf("-------在發送欄輸入十六進制“22”,發送出去,可讀取ID為0x22板子的采集數據------\r\n");         
  22.          while(1)
  23.     {
  24.           while(UART1GetByte(&i))
  25.         {
  26.           can_tx(i,0x55);
  27.         }      
  28.            
  29.           }
  30. }
復制代碼
  1. /******************** 浩普電子工作室 ********************
  2. * 文件名  :can.c
  3. * 描述    :CAN測試應用函數庫。         
  4. * 實驗平臺:MINI STM32開發板 基于STM32F103VET6
  5. * 硬件連接:-----------------
  6. *          |                                   |
  7.             |  PB8-CAN-RX     |
  8. *          |  PB9-CAN-TX     |
  9. *          |                 |
  10. *           -----------------
  11. * 庫版本  :ST3.0.0                                                                                                                                                                  
  12. *********************************************************/
  13. #include "can.h"
  14. #include "led.h"
  15. #include "usart1.h"
  16. #include "stdio.h"

  17. #define digitalToggle(p,i)                {p->ODR ^=i;}                        //輸出反轉狀態
  18. /* 定義控制IO的宏 */
  19. #define LED1_TOGGLE                digitalToggle(GPIOB,GPIO_Pin_14)

  20. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

  21. /* 在中斷處理函數中返回 */
  22. __IO uint32_t ret = 0;

  23. volatile TestStatus TestRx;        

  24. /*CAN RX0 中斷優先級配置  */
  25. void CAN_NVIC_Configuration(void)
  26. {
  27.     NVIC_InitTypeDef NVIC_InitStructure;

  28.           /* Configure the NVIC Preemption Priority Bits */  
  29.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  30.         #ifdef  VECT_TAB_RAM  
  31.           /* Set the Vector Table base location at 0x20000000 */
  32.           NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  33.         #else  /* VECT_TAB_FLASH  */
  34.           /* Set the Vector Table base location at 0x08000000 */
  35.           NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  36.         #endif

  37.         /* enabling interrupt */
  38.           NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
  39.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  40.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  41.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  42.           NVIC_Init(&NVIC_InitStructure);
  43. }

  44. /*CAN GPIO 和時鐘配置 */
  45. void CAN_GPIO_Config(void)
  46. {
  47.   GPIO_InitTypeDef GPIO_InitStructure;
  48.   /* 復用功能和GPIOB端口時鐘使能*/         
  49.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                        

  50.   /* CAN1 模塊時鐘使能 */
  51.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  52.   /* Configure CAN pin: RX */         // PB8
  53.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉輸入
  55.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  56.   
  57.   /* Configure CAN pin: TX */   // PB9
  58.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  59.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
  60.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  61.   
  62.         //#define GPIO_Remap_CAN    GPIO_Remap1_CAN1 本實驗沒有用到重映射I/O
  63.   GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);

  64.   
  65. }

  66. /*        CAN初始化 */
  67. void CAN_INIT(void)
  68. {
  69.   CAN_InitTypeDef        CAN_InitStructure;
  70.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  71.   CanTxMsg TxMessage;  

  72.   /* CAN register init */
  73.   CAN_DeInit(CAN1);        //將外設CAN的全部寄存器重設為缺省值
  74.   CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一個參數按缺省值填入

  75.   /* CAN cell init */
  76.   CAN_InitStructure.CAN_TTCM=DISABLE;//沒有使能時間觸發模式
  77.   CAN_InitStructure.CAN_ABOM=DISABLE;//沒有使能自動離線管理
  78.   CAN_InitStructure.CAN_AWUM=DISABLE;//沒有使能自動喚醒模式
  79.   CAN_InitStructure.CAN_NART=DISABLE;//沒有使能非自動重傳模式
  80.   CAN_InitStructure.CAN_RFLM=DISABLE;//沒有使能接收FIFO鎖定模式
  81.   CAN_InitStructure.CAN_TXFP=DISABLE;//沒有使能發送FIFO優先級
  82.   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN設置為正常模式
  83.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳躍寬度1個時間單位
  84.   CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //時間段1為3個時間單位
  85.   CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //時間段2為2個時間單位
  86.   CAN_InitStructure.CAN_Prescaler=60;  //時間單位長度為60        
  87.   CAN_Init(CAN1,&CAN_InitStructure);
  88.                                       //波特率為:72M/2/60(1+3+2)=0.1 即100K

  89.   /* CAN filter init */
  90.   CAN_FilterInitStructure.CAN_FilterNumber=1;//指定過濾器為1
  91.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定過濾器為標識符屏蔽位模式
  92.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//過濾器位寬為32位
  93.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 過濾器標識符的高16位值
  94.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//         過濾器標識符的低16位值
  95.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//過濾器屏蔽標識符的高16位值
  96.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//        過濾器屏蔽標識符的低16位值
  97.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 設定了指向過濾器的FIFO為0
  98.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能過濾器
  99.   CAN_FilterInit(&CAN_FilterInitStructure);//        按上面的參數初始化過濾器

  100.   /* CAN FIFO0 message pending interrupt enable */
  101. CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息掛號中斷

  102. }  
  103. /* 發送兩個字節的數據*/
  104. void can_tx(u8 BANID,u8 Data)
  105. {
  106.   CanTxMsg TxMessage;  

  107.   TxMessage.StdId=BANID;        //標準標識符為0x00
  108.   TxMessage.ExtId=0x0000; //擴展標識符0x0000
  109.   TxMessage.IDE=CAN_ID_STD;//使用標準標識符
  110.   TxMessage.RTR=CAN_RTR_DATA;//為數據幀
  111.   TxMessage.DLC=8;        //        消息的數據長度為2個字節
  112.   TxMessage.Data[0]=Data; //第一個字節數據  
  113.   CAN_Transmit(CAN1,&TxMessage); //發送數據
  114.   

  115. }
  116. /* USB中斷和CAN接收中斷服務程序,USB跟CAN公用I/O,這里只用到CAN的中斷。 */
  117. void USB_LP_CAN1_RX0_IRQHandler(void)
  118. {        
  119.   
  120.   CanRxMsg RxMessage;
  121.   u32 AD_value1=0;
  122.   u32 AD_value2=0;
  123.   u32 AD_value3=0;
  124.   u32 AD_value4=0;

  125.   RxMessage.StdId=0x00;
  126.   RxMessage.ExtId=0x00;
  127.   RxMessage.IDE=0;
  128.   RxMessage.DLC=0;
  129.   RxMessage.FMI=0;
  130.   RxMessage.Data[0]=0x00;
  131.   RxMessage.Data[1]=0x00;
  132.    
  133.   LED1_TOGGLE;
  134.   CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的數據
  135.   
  136.    AD_value1=RxMessage.Data[0]*256+        RxMessage.Data[1];
  137.    AD_value2=RxMessage.Data[2]*256+        RxMessage.Data[3];
  138.    AD_value3=RxMessage.Data[4]*256+        RxMessage.Data[5];
  139.    AD_value4=RxMessage.Data[6]*256+        RxMessage.Data[7];
  140.    
  141.    printf("*****地址為:0x%02X的四通道電壓采集**********\r\n",RxMessage.StdId);
  142.    printf("通道1電壓: %d mV  \r\n", AD_value1);
  143.    printf("通道2電壓: %d mV  \r\n", AD_value2);
  144.    printf("通道3電壓: %d mV  \r\n", AD_value3);
  145.    printf("通道4電壓: %d mV  \r\n", AD_value4);
  146.    printf("******************************************** \r\n");   
  147.   
  148.   
  149. }
復制代碼


所有資料51hei提供下載:
高級例程-PC機通過CAN總線采用主從方式采集總線上的多塊MINI板.rar (848.98 KB, 下載次數: 115)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:87448 發表于 2018-12-12 18:14 | 只看該作者
感謝樓主分享!!!!
回復

使用道具 舉報

板凳
ID:422626 發表于 2018-12-20 21:41 | 只看該作者
謝謝分享,幫助很大
回復

使用道具 舉報

地板
ID:599974 發表于 2019-8-24 13:49 | 只看該作者
感謝分享,標記一下
回復

使用道具 舉報

5#
ID:444278 發表于 2020-4-10 09:44 | 只看該作者
感謝樓主分享,很有用
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区视频免费观看 | 天天色综 | 国产目拍亚洲精品99久久精品 | 日韩一区二区三区视频在线播放 | 羞视频在线观看 | 国产一级视频在线 | 亚洲综合在线视频 | www.99re5.com| 在线不卡视频 | 亚洲精品福利视频 | 欧美精品一二三 | 手机日韩 | 日韩免费中文字幕 | 人成在线视频 | 淫片一级国产 | 中文字幕一区二区三区四区五区 | 美日韩免费| 久久久久久亚洲精品 | 亚洲成人精品 | 成人午夜激情 | 久久一区二区av | 成人午夜| 精品一区二区电影 | 欧美乱淫视频 | 国产精品三级 | 91电影在线播放 | 日本电影免费完整观看 | 日韩一区二区三区在线视频 | 99精品电影 | 亚洲免费高清 | 国产精品日产欧美久久久久 | 99久久久国产精品免费消防器 | 在线亚州 | 国产精品精品视频一区二区三区 | 一级免费毛片 | 成人毛片视频在线播放 | 一本一道久久a久久精品综合 | 亚洲一区二区三区免费观看 | 天天拍天天操 | 性视频一区 | 国产欧美一区二区三区日本久久久 |