#include "SWM221.h" void SerialInit(void); int main(void) { // 定义发送数据数组,包含8个字节 uint8_t tx_data[8] = {1, 2, 3, 4, 5, 6, 7, 8}; CAN_InitStructure CAN_initStruct; // CAN初始化结构体 CAN_RXMessage CAN_msg; // CAN接收消息结构体 SystemInit(); // 系统时钟、内存、中断等初始化 SerialInit(); // 串口通信初始化(用于后续数据打印) GPIO_Init(GPIOA, PIN3, 1, 0, 1, 0); //输出,MCU拉低使能 // 初始化PORTB引脚7和8为CAN0的RX/TX功能(具体复用功能需参考芯片手册) // 参数:端口, 引脚号, 复用功能, 上拉/下拉使能(1-使能,0-禁用) PORT_Init(PORTB, PIN7, PORTB_PIN7_CAN0_RX, 1); // CAN0接收引脚 PORT_Init(PORTB, PIN8, PORTB_PIN8_CAN0_TX, 0); // CAN0发送引脚 // 配置CAN初始化参数 CAN_initStruct.Mode = CAN_MODE_SELFTEST; // 自测模式(需短接TX和RX) CAN_initStruct.CAN_bs1 = CAN_BS1_5tq; // 位时间段1占5个时间单位 CAN_initStruct.CAN_bs2 = CAN_BS2_4tq; // 位时间段2占4个时间单位 CAN_initStruct.CAN_sjw = CAN_SJW_2tq; // 同步跳转宽度2个时间单位 CAN_initStruct.Baudrate = 50000; // 波特率50kbps CAN_initStruct.RXNotEmptyIEn = 0; // 启用接收中断 CAN_initStruct.ArbitrLostIEn = 0; // 禁用仲裁丢失中断 CAN_initStruct.ErrPassiveIEn = 0; // 禁用错误被动中断 CAN_Init(CAN0, &CAN_initStruct); // 应用配置初始化CAN0 // 设置CAN过滤器(32位模式) // 参数:CAN模块, 过滤器号, 标识符ID, 掩码(掩码0x1FFFFFFE表示允许ID最低位变化) // 功能:接收扩展ID为0x00122122和0x00122123的帧 CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE); // 设置CAN过滤器(16位模式) // 参数:CAN模块, 过滤器号, ID1, 掩码1, ID2, 掩码2 // 功能:接收标准ID为0x122、0x123(掩码0x7FE)和0x101(掩码0x7FF)的帧 CAN_SetFilter16b(CAN0, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF); CAN_Open(CAN0); // 启动CAN0控制器 // 发送标准数据帧(ID: 0x122, 数据长度8字节, 启用自动重传) CAN_Transmit(CAN0, CAN_FRAME_STD, 0x122, tx_data, 8, 1); while(CAN_TXComplete(CAN0) == 0) __NOP(); // 等待发送完成 // 发送扩展数据帧(ID: 0x122122, 数据长度8字节, 启用自动重传) CAN_Transmit(CAN0, CAN_FRAME_EXT, 0x122122, tx_data, 8, 1); while(CAN_TXComplete(CAN0) == 0) __NOP(); // 等待发送完成 // 循环读取所有接收到的CAN消息并通过串口打印 while(CAN_RXDataAvailable(CAN0)) { CAN_Receive(CAN0, &CAN_msg); // 从缓冲区读取消息 // 打印帧类型和ID printf("\r\nReceive %s %08X: ", CAN_msg.format == CAN_FRAME_STD ? "STD" : "EXT", CAN_msg.id); // 打印数据内容(十六进制格式) for(int i = 0; i < CAN_msg.size; i++) printf("%02X, ", CAN_msg.data[i]); } // 主循环(保持程序运行) while(1==1) { } } /* * 函数名:SerialInit * 功能:初始化UART0串口通信 * 参数:无 * 返回值:无 * 注:配置PA.0为UART0_RX(带上拉),PA.1为UART0_TX(无上拉) * 波特率57600,8位数据,无校验,1位停止位 * FIFO阈值:收发均在3字节时触发(中断未使能) * 接收超时时间10个单位(具体单位参考硬件手册),超时中断未使能 */ void SerialInit(void) { UART_InitStructure UART_initStruct; // 配置PA0引脚为UART0接收功能,启用上拉(参数1) PORT_Init(PORTA, PIN0, PORTA_PIN0_UART0_RX, 1); // 配置PA1引脚为UART0发送功能,禁用上拉(参数0) PORT_Init(PORTA, PIN1, PORTA_PIN1_UART0_TX, 0); // 初始化UART配置结构体 UART_initStruct.Baudrate = 57600; // 波特率57600bps UART_initStruct.DataBits = UART_DATA_8BIT; // 8位数据位 UART_initStruct.Parity = UART_PARITY_NONE; // 无校验 UART_initStruct.StopBits = UART_STOP_1BIT; // 1位停止位 UART_initStruct.RXThreshold = 3; // 接收FIFO阈值3字节 UART_initStruct.RXThresholdIEn = 0; // 禁用接收阈值中断 UART_initStruct.TXThreshold = 3; // 发送FIFO阈值3字节 UART_initStruct.TXThresholdIEn = 0; // 禁用发送阈值中断 UART_initStruct.TimeoutTime = 10; // 接收超时时间(单位依硬件而定) UART_initStruct.TimeoutIEn = 0; // 禁用超时中断 // 应用配置并启用UART0 UART_Init(UART0, &UART_initStruct); // 初始化UART0参数 UART_Open(UART0); // 启动UART0通信 } /********************************************************************************************* * 函数名称: fputc() * 功能说明: printf()使用此函数完成实际的串口打印动作 * 输 入: int ch 要打印的字符 * FILE *f 文件句柄 * 输 出: 无 * 注意事项: 无 **********************************************************************************************/ int fputc(int ch, FILE *f) { UART_WriteByte(UART0, ch); while(UART_IsTXBusy(UART0)); return ch; }