来公司实习,被安排使用这款国产RISC-V架构芯片做开发,从期待到裂开到想死@#*&%#&¥*(此处省略无数字),希望给使用这款芯片的小伙伴一些参考。欢迎大家私信交流,目前搞完CAN和CANFD的项目在翻越另一个项目大山的途中举步维艰......(第一是因为我刚出来实习经验不足,第二是这款芯片是23年底才上市的还处于测试阶段,内部资料和开发环境都还在更新中)
两个程序都是使用CAN0和CAN2进行通信,收到信息进入中断再由另一个CAN模块发送出去
Application文件夹下面包含board(时钟、引脚、can、uart模块配置)和src(main.c)两个文件夹,代码都在main.c里面
CAN
链接:https://pan.baidu.com/s/1HasRE6zly49pjKlTY7SQgg
提取码:sail
/** @addtogroup main_module main module documentation
* @{
*/
/* MODULE main */
/* Including necessary configuration files. */
#include "sdk_project_config.h"
#include "flexcan_driver.h"
#include "flexcan_register.h"
#include "flexcan_hw_access.h"
#include "pins_hw_access.h"
#include <stdbool.h>
#include <stdint.h>
#include "log.h"
flexcan_msgbuff_t recvBuff;
const flexcan_id_table_t id_filter_table [3] = {
{false, false, 0},
{false, false, 1},
{false, false, 0x3DA}
};
void SendCanStandardData(uint8_t index,uint32_t mailbox, flexcan_msgbuff_t txMsg)
{
uint32_t mask=1<<21;
flexcan_data_info_t dataInfo;
dataInfo.data_length = 8;
if((recvBuff.cs&mask)!=0){
/*EXT*/
dataInfo.msg_id_type = FLEXCAN_MSG_ID_EXT;
}else{
/*STD*/
dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
}
// dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
dataInfo.enable_brs = false;
dataInfo.fd_enable = false;
dataInfo.fd_padding = 0U;
dataInfo.is_remote =false;
FLEXCAN_DRV_ConfigTxMb(index, 10, &dataInfo, txMsg.msgId);
FLEXCAN_DRV_Send(index, 10, &dataInfo, txMsg.msgId, txMsg.data);
}
//flexcan_callback_t myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState);
void myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState)
{
if(eventType==FLEXCAN_EVENT_RXFIFO_COMPLETE){
FLEXCAN_DRV_RxFifo(instance, &recvBuff);
uint32_t canx;
canx=instance==INST_FLEXCAN_0?INST_FLEXCAN_2:INST_FLEXCAN_0;
SendCanStandardData(INST_FLEXCAN_2,10,recvBuff);
}
}
void flexcan_init(void){
FLEXCAN_DRV_Init(INST_FLEXCAN_0, &g_stFlexcanState_0, &g_stFlexcan0UserConfig0);
FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_0,myFlexCanCallback,NULL);
FLEXCAN_DRV_Init(INST_FLEXCAN_2, &g_stFlexcanState_2, &g_stFlexcan2UserConfig0);
FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_2,myFlexCanCallback,NULL);
FLEXCAN_DRV_ConfigRxFifo(INST_FLEXCAN_0,FLEXCAN_RX_FIFO_ID_FORMAT_A,id_filter_table);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_STD,0);
FLEXCAN_DRV_RxFifo(INST_FLEXCAN_0, &recvBuff);
FLEXCAN_DRV_ConfigRxFifo(INST_FLEXCAN_2,FLEXCAN_RX_FIFO_ID_FORMAT_A,id_filter_table);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_STD,0);
FLEXCAN_DRV_RxFifo(INST_FLEXCAN_2, &recvBuff);
}
int _write(int file, char *ptr, int len)
{
UART_DRV_SendDataBlocking(INST_UART_1, (uint8_t *)ptr, len, 10U);
// UART_DRV_SendData(INST_UART_0, (uint8_t *)ptr, len);
return len;
}
int main(void)
{
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_stPinmuxConfigArr);
CLOCK_SYS_Init(g_pstClockManConfigsArr[0]);
UART_DRV_Init(INST_UART_1, &g_stUartState_0, &g_stUart0UserConfig0);
printf("main\n");
flexcan_init();
while(1){
}
}
CAN FD
链接:https://pan.baidu.com/s/1C7yeQoZF-WtRHmSbkJTbdg
提取码:sail
/** @addtogroup main_module main module documentation
* @{
*/
/* MODULE main */
/* Including necessary configuration files. */
#include "sdk_project_config.h"
#include "flexcan_driver.h"
#include "flexcan_register.h"
#include "flexcan_hw_access.h"
#include "pins_hw_access.h"
#include <stdbool.h>
#include <stdint.h>
#include "log.h"
uint32_t mask=1<<21;
uint32_t EDL=1<<31;
uint32_t BRS=1<<30;
flexcan_msgbuff_t recvBuff;
const flexcan_id_table_t id_filter_table [3] = {
{false, false, 0},
{false, false, 1},
{false, false, 0x3DA}
};
const flexcan_enhancedIdTableType_t id_filter_tablefd[4] = {
{FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, false, false, false, 1, 0},
{FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, false, false, false, 2, 0},
{FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, true , false, false, 1, 0},
{FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, true , false, false, 2, 0},
};
int _write(int file, char *ptr, int len)
{
UART_DRV_SendDataBlocking(INST_UART_1, (uint8_t *)ptr, len, 10U);
// UART_DRV_SendData(INST_UART_0, (uint8_t *)ptr, len);
return len;
}
void SendCanData(uint8_t index,uint32_t mailbox, flexcan_msgbuff_t txMsg)
{
flexcan_data_info_t dataInfo;
dataInfo.data_length = txMsg.dataLen;
if((recvBuff.cs&mask)!=0){
/*EXT*/
dataInfo.msg_id_type = FLEXCAN_MSG_ID_EXT;
}else{
/*STD*/
dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
}
// dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
if((recvBuff.cs&EDL)!=0){
dataInfo.fd_enable = true;
if((recvBuff.cs&BRS)!=0){
dataInfo.enable_brs = true;
}else{
dataInfo.enable_brs = false;
}
dataInfo.fd_padding = 0xFF;
}else{
dataInfo.enable_brs = false;
dataInfo.fd_enable = false;
dataInfo.fd_padding = 0U;
}
dataInfo.is_remote =false;
// FLEXCAN_DRV_ConfigTxMb(index, 10, &dataInfo, txMsg.msgId);
FLEXCAN_DRV_Send(index, 10, &dataInfo, txMsg.msgId, txMsg.data);
}
//flexcan_callback_t myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState);
void myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState)
{
if(eventType==FLEXCAN_EVENT_ENHANCED_RXFIFO_COMPLETE){
FLEXCAN_DRV_RxFifo(instance, &recvBuff);
uint32_t canx;
canx=instance==INST_FLEXCAN_0?INST_FLEXCAN_2:INST_FLEXCAN_0;
SendCanData(canx,10,recvBuff);
}
}
void flexcan_init(void){
FLEXCAN_DRV_Init(INST_FLEXCAN_0, &g_stFlexcanState_0, &g_stFlexcan0UserConfig0);
FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_0,myFlexCanCallback,NULL);
FLEXCAN_DRV_Init(INST_FLEXCAN_2, &g_stFlexcanState_2, &g_stFlexcan2UserConfig0);
FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_2,myFlexCanCallback,NULL);
FLEXCAN_DRV_ConfigEnhancedRxFifo(INST_FLEXCAN_0, id_filter_tablefd);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_STD,0);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_EXT,0);
FLEXCAN_DRV_RxFifo(INST_FLEXCAN_0, &recvBuff);
FLEXCAN_DRV_ConfigEnhancedRxFifo(INST_FLEXCAN_2, id_filter_tablefd);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_STD,0);
FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_EXT,0);
FLEXCAN_DRV_RxFifo(INST_FLEXCAN_2, &recvBuff);
}
int main(void)
{
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_stPinmuxConfigArr);
CLOCK_SYS_Init(g_pstClockManConfigsArr[0]);
UART_DRV_Init(INST_UART_1, &g_stUartState_0, &g_stUart0UserConfig0);
printf("main\n");
PINS_DRV_WritePin(PORTD,2,1);
flexcan_init();
while(1){
}
}