Closed sdmm closed 8 years ago
在bsp/stm32f10x/drivers/bxcan.c中 static const rt_uint32_t bxcan_baud_rate_tab[] = { // 48 M MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 3), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_6tq, CAN_BS2_3tq, 6), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 5), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 11), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 23), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 29), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 59), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 149), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_16tq, CAN_BS2_8tq, 199), };
((bxcan_baud_rate_tab[NO] & TYPE##MASK) >> TYPE##SHIFT)
CAN_InitStructure.CAN_SJW = BAUDDATA(SJW, baud); 而在rt-thread/components/drivers/include/drivers/can.h里 enum CANBAUD { CAN1MBaud = 1000UL * 1000,/* 1 MBit/sec / CAN800kBaud = 1000UL * 800, / 800 kBit/sec / CAN500kBaud = 1000UL * 500, / 500 kBit/sec / CAN250kBaud = 1000UL * 250, / 250 kBit/sec / CAN125kBaud = 1000UL * 125, / 125 kBit/sec / CAN100kBaud = 1000UL * 100, / 100 kBit/sec / CAN50kBaud = 1000UL * 50, / 50 kBit/sec / CAN20kBaud = 1000UL * 20, / 20 kBit/sec / CAN10kBaud = 1000UL * 10 /_ 10 kBit/sec */ }; 当把CAN1MBaud作为参数传入时,BAUD_DATA(TYPE,CAN1MBaud) 造成数组越界。
嗯,确实有这个问题。 @aozima 当初为什么要改这个呢, 在这里 defa6f37ff52bdd42ab754cf02e7e79c74b3457b
在bsp/stm32f10x/drivers/bxcan.c中 static const rt_uint32_t bxcan_baud_rate_tab[] = { // 48 M MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 3), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_6tq, CAN_BS2_3tq, 6), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 5), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 11), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 23), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 29), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 59), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 149), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_16tq, CAN_BS2_8tq, 199), };
define BAUD_DATA(TYPE,NO) \
CAN_InitStructure.CAN_SJW = BAUDDATA(SJW, baud); 而在rt-thread/components/drivers/include/drivers/can.h里 enum CANBAUD { CAN1MBaud = 1000UL * 1000,/* 1 MBit/sec / CAN800kBaud = 1000UL * 800, / 800 kBit/sec / CAN500kBaud = 1000UL * 500, / 500 kBit/sec / CAN250kBaud = 1000UL * 250, / 250 kBit/sec / CAN125kBaud = 1000UL * 125, / 125 kBit/sec / CAN100kBaud = 1000UL * 100, / 100 kBit/sec / CAN50kBaud = 1000UL * 50, / 50 kBit/sec / CAN20kBaud = 1000UL * 20, / 20 kBit/sec / CAN10kBaud = 1000UL * 10 /_ 10 kBit/sec */ }; 当把CAN1MBaud作为参数传入时,BAUD_DATA(TYPE,CAN1MBaud) 造成数组越界。