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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6154|回復: 3
收起左側(cè)

STM32f042f6p6的CAN總線調(diào)試程序

[復制鏈接]
ID:471797 發(fā)表于 2019-3-12 09:31 | 顯示全部樓層 |閱讀模式
STM32f042f6p6單片機芯片的的CAN總線調(diào)試代碼分享給大家

單片機源程序如下:
  1.         * @attention
  2.   * CAN_TX<----->PB9
  3.   * CAN_RX<----->PB8
  4.   ******************************************************************************
  5.   */
  6. #include "iso_can.h"
  7. #include "iso_led.h"
  8. #include "iso_usart1.h"
  9. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

  10. /* 在中斷處理函數(shù)中返回 */
  11. uint8_t Receive_Buffer_Len=0;
  12. uint8_t ReceiveBuffer[255];
  13. uint8_t *pReceiveBuffer=ReceiveBuffer;

  14. volatile TestStatus TestRx;        

  15. /*
  16. * 函數(shù)名:CAN_NVIC_Configuration
  17. * 描述  :CAN RX0 中斷優(yōu)先級配置
  18. * 輸入  :無
  19. * 輸出  : 無
  20. * 調(diào)用  :內(nèi)部調(diào)用
  21. */
  22. static void CAN_NVIC_Configuration(void)
  23. {

  24.         NVIC_InitTypeDef NVIC_InitStructure;
  25.         
  26.         /* Enable the USART1 Interrupt */
  27.         NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;         
  28.         NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  29.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  30.         NVIC_Init(&NVIC_InitStructure);
  31. }

  32. /*
  33. * 函數(shù)名:CAN_GPIO_onfiguration
  34. * 描述  :CAN GPIO 和時鐘配置
  35. * 輸入  :無
  36. * 輸出  : 無
  37. * 調(diào)用  :內(nèi)部調(diào)用
  38. */
  39. static void CAN_GPIO_Configuration(void)
  40. {
  41.         GPIO_InitTypeDef GPIO_InitStructure;
  42.         
  43.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE);                                                                                                                        
  44.         
  45.         /* CAN1 Periph clock enable */
  46.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
  47.         
  48.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_4);
  49.   GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_4);
  50.         
  51.         /* Configure CAN pin: RX */                                                                                       // PB8
  52.         
  53.         GPIO_InitStructure.GPIO_Pin    = CAN_RX;
  54.         GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
  55.         GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
  56.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  57.         
  58.         /* Configure CAN pin: TX */                                                                                       // PB9

  59.         GPIO_InitStructure.GPIO_Pin    = CAN_TX;
  60.         GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
  61.         GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
  62.         GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  63.         GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
  64.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  65.         

  66. }

  67. /*
  68. * 函數(shù)名:CAN_Polling
  69. * 描述  :配置 CAN 的工作模式為 回環(huán)模式
  70. * 輸入  :無
  71. * 輸出  : -PASSED   成功
  72. *         -FAILED   失敗
  73. * 調(diào)用  :內(nèi)部調(diào)用
  74. */
  75. TestStatus CAN_Polling(void)
  76. {
  77.         CAN_InitTypeDef        CAN_InitStructure;
  78.         CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  79.         CanTxMsg TxMessage;
  80.         CanRxMsg RxMessage;
  81.         uint32_t i = 0;
  82.         uint8_t TransmitMailbox = 0;
  83.         
  84.         /* CAN register init */
  85.         CAN_DeInit(CAN);
  86.         CAN_StructInit(&CAN_InitStructure);
  87.         
  88.         /* CAN cell init */
  89.         CAN_InitStructure.CAN_TTCM=DISABLE;                                                 // 時間觸發(fā)通信禁止
  90.         CAN_InitStructure.CAN_ABOM=DISABLE;                                                 // 離線退出是在中斷置位清0后退出
  91.         CAN_InitStructure.CAN_AWUM=DISABLE;                                                 // 自動喚醒模式:清零sleep
  92.         CAN_InitStructure.CAN_NART=DISABLE;                                                 // 自動重新傳送豹紋,知道發(fā)送成功
  93.         CAN_InitStructure.CAN_RFLM=DISABLE;                                                 // FIFO沒有鎖定,新報文覆蓋舊報文  
  94.         CAN_InitStructure.CAN_TXFP=DISABLE;                                                 // 發(fā)送報文優(yōu)先級確定:標志符
  95.         CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;         // 回環(huán)模式
  96.         CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                                 // 1tq、BS1、BS2的值跟波特率有關(guān)
  97.         CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  98.         CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  99.         CAN_InitStructure.CAN_Prescaler=5;             // 分頻系數(shù)為5
  100.         CAN_Init(CAN, &CAN_InitStructure);            // 初始化CAN1
  101.         
  102.         /* CAN filter init */
  103.         CAN_FilterInitStructure.CAN_FilterNumber=0;
  104.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  105.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  106.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  107.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  108.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  109.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  110.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
  111.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  112.         CAN_FilterInit(&CAN_FilterInitStructure);
  113.         
  114.         /* transmit */
  115.         TxMessage.StdId=0x11;                                // 設定標準標識符(11位,擴展的為29位)
  116.         TxMessage.RTR=CAN_RTR_DATA;        // 傳輸消息的幀類型為數(shù)據(jù)幀(還有遠程幀)
  117.         TxMessage.IDE=CAN_ID_STD;                // 消息標志符實驗標準標識符
  118.         TxMessage.DLC=2;                                          // 發(fā)送兩幀,一幀8位
  119.         TxMessage.Data[0]=0xCA;                        // 第一幀數(shù)據(jù)
  120.         TxMessage.Data[1]=0xFE;                        // 第二幀數(shù)據(jù)
  121.         
  122.         TransmitMailbox=CAN_Transmit(CAN, &TxMessage);
  123.         i = 0;
  124.         // 用于檢查消息傳輸是否正常
  125.         while((CAN_TransmitStatus(CAN, TransmitMailbox) != CANTXOK) && (i != 0xFF))
  126.         {
  127.                 i++;
  128.         }
  129.         
  130.         i = 0;
  131.         // 檢查返回的掛號的信息數(shù)目
  132.         while((CAN_MessagePending(CAN, CAN_FIFO0) < 1) && (i != 0xFF))
  133.         {
  134.                 i++;
  135.         }
  136.         
  137.         /* receive */
  138.         RxMessage.StdId=0x00;
  139.         RxMessage.IDE=CAN_ID_STD;
  140.         RxMessage.DLC=0;
  141.         RxMessage.Data[0]=0x00;
  142.         RxMessage.Data[1]=0x00;
  143.         CAN_Receive(CAN, CAN_FIFO0, &RxMessage);
  144.         
  145.         
  146.         if (RxMessage.StdId!=0x11)
  147.         {
  148.                 return FAILED;  
  149.         }
  150.         
  151.         if (RxMessage.IDE!=CAN_ID_STD)
  152.         {
  153.                 return FAILED;
  154.         }
  155.         
  156.         if (RxMessage.DLC!=2)
  157.         {
  158.                 return FAILED;  
  159.         }
  160.         
  161.         /* 判斷發(fā)送的信息和接收的信息是否相等 */
  162.         if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  163.         {
  164.                 return FAILED;
  165.         }
  166.         
  167.         printf("receive data:0X%X,0X%X",RxMessage.Data[0], RxMessage.Data[1]);  
  168.         
  169.         return PASSED; /* Test Passed */
  170. }

  171. /**
  172.   * @brief  Configures the CAN, transmit and receive using interrupt.
  173.   * @param  None
  174.   * @retval : PASSED if the reception is well done, FAILED in other case
  175.   */

  176. /*
  177. * 函數(shù)名:CAN_Interrupt
  178. * 描述  :配置 CAN 的工作模式為 中斷模式
  179. * 輸入  :無
  180. * 輸出  : -PASSED   成功
  181. *         -FAILED   失敗
  182. * 調(diào)用  :內(nèi)部調(diào)用
  183. */
  184. static void CAN_InterruptMode_Configuration(void)
  185. {
  186.         CAN_InitTypeDef        CAN_InitStructure;
  187.         CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  188.         /* CAN register init */
  189.         CAN_DeInit(CAN);
  190.         CAN_StructInit(&CAN_InitStructure);
  191.         
  192.         /* CAN cell init */
  193.         CAN_InitStructure.CAN_TTCM=DISABLE;           // 時間觸發(fā)通信禁止
  194.         CAN_InitStructure.CAN_ABOM=DISABLE;                  // 離線退出是在中斷置位清0后退出
  195.         CAN_InitStructure.CAN_AWUM=DISABLE;                  // 自動喚醒模式:清零sleep
  196.         CAN_InitStructure.CAN_NART=DISABLE;                  // 自動重新傳送豹紋,知道發(fā)送成功
  197.         CAN_InitStructure.CAN_RFLM=DISABLE;                  // FIFO沒有鎖定,新報文覆蓋舊報文
  198.         CAN_InitStructure.CAN_TXFP=DISABLE;           // 發(fā)送報文優(yōu)先級確定:標志符
  199.         CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; // 正常模式
  200.         CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;        // 1tq、BS1、BS2的值跟波特率有關(guān)
  201.         CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  202.         CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  203.         CAN_InitStructure.CAN_Prescaler=1;                                          // 分頻系數(shù)為1
  204.         CAN_Init(CAN, &CAN_InitStructure);                                                // 初始化CAN1
  205.         
  206.         /* CAN filter init */
  207.         CAN_FilterInitStructure.CAN_FilterNumber=1;
  208.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  209.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  210.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  211.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  212.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  213.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  214.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  215.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  216.         CAN_FilterInit(&CAN_FilterInitStructure);
  217.         
  218.         /* CAN FIFO0 message pending interrupt enable */
  219.         CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE); //中斷使能
  220.         


  221. }

  222. void CAN_Transmit_Buffer(uint8_t* pBuffer,uint16_t NumByteToWrite)
  223. {
  224.         uint8_t NumOfPake=0,NumOfSingle=0,cnt=0;
  225.         CanTxMsg TxMessage;
  226.         NumOfPake=NumByteToWrite/8 ;
  227.         NumOfSingle=NumByteToWrite%8 ;
  228.         TxMessage.StdId=0x00;                                         // 標準標識符為0
  229.         TxMessage.ExtId=0x1234;                                 // 設置擴展標示符(29位)
  230.         TxMessage.IDE=CAN_ID_EXT;                         // 使用擴展標識符
  231.         TxMessage.RTR=CAN_RTR_DATA;                 // 消息類型為數(shù)據(jù)幀,一幀8位
  232.         while(NumOfPake--)
  233.         {
  234.                                 /* transmit 1 message */
  235.                         TxMessage.DLC=8;                                                        
  236.                         for(cnt=0;cnt<8;cnt++)
  237.                         {
  238.                                 TxMessage.Data[cnt]=* pBuffer;                                 
  239.                                 pBuffer++;
  240.                         }
  241.                         CAN_Transmit(CAN, &TxMessage);        
  242.         }
  243.         if(NumOfSingle)
  244.         {
  245.                 TxMessage.DLC=NumOfSingle;                                                         
  246.                 for(cnt=0;cnt<NumOfSingle;cnt++)
  247.                 {
  248.                         TxMessage.Data[cnt]=* pBuffer;                                 
  249.                         pBuffer++;
  250.                 }
  251.                 CAN_Transmit(CAN, &TxMessage);
  252.         }
  253.         
  254. }


  255. /*
  256. * 函數(shù)名:CAN_Init
  257. * 描述  :CAN初始化,包括端口初始化和中斷優(yōu)先級初始化
  258. * 輸入  :無
  259. * 輸出  : 無         
  260. * 調(diào)用  :外部調(diào)用
  261. */
  262. void USER_CAN_Init(void)
  263. {
  264.         CAN_NVIC_Configuration();
  265.         CAN_GPIO_Configuration();
  266. }

  267. /*
  268. * 函數(shù)名:CAN_Test
  269. * 描述  :CAN 回環(huán)模式跟中斷模式測試
  270. * 輸入  :無
  271. * 輸出  : 無         
  272. * 調(diào)用  :外部調(diào)用
  273. */
  274. void USER_CAN_Test(void)
  275. {
  276.         /* CAN transmit at 100Kb/s and receive by polling in loopback mode */
  277.         TestRx = CAN_Polling();
  278.         
  279.         if (TestRx == FAILED)
  280.         {   
  281.                 ISO_LED(LED1,OFF);        // LED1 OFF                 
  282.         }
  283.         else
  284.         {   
  285.                 ISO_LED(LED1,ON);          // LED1 ON;               
  286.         }
  287.         
  288.         /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode */
  289.         CAN_InterruptMode_Configuration();
  290. }


  291. /*-------------------------------------------------------------------------------*/

  292. void CAN_Loopback_Test(void)
  293. {        
  294.         /* LED config */
  295.         LED_GPIO_Config();        
  296.         
  297.         printf( "\r\n 這個一個CAN(回環(huán)模式和中斷模式)測試程序...... \r\n" );
  298.         
  299.         USER_CAN_Init();        
  300.         printf( "\r\n CAN 回環(huán)測試初始化成功...... \r\n" );
  301.         
  302.         USER_CAN_Test();        

  303.         while (1)
  304.         {
  305.         
  306.         }
  307. }

  308. /*----------------------------------------END OF FILE---------------------------------------------------*/
復制代碼
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "iso_usart1.h"
  3. #include "iso_dma.h"
  4. #include "iso_can.h"
  5. /** @addtogroup ISO_KEY_Examples
  6.   * @{
  7.   */

  8. /** @addtogroup ISO_KEY
  9.   * @{
  10.   */

  11. /* Private typedef -----------------------------------------------------------*/
  12. /* Private define ------------------------------------------------------------*/
  13. /* Private macro -------------------------------------------------------------*/
  14. /* Private variables ---------------------------------------------------------*/

  15. /* Private function prototypes -----------------------------------------------*/
  16. /* Private functions ---------------------------------------------------------*/

  17. /**
  18.   * @brief  Main program.
  19.   * @param  None
  20.   * @retval None
  21.   */
  22. int main(void)
  23. {
  24.   /*!< At this stage the microcontroller clock setting is already configured,
  25.        this is done through SystemInit() function which is called from startup
  26.        file (startup_stm32f0xx.s) before to branch to application main.
  27.        To reconfigure the default setting of SystemInit() function, refer to
  28.        system_stm32f0xx.c file
  29.      */
  30.         SystemInit ();
  31.         USART1_Config();        
  32.         printf("\r\nFengChi STM32F0 NOTE Board CAN Test...\r\n");
  33.         printf("\r\nTime:%s\r\n", "("__DATE__ " - " __TIME__ ")");
  34.         USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);        
  35.         ISO_DMAChannel_Config(DMA1_Channel2,(u32)&USART1->TDR,(u32)g_DMA_USART_Buffer,\
  36.                                                                                                 DMA_DIR_PeripheralDST,DMA_Mode_Circular,43);
  37.         DMA_Cmd(DMA1_Channel2, ENABLE);
  38.         ISO_DMAChannel_Config(DMA1_Channel3,(u32)&USART1->RDR,(u32)g_DMA_USART_Buffer,\
  39.                                                                                                 DMA_DIR_PeripheralSRC,DMA_Mode_Circular,Max_DMA_USART_Buffer_Len);
  40.         DMA_Cmd(DMA1_Channel3, ENABLE);        
  41.         CAN_Loopback_Test();
  42.   while (1)
  43.   {

  44.   }
  45. }

  46. #ifdef  USE_FULL_ASSERT

  47. /**
  48.   * @brief  Reports the name of the source file and the source line number
  49.   *         where the assert_param error has occurred.
  50.   * @param  file: pointer to the source file name
  51.   * @param  line: assert_param error line source number
  52.   * @retval None
  53.   */
  54. void assert_failed(uint8_t* file, uint32_t line)
  55. {
  56.   /* User can add his own implementation to report the file name and line number,
  57.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  58.   /* Infinite loop */
  59.   while (1)
  60.   {
  61.   }
  62. }
  63. #endif

  64. /**
  65.   * @}
  66.   */

  67. /**
  68.   * @}
  69.   */

  70. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復制代碼


所有資料51hei提供下載:
19-ISO_CAN.7z (216.85 KB, 下載次數(shù): 115)

評分

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

查看全部評分

回復

使用道具 舉報

ID:471797 發(fā)表于 2019-3-13 11:35 | 顯示全部樓層
這個好像是STM32f042c6tx單片機的CAN
回復

使用道具 舉報

ID:45306 發(fā)表于 2019-8-22 22:54 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:295248 發(fā)表于 2020-4-29 09:54 | 顯示全部樓層
謝謝樓主
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品色婷婷久久58 | 中文字幕视频网 | 国产精品久久久久久久久久久久 | 日韩欧美视频网站 | 精品国产成人 | 国产在线永久免费 | 亚洲国产成人精品女人久久久 | 中文字幕在线欧美 | 久久精品91久久久久久再现 | 国产乱码精品1区2区3区 | 国产成人在线一区二区 | 亚洲国产欧美国产综合一区 | 日韩有码在线观看 | 久久亚洲国产精品 | 久久999| 亚洲欧洲精品在线 | 国产福利资源在线 | 久久精品国产99国产 | 国产美女久久久 | 91www在线观看 | 欧美精品成人影院 | 欧美黄色一区 | 亚洲成av人影片在线观看 | 成人不卡视频 | a级在线免费观看 | 国产精品久久久久久久久免费高清 | 日韩成人免费视频 | 狠狠干av| 国产欧美一区二区三区另类精品 | 特黄特色大片免费视频观看 | 精品欧美激情在线观看 | 日本精品视频一区二区三区四区 | 精品一区二区三区在线播放 | 在线成人免费视频 | 中文字幕二区 | 欧美精品一区二区三区一线天视频 | 欧美成人精品在线 | 国产成人免费视频网站高清观看视频 | av中文字幕在线 | 午夜一区二区三区视频 | 黄网在线观看 |