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
Post a Comment