c - STM32F4 Discovery and CAN programming -


i trying start learning programming , trying code work: https://github.com/espruino/espruino/blob/master/targetlibs/stm32f4/lib/stm32f4xx_can.c using atollic trustudio lite.

i did basic led blinking code discovery, other that. have no clue how this.

i don't how supposed simulate can message (and other things) via stm32.

i total beginner, please, don't rip throat out.

thanks

here's example of can loopback can try. it's can loopback test. it's in stm32f4 examples can download stm website. stm32439 eval board should work on discovery. (both stm32f4 chips).

#define use_can1 /* uncomment line below if use can 2 peripheral */ /* #define use_can2 */  #ifdef  use_can1   #define canx              can1   #define can_clk           rcc_apb1periph_can1        #else /* use_can2 */   #define canx              can2   #define can_clk           (rcc_apb1periph_can1 | rcc_apb1periph_can2)    #endif  /* use_can1 */  typedef enum {failed = 0, passed = !failed} teststatus;  __io uint32_t ret = 0; /* return of interrupt handling */ volatile teststatus testrx;  teststatus can_polling(void);  int main(void) {     /*!< @ stage microcontroller clock setting configured,         done through systeminit() function called startup        files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s)        before branch application main.         reconfigure default setting of systeminit() function, refer        system_stm32f4xx.c file      */         /* canx periph clock enable */     rcc_apb1periphclockcmd(can_clk, enable);      /* initialize leds mounted on eval board */     stm_eval_ledinit(led1);     stm_eval_ledinit(led2);      /* can transmit @ 125kb/s , receive polling in loopback mode */     testrx = can_polling();      if (testrx !=  failed) { /* ok */         /* turn on led1 */         stm_eval_ledon(led1);     } else { /* ko */         /* turn on led2 */         stm_eval_ledon(led2);     }      /* infinite loop */     while (1) { } }  /**  * @brief  configures can, transmit , receive polling  * @param  none  * @retval passed if reception done, failed in other case  */ teststatus can_polling(void) {     can_inittypedef        can_initstructure;     can_filterinittypedef  can_filterinitstructure;     cantxmsg txmessage;     canrxmsg rxmessage;     uint32_t uwcounter = 0;     uint8_t transmitmailbox = 0;      /* can register init */     can_deinit(canx);      /* 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;     can_initstructure.can_txfp = disable;     can_initstructure.can_mode = can_mode_loopback;     can_initstructure.can_sjw = can_sjw_1tq;      /* can baudrate = 175kbps (can clocked @ 42 mhz) */     can_initstructure.can_bs1 = can_bs1_6tq;     can_initstructure.can_bs2 = can_bs2_8tq;     can_initstructure.can_prescaler = 16;     can_init(canx, &can_initstructure);      /* can filter init */ #ifdef  use_can1     can_filterinitstructure.can_filternumber = 0; #else /* use_can2 */     can_filterinitstructure.can_filternumber = 14; #endif  /* use_can1 */     can_filterinitstructure.can_filtermode = can_filtermode_idmask;     can_filterinitstructure.can_filterscale = can_filterscale_32bit;     can_filterinitstructure.can_filteridhigh = 0x0000;     can_filterinitstructure.can_filteridlow = 0x0000;     can_filterinitstructure.can_filtermaskidhigh = 0x0000;     can_filterinitstructure.can_filtermaskidlow = 0x0000;       can_filterinitstructure.can_filterfifoassignment = 0;      can_filterinitstructure.can_filteractivation = enable;     can_filterinit(&can_filterinitstructure);      /* transmit */     txmessage.stdid = 0x11;     txmessage.rtr = can_rtr_data;     txmessage.ide = can_id_std;     txmessage.dlc = 2;     txmessage.data[0] = 0xca;     txmessage.data[1] = 0xfe;      transmitmailbox = can_transmit(canx, &txmessage);     uwcounter = 0;     while((can_transmitstatus(canx, transmitmailbox)  !=  cantxok) && (uwcounter  !=  0xffff)) {         uwcounter++;     }      uwcounter = 0;     while((can_messagepending(canx, can_fifo0) < 1) && (uwcounter  !=  0xffff)) {         uwcounter++;     }      /* receive */     rxmessage.stdid = 0x00;     rxmessage.ide = can_id_std;     rxmessage.dlc = 0;     rxmessage.data[0] = 0x00;     rxmessage.data[1] = 0x00;     can_receive(canx, can_fifo0, &rxmessage);      if (rxmessage.stdid != 0x11) {         return failed;       }      if (rxmessage.ide != can_id_std) {         return failed;     }      if (rxmessage.dlc != 2) {         return failed;       }      if ((rxmessage.data[0]<<8|rxmessage.data[1]) != 0xcafe) {         return failed;     }      return passed; /* test passed */ } 

Comments

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Magento/PHP - Get phones on all members in a customer group -

session - Logging Out Using PHP -