stm32F1高級例程-PC機通過CAN總線采用主從方式采集總線上的多塊MINI板
MINI STM32板的總線通訊連接示意圖.jpg (157.4 KB, 下載次數: 52)
下載附件
2018-11-17 01:43 上傳
演示截圖.jpg (309.07 KB, 下載次數: 56)
下載附件
2018-11-17 01:43 上傳
用MINI板實現CAN轉RS232 用于跟PC機串口連接(主從方式)
單片機源程序如下:
- /******************** 浩普電子工作室 ********************
- * 文件名 :main.c
- * 描述 :通過CAN總線采用主從方式采集總線上的兩個板子
-
- * 庫版本 :ST3.0.0
- *********************************************************/
- #include "stm32f10x.h"
- #include "can.h"
- #include "led.h"
- #include "usart1.h"
- int main(void)
- {
- u8 i=0;
- SystemInit(); //設置系統時鐘為72M
- LED_GPIO_Config();//LED管腳初始化
- CAN_GPIO_Config();//CAN管腳初始化
- USART1_Config();//USART1管腳初始化
- CAN_NVIC_Configuration(); //CAN中斷初始化
- CAN_INIT();//CAN初始化N模塊
- printf("-------------------------------操作說明-------------------------------\r\n");
- printf("-------在發送欄輸入十六進制”11”,發送出去,可讀取ID為0x11板子的采集數據------\r\n");
- printf("-------在發送欄輸入十六進制“22”,發送出去,可讀取ID為0x22板子的采集數據------\r\n");
- while(1)
- {
- while(UART1GetByte(&i))
- {
- can_tx(i,0x55);
- }
-
- }
- }
復制代碼- /******************** 浩普電子工作室 ********************
- * 文件名 :can.c
- * 描述 :CAN測試應用函數庫。
- * 實驗平臺:MINI STM32開發板 基于STM32F103VET6
- * 硬件連接:-----------------
- * | |
- | PB8-CAN-RX |
- * | PB9-CAN-TX |
- * | |
- * -----------------
- * 庫版本 :ST3.0.0
- *********************************************************/
- #include "can.h"
- #include "led.h"
- #include "usart1.h"
- #include "stdio.h"
- #define digitalToggle(p,i) {p->ODR ^=i;} //輸出反轉狀態
- /* 定義控制IO的宏 */
- #define LED1_TOGGLE digitalToggle(GPIOB,GPIO_Pin_14)
- typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
- /* 在中斷處理函數中返回 */
- __IO uint32_t ret = 0;
- volatile TestStatus TestRx;
- /*CAN RX0 中斷優先級配置 */
- void CAN_NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Configure the NVIC Preemption Priority Bits */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
- #ifdef VECT_TAB_RAM
- /* Set the Vector Table base location at 0x20000000 */
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
- #else /* VECT_TAB_FLASH */
- /* Set the Vector Table base location at 0x08000000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- #endif
- /* enabling interrupt */
- NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /*CAN GPIO 和時鐘配置 */
- void CAN_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* 復用功能和GPIOB端口時鐘使能*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
- /* CAN1 模塊時鐘使能 */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
- /* Configure CAN pin: RX */ // PB8
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- /* Configure CAN pin: TX */ // PB9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- //#define GPIO_Remap_CAN GPIO_Remap1_CAN1 本實驗沒有用到重映射I/O
- GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
-
- }
- /* CAN初始化 */
- void CAN_INIT(void)
- {
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- CanTxMsg TxMessage;
- /* CAN register init */
- CAN_DeInit(CAN1); //將外設CAN的全部寄存器重設為缺省值
- CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一個參數按缺省值填入
- /* CAN cell init */
- CAN_InitStructure.CAN_TTCM=DISABLE;//沒有使能時間觸發模式
- CAN_InitStructure.CAN_ABOM=DISABLE;//沒有使能自動離線管理
- CAN_InitStructure.CAN_AWUM=DISABLE;//沒有使能自動喚醒模式
- CAN_InitStructure.CAN_NART=DISABLE;//沒有使能非自動重傳模式
- CAN_InitStructure.CAN_RFLM=DISABLE;//沒有使能接收FIFO鎖定模式
- CAN_InitStructure.CAN_TXFP=DISABLE;//沒有使能發送FIFO優先級
- CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN設置為正常模式
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳躍寬度1個時間單位
- CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //時間段1為3個時間單位
- CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //時間段2為2個時間單位
- CAN_InitStructure.CAN_Prescaler=60; //時間單位長度為60
- CAN_Init(CAN1,&CAN_InitStructure);
- //波特率為:72M/2/60(1+3+2)=0.1 即100K
- /* CAN filter init */
- CAN_FilterInitStructure.CAN_FilterNumber=1;//指定過濾器為1
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定過濾器為標識符屏蔽位模式
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//過濾器位寬為32位
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 過濾器標識符的高16位值
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;// 過濾器標識符的低16位值
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//過濾器屏蔽標識符的高16位值
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;// 過濾器屏蔽標識符的低16位值
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 設定了指向過濾器的FIFO為0
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能過濾器
- CAN_FilterInit(&CAN_FilterInitStructure);// 按上面的參數初始化過濾器
- /* CAN FIFO0 message pending interrupt enable */
- CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息掛號中斷
-
- }
- /* 發送兩個字節的數據*/
- void can_tx(u8 BANID,u8 Data)
- {
- CanTxMsg TxMessage;
- TxMessage.StdId=BANID; //標準標識符為0x00
- TxMessage.ExtId=0x0000; //擴展標識符0x0000
- TxMessage.IDE=CAN_ID_STD;//使用標準標識符
- TxMessage.RTR=CAN_RTR_DATA;//為數據幀
- TxMessage.DLC=8; // 消息的數據長度為2個字節
- TxMessage.Data[0]=Data; //第一個字節數據
- CAN_Transmit(CAN1,&TxMessage); //發送數據
-
-
- }
- /* USB中斷和CAN接收中斷服務程序,USB跟CAN公用I/O,這里只用到CAN的中斷。 */
- void USB_LP_CAN1_RX0_IRQHandler(void)
- {
-
- CanRxMsg RxMessage;
- u32 AD_value1=0;
- u32 AD_value2=0;
- u32 AD_value3=0;
- u32 AD_value4=0;
- RxMessage.StdId=0x00;
- RxMessage.ExtId=0x00;
- RxMessage.IDE=0;
- RxMessage.DLC=0;
- RxMessage.FMI=0;
- RxMessage.Data[0]=0x00;
- RxMessage.Data[1]=0x00;
-
- LED1_TOGGLE;
- CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的數據
-
- AD_value1=RxMessage.Data[0]*256+ RxMessage.Data[1];
- AD_value2=RxMessage.Data[2]*256+ RxMessage.Data[3];
- AD_value3=RxMessage.Data[4]*256+ RxMessage.Data[5];
- AD_value4=RxMessage.Data[6]*256+ RxMessage.Data[7];
-
- printf("*****地址為:0x%02X的四通道電壓采集**********\r\n",RxMessage.StdId);
- printf("通道1電壓: %d mV \r\n", AD_value1);
- printf("通道2電壓: %d mV \r\n", AD_value2);
- printf("通道3電壓: %d mV \r\n", AD_value3);
- printf("通道4電壓: %d mV \r\n", AD_value4);
- printf("******************************************** \r\n");
-
-
- }
復制代碼
所有資料51hei提供下載:
高級例程-PC機通過CAN總線采用主從方式采集總線上的多塊MINI板.rar
(848.98 KB, 下載次數: 115)
2018-11-17 01:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|