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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3410|回復: 0
收起左側

STM32 CAN通訊實現(發射機與接收機測試源程序)

[復制鏈接]
ID:332685 發表于 2018-5-18 08:11 | 顯示全部樓層 |閱讀模式
STM32 CAN通訊實現源碼分享給大家

接收機單片機源程序如下:
  1. /**************************************************************************************
  2.                 作者:藍想電子
  3.                 功能介紹:發射機作用每一S鐘變量data自動加1,加到255又重0開始,循環發射。
  4.                           接收機收到數據,在串口上顯示.
  5.                 注意:接收機的ID號必須跟發射機發射的ID號一致。
  6. ****************************************************************************************/                        

  7. #include "stm32f10x.h"
  8. #include <stdio.h>
  9. #include "delay.h"
  10. #include "can.h"
  11. extern u32 canid;
  12. extern u8 ReceiveData;
  13. //使用printf要在target里將 Use Micro LIB選中  必須加頭文件stdio.h
  14. int fputc(int ch,FILE *f)
  15. {
  16.           USART_SendData(USART1, (u8) ch);
  17.       while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  18.           return ch;
  19. }

  20. /*************************************************
  21. 函數: void RCC_Configuration(void)
  22. 功能: 復位和時鐘控制 配置
  23. 參數: 無
  24. 返回: 無
  25. **************************************************/
  26. void RCC_Configuration(void)
  27. {
  28.   ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態枚舉變量
  29.   RCC_DeInit();                                    //復位RCC外部設備寄存器到默認值
  30.   RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振
  31.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準備好
  32.   if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經準別好
  33.   {
  34.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數里面,時鐘起振之后
  35.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時
  36.               
  37.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等于==SYSCLK
  38.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鐘==AHB時鐘
  39.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鐘==AHB1/2時鐘
  40.          
  41.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz
  42.     RCC_PLLCmd(ENABLE);                                   //使能PLL時鐘
  43.    
  44.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒
  45.     {
  46.     }
  47.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統時鐘 = PLL時鐘
  48.     while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統時鐘
  49.     {
  50.     }
  51.   }

  52. }

  53. /*******************************************************************************
  54. * Function Name   : NVIC_Configuration
  55. * Description        : Configures NVIC and Vector Table base location.
  56. * Input                    : None
  57. * Output                 : None
  58. * Return                 : None
  59. *******************************************************************************/
  60. void NVIC_Configuration(void)
  61. {
  62.    NVIC_InitTypeDef NVIC_InitStructure;
  63.   
  64.    /* Set the Vector Table base location at 0x08000000 */
  65.    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  66.   
  67.    /* Configure the NVIC Preemption Priority Bits */  
  68.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  69.   
  70.    /* Enable the USART1 Interrupt */
  71.    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       //通道設置為串口1中斷
  72.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           //中斷響應優先級0
  73.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //打開中斷
  74.    NVIC_Init(&NVIC_InitStructure);                                                    //初始化
  75. }

  76. /*******************************************************************************
  77.         函數名:USART1_Configuration
  78.         輸  入:
  79.         輸  出:
  80.         功能說明:
  81.         初始化串口硬件設備,啟用中斷
  82.         配置步驟:
  83.         (1)打開GPIO和USART1的時鐘
  84.         (2)設置USART1兩個管腳GPIO模式
  85.         (3)配置USART1數據格式、波特率等參數
  86.         (4)使能USART1接收中斷功能
  87.         (5)最后使能USART1功能
  88. */
  89. void USART1_Configuration(void)
  90. {
  91.         GPIO_InitTypeDef GPIO_InitStructure;
  92.         USART_InitTypeDef USART_InitStructure;

  93.         /* 第1步:打開GPIO和USART部件的時鐘 */
  94.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  95.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  96.         /* 第2步:將USART Tx的GPIO配置為推挽復用模式 */
  97.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  98.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  99.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  101.         /* 第3步:將USART Rx的GPIO配置為浮空輸入模式
  102.                 由于CPU復位后,GPIO缺省都是浮空輸入模式,因此下面這個步驟不是必須的
  103.                 但是,我還是建議加上便于閱讀,并且防止其它地方修改了這個口線的設置參數
  104.         */
  105.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  106.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  107.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  108.         /*  第3步已經做了,因此這步可以不做
  109.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  110.         */
  111.         GPIO_Init(GPIOA, &GPIO_InitStructure);


  112.         /* 第4步:配置USART1參數
  113.             - BaudRate = 115200 baud
  114.             - Word Length = 8 Bits
  115.             - One Stop Bit
  116.             - No parity
  117.             - Hardware flow control disabled (RTS and CTS signals)
  118.             - Receive and transmit enabled
  119.         */
  120.         USART_InitStructure.USART_BaudRate = 9600;
  121.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  122.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  123.         USART_InitStructure.USART_Parity = USART_Parity_No;
  124.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  125.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  126.         USART_Init(USART1, &USART_InitStructure);

  127.     /* 若接收數據寄存器滿,則產生中斷 */
  128.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  129.         /* 第5步:使能 USART1, 配置完畢 */
  130.         USART_Cmd(USART1, ENABLE);

  131.     /* 如下語句解決第1個字節無法正確發送出去的問題 */
  132.     USART_ClearFlag(USART1, USART_FLAG_TC);     // 清標志
  133. }

  134. /*******************************************************************/
  135. /*                                                                 */
  136. /* STM32向串口1發送1字節                                           */
  137. /*                                                                 */
  138. /*                                                                 */
  139. /*******************************************************************/
  140. /*void Uart1_PutChar(u8 ch)
  141. {
  142.   USART_SendData(USART1, (u8) ch);
  143.   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  144. } */



  145. /*************************************************
  146. 函數: int main(void)
  147. 功能: main主函數
  148. 參數: 無
  149. 返回: 無
  150. **************************************************/
  151. int main(void)
  152. {
  153.   //u8 data;
  154.   RCC_Configuration();
  155.   NVIC_Configuration();
  156.   USART1_Configuration();
  157.   delay_init(72);
  158.   canid=1;        //這里的ID號根據發射機要發射的ID號來設置
  159.   CAN_Configuration();
  160.   while(1)
  161.   {
  162.          
  163.          //Can_Send_Msg(1,data);//發送的ID號要與接收機一致。
  164.          //data++;
  165.          //delay_ms(1000);
  166.          printf("接收到的數據 ReceiveData=%d\r\n",ReceiveData);         //ReceiveData為接收到發射機發來的數據,在CAN的中斷函數里接收,在電腦串口中顯示。
  167.          delay_ms(500);                                                                                                                  
  168.   }
  169. }
復制代碼

發射機單片機源程序如下:
  1. /**************************************************************************************
  2.                 作者:藍想電子
  3.                 功能介紹:發射機作用每一S鐘變量data自動加1,加到255又重0開始,循環發射。
  4.                           接收機收到數據,在串口上顯示.
  5.                 注意:接收機的ID號必須跟發射機發射的ID號一致。
  6. ****************************************************************************************/                        

  7. #include "stm32f10x.h"
  8. #include <stdio.h>
  9. #include "delay.h"
  10. #include "can.h"
  11. extern u32 canid;
  12. extern u8 ReceiveData;
  13. CanTxMsg TxMessage;
  14. u8 DY[8]={0x03,0xf0,0x00,0x21,0x44,0x16,0x00,0x00};
  15. //
  16. u8 GJ[8]={0x03,0xf0,0x00,0x35,0x00,0x01,0x00,0x00};
  17. //使用printf要在target里將 Use Micro LIB選中  必須加頭文件stdio.h
  18. int fputc(int ch,FILE *f)
  19. {
  20.           USART_SendData(USART1, (u8) ch);
  21.       while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  22.           return ch;
  23. }

  24. /*************************************************
  25. 函數: void RCC_Configuration(void)
  26. 功能: 復位和時鐘控制 配置
  27. 參數: 無
  28. 返回: 無
  29. **************************************************/
  30. void RCC_Configuration(void)
  31. {
  32.   ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態枚舉變量
  33.   RCC_DeInit();                                    //復位RCC外部設備寄存器到默認值
  34.   RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振
  35.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準備好
  36.   if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經準別好
  37.   {
  38.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數里面,時鐘起振之后
  39.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時
  40.               
  41.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等于==SYSCLK
  42.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鐘==AHB時鐘
  43.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鐘==AHB1/2時鐘
  44.          
  45.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz
  46.     RCC_PLLCmd(ENABLE);                                   //使能PLL時鐘
  47.    
  48.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒
  49.     {
  50.     }
  51.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統時鐘 = PLL時鐘
  52.     while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統時鐘
  53.     {
  54.     }
  55.   }

  56. }

  57. /*******************************************************************************
  58. * Function Name   : NVIC_Configuration
  59. * Description        : Configures NVIC and Vector Table base location.
  60. * Input                    : None
  61. * Output                 : None
  62. * Return                 : None
  63. *******************************************************************************/
  64. void NVIC_Configuration(void)
  65. {
  66.    NVIC_InitTypeDef NVIC_InitStructure;
  67.   
  68.    /* Set the Vector Table base location at 0x08000000 */
  69.    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  70.   
  71.    /* Configure the NVIC Preemption Priority Bits */  
  72.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  73.   
  74.    /* Enable the USART1 Interrupt */
  75.    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       //通道設置為串口1中斷
  76.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           //中斷響應優先級0
  77.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //打開中斷
  78.    NVIC_Init(&NVIC_InitStructure);                                                    //初始化
  79. }

  80. /*******************************************************************************
  81.         函數名:USART1_Configuration
  82.         輸  入:
  83.         輸  出:
  84.         功能說明:
  85.         初始化串口硬件設備,啟用中斷
  86.         配置步驟:
  87.         (1)打開GPIO和USART1的時鐘
  88.         (2)設置USART1兩個管腳GPIO模式
  89.         (3)配置USART1數據格式、波特率等參數
  90.         (4)使能USART1接收中斷功能
  91.         (5)最后使能USART1功能
  92. */
  93. void USART1_Configuration(void)
  94. {
  95.         GPIO_InitTypeDef GPIO_InitStructure;
  96.         USART_InitTypeDef USART_InitStructure;

  97.         /* 第1步:打開GPIO和USART部件的時鐘 */
  98.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  99.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  100.         /* 第2步:將USART Tx的GPIO配置為推挽復用模式 */
  101.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  102.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  103.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  105.         /* 第3步:將USART Rx的GPIO配置為浮空輸入模式
  106.                 由于CPU復位后,GPIO缺省都是浮空輸入模式,因此下面這個步驟不是必須的
  107.                 但是,我還是建議加上便于閱讀,并且防止其它地方修改了這個口線的設置參數
  108.         */
  109.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  110.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  111.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  112.         /*  第3步已經做了,因此這步可以不做
  113.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  114.         */
  115.         GPIO_Init(GPIOA, &GPIO_InitStructure);


  116.         /* 第4步:配置USART1參數
  117.             - BaudRate = 115200 baud
  118.             - Word Length = 8 Bits
  119.             - One Stop Bit
  120.             - No parity
  121.             - Hardware flow control disabled (RTS and CTS signals)
  122.             - Receive and transmit enabled
  123.         */
  124.         USART_InitStructure.USART_BaudRate = 115200;
  125.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  126.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  127.         USART_InitStructure.USART_Parity = USART_Parity_No;
  128.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  129.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  130.         USART_Init(USART1, &USART_InitStructure);

  131.     /* 若接收數據寄存器滿,則產生中斷 */
  132.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  133.         /* 第5步:使能 USART1, 配置完畢 */
  134.         USART_Cmd(USART1, ENABLE);

  135.     /* 如下語句解決第1個字節無法正確發送出去的問題 */
  136.     USART_ClearFlag(USART1, USART_FLAG_TC);     // 清標志
  137. }

  138. /*******************************************************************/
  139. /*                                                                 */
  140. /* STM32向串口1發送1字節                                           */
  141. /*                                                                 */
  142. /*                                                                 */
  143. /*******************************************************************/
  144. /*void Uart1_PutChar(u8 ch)
  145. {
  146.   USART_SendData(USART1, (u8) ch);
  147.   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  148. } */



  149. /*************************************************
  150. 函數: int main(void)
  151. 功能: main主函數
  152. 參數: 無
  153. 返回: 無
  154. **************************************************/
  155. int main(void)
  156. {

  157.   RCC_Configuration();
  158.   NVIC_Configuration();
  159.   USART1_Configuration();
  160.   delay_init(72);
  161.   canid=1;        //這里的ID號根據發射機要發射的ID號來設置
  162.   CAN_Configuration();
  163.   while(1)
  164.   {
  165. ……………………

  166. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

程序很老,用的老版本的庫:

STM32 CAN.7z (332.38 KB, 下載次數: 88)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女久久久久aⅴ国产馆 | 亚洲欧美网站 | 天堂av中文在线 | 在线视频91| 欧美精品一区在线发布 | 亚洲成人精品一区 | 99视频久| 精品二区 | 综合久久综合久久 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲一区国产精品 | 中文字幕在线观看视频一区 | 色综网| av在线一区二区三区 | 91精品国产91久久久久久吃药 | 欧美日韩国产精品 | 午夜国产 | 国产精品福利网站 | 欧美一区视频 | 日韩av在线播 | 午夜不卡福利视频 | www.4567| 午夜精品一区二区三区在线视频 | 激情网五月天 | 色婷婷久久 | 久久久成人精品 | 四色永久 | 天堂网avav| 欧美一区二区三区在线观看 | 中文字幕在线国产 | 久久精品| 久久99精品久久久久久国产越南 | 成在线人视频免费视频 | 在线观看精品视频网站 | 日韩成人影院 | 久久国产一区二区 | 九九九国产| 精品av久久久久电影 | 国产综合精品一区二区三区 | 欧美久久免费观看 | 中文字幕亚洲一区二区三区 |