完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Chip is ESP32-D0WD-V3 (revision 3)
idf-4.3 问题:其他任务全部屏蔽,只有一个CAN初始化操作,在执行到中断注册时导致程序崩掉。 代码: int local_CAN_init(void) { //gpio_pad_select_gpioSelect pad as a gpio function from IOMUX //Time quantum double __tq; ESP_LOGW(TAG, "go into local_CAN_init"); CAN_cfg.speed = CAN_SPEED_125KBPS; CAN_cfg.tx_pin_id = 23; CAN_cfg.rx_pin_id = 22; //enable module DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST); //configure TX pin gpio_set_level(CAN_cfg.tx_pin_id, 1); gpio_set_direction(CAN_cfg.tx_pin_id,GPIO_MODE_OUTPUT); gpio_matrix_out(CAN_cfg.tx_pin_id,CAN_TX_IDX,0,0); gpio_pad_select_gpio(CAN_cfg.tx_pin_id); //configure RX pin gpio_set_direction(CAN_cfg.rx_pin_id,GPIO_MODE_INPUT); gpio_matrix_in(CAN_cfg.rx_pin_id,CAN_RX_IDX,0); gpio_pad_select_gpio(CAN_cfg.rx_pin_id); //set to PELICAN mode MODULE_CAN->CDR.B.CAN_M=0x1; //synchronization jump width is the same for all baud rates MODULE_CAN->BTR0.B.SJW =0x1; //TSEG2 is the same for all baud rates MODULE_CAN->BTR1.B.TSEG2 =0x1; //select time quantum and set TSEG1 switch(CAN_cfg.speed){ case CAN_SPEED_1000KBPS: MODULE_CAN->BTR1.B.TSEG1 =0x4; __tq = 0.125; break; case CAN_SPEED_800KBPS: MODULE_CAN->BTR1.B.TSEG1 =0x6; __tq = 0.125; break; default: MODULE_CAN->BTR1.B.TSEG1 =0xc; __tq = ((float)1000/CAN_cfg.speed) / 16; } //set baud rate prescaler MODULE_CAN->BTR0.B.BRP=(uint8_t)round((((APB_CLK_FREQ * __tq) / 2) - 1)/1000000)-1; /* Set sampling * 1 -> triple; the bus is sampled three times; recommended for low/medium speed buses (class A and B) where filtering spikes on the bus line is beneficial * 0 -> single; the bus is sampled once; recommended for high speed buses (SAE class C)*/ MODULE_CAN->BTR1.B.SAM =0x1; //enable all interrupts MODULE_CAN->IER.U = 0xff; //no acceptance filtering, as we want to fetch all messages MODULE_CAN->MBX_CTRL.ACC.CODE[0] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[1] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[2] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[3] = 0; MODULE_CAN->MBX_CTRL.ACC.MASK[0] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[1] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[2] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[3] = 0xff; //set to normal mode MODULE_CAN->OCR.B.OCMODE=__CAN_OC_NOM; //clear error counters MODULE_CAN->TXERR.U = 0; MODULE_CAN->RXERR.U = 0; (void)MODULE_CAN->ECC; //clear interrupt flags (void)MODULE_CAN->IR.U; ESP_LOGW(TAG, "go into esp_intr_alloc"); //install CAN ISR esp_err_t err = esp_intr_alloc(ETS_CAN_INTR_SOURCE,0,CAN_isr,NULL,NULL); ESP_LOGW(TAG, "Error (%s) local_CAN_init!", esp_err_to_name(err)); //Showtime. Release Reset Mode. MODULE_CAN->MOD.B.RM = 0; // printf("CAN_cfg.speed:%drn",CAN_cfg.speed); // printf("CAN_cfg.tx_pin_id:%drn",CAN_cfg.tx_pin_id); // printf("CAN_cfg.rx_pin_id:%drn",CAN_cfg.rx_pin_id); //xTaskCreate(can_rx_task, "can_rx_task", 2048 * 2, (void *)0, 4, NULL); ESP_LOGW(TAG, "go out local_CAN_init"); return 0; } 重启日志: fe80:0000:0000:0000:3694:54ff:fef5:55d8, type: ESP_IP6_ADDR_IS_LINK_LOCAL[0m every init -- end----------- [0;33mW (3081) ESP_CAN: go into local_CAN_init[0m [0;33mW (3081) ESP_CAN: go into esp_intr_alloc[0m abort() was called at PC 0x40082b13 on core 1 Backtrace:0x40087ff7:0x3ffb0cc0 0x400887c9:0x3ffb0ce0 0x4008f5be:0x3ffb0d00 0x40082b13:0x3ffb0d70 0x40082c5d:0x3ffb0da0 0x4013d6aa:0x3ffb0dc0 0x40132b9d:0x3ffb0df0 0x400d7d3a:0x3ffb0e10 0x40082939:0x3ffb0e30 0x4000bfed:0x3ffc8a80 0x4008beea:0x3ffc8a90 0x400dc7e7:0x3ffc8ab0 0x400dc849:0x3ffc8af0 0x400d804e:0x3ffc8b20 0x400d734c:0x3ffc8b40 0x4008bc81:0x3ffc8b70 麻烦给看下,谢谢 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
472浏览 6评论
397浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
376浏览 5评论
383浏览 4评论
353浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-27 07:24 , Processed in 0.659714 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号