[技术问答] 关于NUC131中断入口的问题!!!想不通!

[复制链接]
2837|12
 楼主| we167527 发表于 2016-8-31 14:53 | 显示全部楼层 |阅读模式
1.png


这是我CAN0的中断入口。在中断入口里加入个for(;;)就死循环了!!!出不来了?可我的清除中断标志在for(;;)里面啊!应该清除就退出了中断才对啊!


2.png

我在中断入口里加入CAN0的发送函数。结果就一直在发送!!!我只想接受到CAN0后在发送一次而已啊!!!

huangcunxiake 发表于 2016-8-31 17:57 | 显示全部楼层
你这不是废话,在中断里怎么可以使用死循环呢,就算是使用,也要给个跳出的条件啊。不跳出永远卡在里面。
dongnanxibei 发表于 2016-8-31 18:27 | 显示全部楼层
官方不是有例程。
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V2.0
  4. * $Revision: 1 $
  5. * $Date: 14/10/01 5:10p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC230_240 Series CAN Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "NUC230_240.h"


  14. #define PLL_CLOCK       50000000

  15. /*---------------------------------------------------------------------------*/
  16. /*  Function Declare                                                         */
  17. /*---------------------------------------------------------------------------*/
  18. extern char GetChar(void);
  19. void CAN_ShowMsg(STR_CANMSG_T* Msg);

  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Define global variables and constants                                                                   */
  22. /*---------------------------------------------------------------------------------------------------------*/
  23. /* Declare a CAN message structure */
  24. STR_CANMSG_T rrMsg;


  25. /*---------------------------------------------------------------------------------------------------------*/
  26. /* ISR to handle CAN interrupt event                                                                       */
  27. /*---------------------------------------------------------------------------------------------------------*/
  28. void CAN_MsgInterrupt(CAN_T *tCAN, uint32_t u32IIDR)
  29. {
  30.     if(u32IIDR == 1) {
  31.         printf("Msg-0 INT and Callback\n");
  32.         CAN_Receive(tCAN, 0, &rrMsg);
  33.         CAN_ShowMsg(&rrMsg);
  34.     }
  35.     if(u32IIDR == 5 + 1) {
  36.         printf("Msg-5 INT and Callback \n");
  37.         CAN_Receive(tCAN, 5, &rrMsg);
  38.         CAN_ShowMsg(&rrMsg);
  39.     }
  40.     if(u32IIDR == 31 + 1) {
  41.         printf("Msg-31 INT and Callback \n");
  42.         CAN_Receive(tCAN, 31, &rrMsg);
  43.         CAN_ShowMsg(&rrMsg);
  44.     }
  45. }

  46. /*---------------------------------------------------------------------------------------------------------*/
  47. /* CAN0 interrupt handler                                                                                  */
  48. /*---------------------------------------------------------------------------------------------------------*/
  49. void CAN0_IRQHandler(void)
  50. {
  51.     uint32_t u8IIDRstatus;

  52.     u8IIDRstatus = CAN0->IIDR;

  53.     if(u8IIDRstatus == 0x00008000) {      /* Check Status Interrupt Flag (Error status Int and Status change Int) */
  54.         /**************************/
  55.         /* Status Change interrupt*/
  56.         /**************************/
  57.         if(CAN0->STATUS & CAN_STATUS_RXOK_Msk) {
  58.             CAN0->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/

  59.             printf("RxOK INT\n") ;
  60.         }

  61.         if(CAN0->STATUS & CAN_STATUS_TXOK_Msk) {
  62.             CAN0->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/

  63.             printf("TxOK INT\n") ;
  64.         }

  65.         /**************************/
  66.         /* Error Status interrupt */
  67.         /**************************/
  68.         if(CAN0->STATUS & CAN_STATUS_EWARN_Msk) {
  69.             printf("EWARN INT\n") ;
  70.         }

  71.         if(CAN0->STATUS & CAN_STATUS_BOFF_Msk) {
  72.             printf("BOFF INT\n") ;
  73.         }
  74.     } else if(u8IIDRstatus != 0) {
  75.         printf("=> Interrupt Pointer = %d\n", CAN0->IIDR - 1);

  76.         CAN_MsgInterrupt(CAN0, u8IIDRstatus);

  77.         CAN_CLR_INT_PENDING_BIT(CAN0, ((CAN0->IIDR) - 1)); /* Clear Interrupt Pending */
  78.     } else if(CAN0->WU_STATUS == 1) {
  79.         printf("Wake up\n");

  80.         CAN0->WU_STATUS = 0;     /* Write '0' to clear */
  81.     }

  82. }

  83. /*---------------------------------------------------------------------------------------------------------*/
  84. /* CAN1 interrupt handler                                                                                  */
  85. /*---------------------------------------------------------------------------------------------------------*/
  86. void CAN1_IRQHandler(void)
  87. {
  88.     uint32_t u8IIDRstatus;

  89.     u8IIDRstatus = CAN1->IIDR;

  90.     if(u8IIDRstatus == 0x00008000) {      /* Check Status Interrupt Flag (Error status Int and Status change Int) */
  91.         /**************************/
  92.         /* Status Change interrupt*/
  93.         /**************************/
  94.         if(CAN1->STATUS & CAN_STATUS_RXOK_Msk) {
  95.             CAN1->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/

  96.             printf("RxOK INT\n") ;
  97.         }

  98.         if(CAN1->STATUS & CAN_STATUS_TXOK_Msk) {
  99.             CAN1->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/

  100.             printf("TxOK INT\n") ;
  101.         }

  102.         /**************************/
  103.         /* Error Status interrupt */
  104.         /**************************/
  105.         if(CAN1->STATUS & CAN_STATUS_EWARN_Msk) {
  106.             printf("EWARN INT\n") ;
  107.         }

  108.         if(CAN1->STATUS & CAN_STATUS_BOFF_Msk) {
  109.             printf("BOFF INT\n") ;
  110.         }
  111.     } else if(u8IIDRstatus != 0) {
  112.         printf("=> Interrupt Pointer = %d\n", CAN1->IIDR - 1);

  113.         CAN_MsgInterrupt(CAN1, u8IIDRstatus);

  114.         CAN_CLR_INT_PENDING_BIT(CAN1, ((CAN1->IIDR) - 1)); /* Clear Interrupt Pending */
  115.     } else if(CAN1->WU_STATUS == 1) {
  116.         printf("Wake up\n");

  117.         CAN1->WU_STATUS = 0;     /* Write '0' to clear */
  118.     }

  119. }

  120. /*---------------------------------------------------------------------------*/
  121. /*  Show Message Function                                                    */
  122. /*---------------------------------------------------------------------------*/
  123. void CAN_ShowMsg(STR_CANMSG_T* Msg)
  124. {
  125.     uint8_t i;

  126.     /* Show the message information */
  127.     printf("Read ID=0x%X, Type=%s, DLC=%d, Data=", Msg->Id, Msg->IdType ? "EXT" : "STD", Msg->DLC);
  128.     for(i = 0; i < Msg->DLC; i++)
  129.         printf("%X,", Msg->Data[i]);
  130.     printf("\n\n");
  131. }

  132. /*---------------------------------------------------------------------------------------------------------*/
  133. /* Disable CAN Clock and Reset it                                                                          */
  134. /*---------------------------------------------------------------------------------------------------------*/
  135. void CAN_STOP(void)
  136. {
  137.     /* Disable CAN0 Clock and Reset it */
  138.     SYS_ResetModule(CAN0_RST);
  139.     CLK_DisableModuleClock(CAN0_MODULE);

  140.     /* Disable CAN1 Clock and Reset it */
  141.     SYS_ResetModule(CAN1_RST);
  142.     CLK_DisableModuleClock(CAN1_MODULE);
  143. }

  144. void SYS_Init(void)
  145. {
  146.     /*---------------------------------------------------------------------------------------------------------*/
  147.     /* Init System Clock                                                                                       */
  148.     /*---------------------------------------------------------------------------------------------------------*/

  149.     /* Enable Internal RC 22.1184MHz clock */
  150.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  151.     /* Waiting for Internal RC clock ready */
  152.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  153.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  154.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  155.     /* Enable external XTAL 12MHz clock */
  156.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  157.     /* Waiting for external XTAL clock ready */
  158.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  159.     /* Set core clock as PLL_CLOCK from PLL */
  160.     CLK_SetCoreClock(PLL_CLOCK);

  161.     /* Enable UART module clock */
  162.     CLK_EnableModuleClock(UART0_MODULE);

  163.     /* Enable CAN module clock */
  164.     CLK_EnableModuleClock(CAN0_MODULE);
  165.     //CLK_EnableModuleClock(CAN1_MODULE);

  166.     /* Select UART module clock source */
  167.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

  168.     /*---------------------------------------------------------------------------------------------------------*/
  169.     /* Init I/O Multi-function                                                                                 */
  170.     /*---------------------------------------------------------------------------------------------------------*/

  171.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  172.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  173.     SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

  174.     /* Set PD multi-function pins for CANTX0, CANRX0 */
  175.     SYS->GPD_MFP &= ~(SYS_GPD_MFP_PD6_Msk | SYS_GPD_MFP_PD7_Msk);
  176.     SYS->GPD_MFP = SYS_GPD_MFP_PD6_CAN0_RXD | SYS_GPD_MFP_PD7_CAN0_TXD;

  177.     /* Set PA multi-function pins for CANTX1, CANRX1 */
  178. //     SYS->GPA_MFP &= ~(SYS_GPA_MFP_PA10_Msk | SYS_GPA_MFP_PA11_Msk);
  179. //     SYS->GPA_MFP = SYS_GPA_MFP_PA10_CAN1_TXD | SYS_GPA_MFP_PA11_CAN1_RXD;
  180. //     SYS->ALT_MFP &= ~(SYS_ALT_MFP_PA10_Msk | SYS_ALT_MFP_PA11_Msk);
  181. //     SYS->ALT_MFP |= SYS_ALT_MFP_PA10_CAN1_TXD | SYS_ALT_MFP_PA11_CAN1_RXD;

  182. }

  183. /*---------------------------------------------------------------------------------------------------------*/
  184. /* Init UART                                                                                               */
  185. /*---------------------------------------------------------------------------------------------------------*/
  186. void UART0_Init()
  187. {
  188.     /* Reset IP */
  189.     SYS_ResetModule(UART0_RST);

  190.     /* Configure UART0 and set UART0 Baudrate */
  191.     UART_Open(UART0, 115200);
  192. }

  193. /*----------------------------------------------------------------------------*/
  194. /*  Some description about how to create test environment                     */
  195. /*----------------------------------------------------------------------------*/
  196. void Note_Configure()
  197. {
  198.     printf("\n\n");
  199.     printf("+--------------------------------------------------------------------------+\n");
  200.     printf("|  About CAN sample code configure                                         |\n");
  201.     printf("+--------------------------------------------------------------------------+\n");
  202.     printf("|   The sample code provide a simple sample code for you study CAN         |\n");
  203.     printf("|   Before execute it, please check description as below                   |\n");
  204.     printf("|                                                                          |\n");
  205.     printf("|   1.CAN_TX and CAN_RX should be connected to your CAN transceiver        |\n");
  206.     printf("|   2.Using two module board and connect to the same CAN BUS               |\n");
  207.     printf("|   3.Check the terminal resistor of bus is connected                      |\n");
  208.     printf("|   4.Using UART0 as print message port                                    |\n");
  209.     printf("|                                                                          |\n");
  210.     printf("|  |--------|       |-----------|   CANBUS  |-----------|       |--------| |\n");
  211.     printf("|  |        |------>|           |<--------->|           |<------|        | |\n");
  212.     printf("|  |        |CAN_TX |    CAN    |   CAN_H   |   CAN     |CAN_TX |        | |\n");
  213.     printf("|  | NUC2XX |       |Transceiver|           |Transceiver|       | NUC2XX | |\n");
  214.     printf("|  |        |<------|           |<--------->|           |------>|        | |\n");
  215.     printf("|  |        |CAN_RX |           |   CAN_L   |           |CAN_RX |        | |\n");
  216.     printf("|  |--------|       |-----------|           |-----------|       |--------| |\n");
  217.     printf("|  |                                                            |          |\n");
  218.     printf("|  |                                                            |          |\n");
  219.     printf("|  V                                                            V          |\n");
  220.     printf("| UART0                                                         UART0      |\n");
  221.     printf("|(print message)                                          (print message)  |\n");
  222.     printf("+--------------------------------------------------------------------------+\n");
  223. }

  224. /*----------------------------------------------------------------------------*/
  225. /*  Set the CAN speed                                                         */
  226. /*----------------------------------------------------------------------------*/
  227. void SelectCANSpeed(CAN_T  *tCAN)
  228. {
  229.     uint32_t unItem;
  230.     int32_t i32Err = 0;

  231.     printf("Please select CAN speed you desired\n");
  232.     printf("[0] 1000Kbps\n");
  233.     printf("[1]  500Kbps\n");
  234.     printf("[2]  250Kbps\n");
  235.     printf("[3]  125Kbps\n");
  236.     printf("[4]  100Kbps\n");
  237.     printf("[5]   50Kbps\n");

  238.     unItem = GetChar();
  239.     printf("%c\n", unItem);
  240.     if(unItem == '1')
  241.         i32Err = CAN_Open(tCAN,  500000, CAN_BASIC_MODE);//Set target baud-rate and operation mode.
  242.     else if(unItem == '2')
  243.         i32Err = CAN_Open(tCAN,  250000, CAN_BASIC_MODE);
  244.     else if(unItem == '3')
  245.         i32Err = CAN_Open(tCAN,  125000, CAN_BASIC_MODE);
  246.     else if(unItem == '4')
  247.         i32Err = CAN_Open(tCAN,  100000, CAN_BASIC_MODE);
  248.     else if(unItem == '5')
  249.         i32Err = CAN_Open(tCAN,   50000, CAN_BASIC_MODE);
  250.     else
  251.         i32Err = CAN_Open(tCAN, 1000000, CAN_BASIC_MODE);

  252.     if(i32Err < 0)
  253.         printf("Set CAN bit rate is fail\n");
  254.     else
  255.         printf("Real baud-rate value(bps): %d\n", i32Err);

  256. }

  257. /*----------------------------------------------------------------------------*/
  258. /*  Test Menu                                                                 */
  259. /*----------------------------------------------------------------------------*/
  260. void TestItem(void)
  261. {
  262.     printf("\n");
  263.     printf("+------------------------------------------------------------------ +\n");
  264.     printf("|  Nuvoton CAN BUS DRIVER DEMO                                      |\n");
  265.     printf("+-------------------------------------------------------------------+\n");
  266.     printf("|                                                                   |\n");
  267.     printf("|     Transmit a message by basic mode                              |\n");
  268.     printf("|     (At first, another module board should be set to              |\n");
  269.     printf("|     [CAN_BasicMode_Receive] waiting for receiving data)           |\n");
  270.     printf("|                                                                   |\n");
  271.     printf("+-------------------------------------------------------------------+\n");
  272. }

  273. /*----------------------------------------------------------------------------*/
  274. /*  Send Tx Msg by Basic Mode Function (Without Message RAM)                  */
  275. /*----------------------------------------------------------------------------*/
  276. void Test_BasicMode_Tx(CAN_T  *tCAN)
  277. {
  278.     int32_t delaycount;

  279.     /* Declare a CAN message structure */
  280.     STR_CANMSG_T msg1;
  281.     delaycount=1000;

  282.     /* Enable CAN interrupt */
  283.     CAN_EnableInt(tCAN, CAN_CON_IE_Msk | CAN_CON_SIE_Msk);
  284.     /* Set Interrupt Priority */
  285.     NVIC_SetPriority(CAN0_IRQn, (1 << __NVIC_PRIO_BITS) - 2);
  286.     NVIC_SetPriority(CAN1_IRQn, (1 << __NVIC_PRIO_BITS) - 2);
  287.     /* Enable External Interrupt */
  288.     NVIC_EnableIRQ(CAN0_IRQn);
  289.     NVIC_EnableIRQ(CAN1_IRQn);

  290.     /* Send Message No.1 */
  291.     msg1.FrameType = CAN_DATA_FRAME;
  292.     msg1.IdType   = CAN_STD_ID;
  293.     msg1.Id       = 0x001;
  294.     msg1.DLC      = 2;
  295.     msg1.Data[0]  = 0x00;
  296.     msg1.Data[1]  = 0x2;
  297.     CAN_Transmit(tCAN, 0, &msg1);//Send CAN message
  298.     printf("Send STD_ID:0x1,Data[0,2]\n");
  299.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  300.     /* Send Message No.2 */
  301.     msg1.FrameType = CAN_DATA_FRAME;
  302.     msg1.IdType   = CAN_STD_ID;
  303.     msg1.Id       = 0x1AC;
  304.     msg1.DLC      = 8;
  305.     msg1.Data[0]  = 0x11;
  306.     msg1.Data[1]  = 0x12;
  307.     msg1.Data[2]  = 0x13;
  308.     msg1.Data[3]  = 0x14;
  309.     msg1.Data[4]  = 0x15;
  310.     msg1.Data[5]  = 0x16;
  311.     msg1.Data[6]  = 0x17;
  312.     msg1.Data[7]  = 0x18;
  313.     CAN_Transmit(tCAN, 0, &msg1);//Send CAN message
  314.     printf("Send STD_ID:0x1AC,Data[11,12,13,14,15,16,17,18]\n");
  315.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  316.     /* Send Message No.3 */
  317.     msg1.FrameType = CAN_DATA_FRAME;
  318.     msg1.IdType   = CAN_STD_ID;
  319.     msg1.Id       = 0x310;
  320.     msg1.DLC      = 8;
  321.     msg1.Data[0]  = 0x21;
  322.     msg1.Data[1]  = 0x22;
  323.     msg1.Data[2]  = 0x23;
  324.     msg1.Data[3]  = 0x24;
  325.     msg1.Data[4]  = 0x25;
  326.     msg1.Data[5]  = 0x26;
  327.     msg1.Data[6]  = 0x27;
  328.     msg1.Data[7]  = 0x28;
  329.     CAN_Transmit(tCAN, 0, &msg1);//Send CAN message
  330.     printf("Send STD_ID:0x310,Data[21,22,23,24,25,26,27,28]\n");
  331.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  332.     /* Send Message No.4 */
  333.     msg1.FrameType = CAN_DATA_FRAME;
  334.     msg1.IdType   = CAN_EXT_ID;
  335.     msg1.Id       = 0x3377;
  336.     msg1.DLC      = 8;
  337.     msg1.Data[0]  = 0x31;
  338.     msg1.Data[1]  = 0x32;
  339.     msg1.Data[2]  = 0x33;
  340.     msg1.Data[3]  = 0x34;
  341.     msg1.Data[4]  = 0x35;
  342.     msg1.Data[5]  = 0x36;
  343.     msg1.Data[6]  = 0x37;
  344.     msg1.Data[7]  = 0x38;
  345.     CAN_Transmit(tCAN, 0, &msg1);//Send CAN message
  346.     printf("Send EXT_ID:0x3377,Data[31,32,33,34,35,36,37,38]\n");
  347.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  348.     /* Send Message No.5 */
  349.     msg1.FrameType = CAN_DATA_FRAME;
  350.     msg1.IdType   = CAN_EXT_ID;
  351.     msg1.Id       = 0x7755;
  352.     msg1.DLC      = 8;
  353.     msg1.Data[0]  = 0x41;
  354.     msg1.Data[1]  = 0x42;
  355.     msg1.Data[2]  = 0x43;
  356.     msg1.Data[3]  = 0x44;
  357.     msg1.Data[4]  = 0x45;
  358.     msg1.Data[5]  = 0x46;
  359.     msg1.Data[6]  = 0x47;
  360.     msg1.Data[7]  = 0x48;

  361.     CAN_Transmit(tCAN, 0, &msg1);//Send CAN message
  362.     printf("Send EXT_ID:0x7755,Data[41,42,43,44,45,46,47,48]\n");
  363.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  364. }

  365. /*---------------------------------------------------------------------------------------------------------*/
  366. /* MAIN function                                                                                           */
  367. /*---------------------------------------------------------------------------------------------------------*/
  368. int main(void)
  369. {
  370.     CAN_T *tCAN;
  371.     tCAN = (CAN_T *) CAN0;
  372.     //tCAN = (CAN_T *) CAN1;

  373.     /* Unlock protected registers */
  374.     SYS_UnlockReg();

  375.     /* Init System, IP clock and multi-function I/O */
  376.     SYS_Init();

  377.     /* Lock protected registers */
  378.     SYS_LockReg();

  379.     /* Init UART0 for printf */
  380.     UART0_Init();

  381.     /*---------------------------------------------------------------------------------------------------------*/
  382.     /* SAMPLE CODE                                                                                             */
  383.     /*---------------------------------------------------------------------------------------------------------*/

  384. //     /* Set GPB12 to control CAN transceiver for Nuvoton board */
  385. //     PB12 = 0;

  386.     /* Some description about how to create test environment */
  387.     Note_Configure();

  388.     /* configuring the Bit Timing */
  389.     SelectCANSpeed(tCAN);

  390.     /* Test Menu */
  391.     TestItem();

  392.     printf("Transmit a message by basic mode\n\n");
  393.     printf("Please confirm receiver is ready.\n");
  394.     printf("Press any key to continue ...\n\n");
  395.     GetChar();

  396.     /* Send Tx Msg by Basic Mode Function (Without Message RAM) */
  397.     Test_BasicMode_Tx(tCAN);

  398.     /* Disable CAN */
  399.     CAN_Close(tCAN);

  400.     /* Disable CAN Clock and Reset it */
  401.     CAN_STOP();

  402.     while(1);

  403. }




dongnanxibei 发表于 2016-8-31 18:33 | 显示全部楼层
去掉那个for,不是也可以有中断标志清楚吗?
yiyigirl2014 发表于 2016-8-31 19:19 | 显示全部楼层
去掉那个死循环就行了。
戈卫东 发表于 2016-8-31 19:44 | 显示全部楼层
你根本就没有跳出的支路。。。。。怎么能怪人家呢。。。。。。
 楼主| we167527 发表于 2016-8-31 23:51 | 显示全部楼层
huangcunxiake 发表于 2016-8-31 17:57
你这不是废话,在中断里怎么可以使用死循环呢,就算是使用,也要给个跳出的条件啊。不跳出永远卡在里面。 ...

嗯。请帮我看看我程序哪里不对?我是想当接受到CAN帧的时候紧接这发送一帧。可是就是没有波形?把CAN0_Send()发送函数写在CAN0_IQRn中断入口里就一直发送这是为什么?难道开启中断后会一直执行一遍中断入口吗?(不管有没有帧被接受到)
1.png
2.png
3.png
 楼主| we167527 发表于 2016-8-31 23:52 | 显示全部楼层

官方写的不是我想要的。比如接受数据后的处理问题。
 楼主| we167527 发表于 2016-8-31 23:54 | 显示全部楼层
dongnanxibei 发表于 2016-8-31 18:33
去掉那个for,不是也可以有中断标志清楚吗?

嗯!去掉for(;;)就跳出中断了?但是是不是只要开启CAN中断。不管总线上有没有检测到数据程序都要跑一遍中断入口里的函数啊?不然CAN0_Send();为什么会一直发送?不过我写在main.c里就发不出去???这是为什么呢?
 楼主| we167527 发表于 2016-8-31 23:55 | 显示全部楼层
yiyigirl2014 发表于 2016-8-31 19:19
去掉那个死循环就行了。

嗯!不过又有新问题了
 楼主| we167527 发表于 2016-8-31 23:56 | 显示全部楼层
戈卫东 发表于 2016-8-31 19:44
你根本就没有跳出的支路。。。。。怎么能怪人家呢。。。。。。

嗯。不过现在有新的问题了。我吧CAN0_Send()写在int main(void)下发不出去。而写在CAN0中断里就发出去了?这是为什么???
戈卫东 发表于 2016-9-1 00:10 | 显示全部楼层
we167527 发表于 2016-8-31 23:56
嗯。不过现在有新的问题了。我吧CAN0_Send()写在int main(void)下发不出去。而写在CAN0中断里就发出去了 ...

CAN不懂。。。。。。。
yiyigirl2014 发表于 2016-9-4 10:29 | 显示全部楼层
如果在main发送不了,在中断可以,那肯定是你缺少了某个操作,比如清理某个寄存器标志位,而你在中断里做了这个操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:联系方式: QQ:864095840 邮箱:86095840@qq.com

54

主题

294

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部