主控使用gd32f103c8t6
使用1.3寸oled屏显示can协议接收到的内容并存储到内部falsh
要求can协议必须使用pa11,12脚 能正常接收发送数据 oled能正常显示内容
存储falsh数据必须是一条一条的 比如一个门有很多状态 can接收到开门状态 就在oled上面显示开门 并存储到falsh上去 ,
用户设置了门锁密码就存储门锁密码 falsh的存储不会影响其他存储在falsh里面的数据
gd32f103c8t6 使用oled显示can接收的内容并存储
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 【以下回答由 GPT 生成】
问题分析
这个问题需要实现以下几个步骤: 1. 初始化CAN控制器,设置CAN通信参数以及相关的中断。 2. 初始化OLED屏幕,配置显示内容。 3. 在CAN接收中断中,将接收到的数据显示在OLED屏幕上,并将其存储到Flash中。
操作步骤与代码示例
步骤一:初始化CAN控制器
首先,需要初始化CAN控制器,并设置CAN通信参数以及相关的中断。
#include <gd32f30x.h> // 定义CAN接收数据的结构体 typedef struct { uint8_t data[8]; // 数据 uint8_t len; // 数据长度 } CAN_Message; CAN_Message canRxMsg; // 定义CAN接收数据的全局变量 void initCAN(void) { can_parameter_struct can_parameter; can_fd_transmit_message_struct transmit_message; can_timeout_parameter_struct can_time_out = { .time_out_brp = 2, .time_out_sjw = CAN_BTFSJW_1TQ, .time_out_bs1 = CAN_BTSBS_4TQ, .time_out_bs2 = CAN_BTSBS_2TQ }; rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_GPIOA); // 配置PA11和PA12为CAN引脚 gpio_af_set(GPIOA, GPIO_AF_9, GPIO_PIN_11); gpio_af_set(GPIOA, GPIO_AF_9, GPIO_PIN_12); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_11 | GPIO_PIN_12); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12); // 初始化CAN can_deinit(CAN0); can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = ENABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.no_auto_retrans = ENABLE; can_parameter.ref_msg = DISABLE; can_parameter.auto_retrans = ENABLE; can_time_out.time_out_recover = ENABLE; can_init(CAN0, &can_parameter, CAN_BT_BA_75K, &can_time_out); can_interrupt_disable(CAN0, CAN_INTEN_TMEIE); can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); // 配置CAN0接收中断优先级 nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3); nvic_irq_enable(CAN0_RX0_IRQn, 1U, 1U); } // CAN0接收中断处理函数 void CAN0_RX0_IRQHandler(void) { // 判断是否接收到数据帧 if (can_receive_message_length_get(CAN0, CAN_FIFO0)) { // 读取接收到的数据 can_message_receive(CAN0, CAN_FIFO0, &canRxMsg); // 处理接收到的数据,可以在此处进行OLED屏幕显示以及数据存储的操作 // ... } }
步骤二:初始化OLED屏幕
接下来,需要初始化OLED屏幕,并配置显示内容。
#include <gd32f30x.h> void initOLED(void) { // 初始化OLED屏幕,具体操作请参考OLED屏幕的驱动文档 // ... } void displayTextOnOLED(char* text) { // 在OLED屏幕上显示文本,具体操作请参考OLED屏幕的驱动文档 // ... }
步骤三:CAN数据显示和存储
在CAN接收中断处理函数中,将接收到的数据显示在OLED屏幕上,并将其存储到Flash中。
void CAN0_RX0_IRQHandler(void) { if (can_receive_message_length_get(CAN0, CAN_FIFO0)) { can_message_receive(CAN0, CAN_FIFO0, &canRxMsg); // 在OLED屏幕上显示接收到的CAN数据 displayTextOnOLED((char*)canRxMsg.data); // 将接收到的CAN数据存储到Flash中 FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); FLASH_ErasePage(FLASH_START_ADDR); for (uint8_t i = 0; i < canRxMsg.len; i++) { FLASH_ProgramByte(FLASH_START_ADDR + i, canRxMsg.data[i]); } FLASH_Lock(); } }
以上就是完整的操作步骤和代码示例,可以根据实际情况进行修改和调整。如果还有其他问题,请随时提问。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 关于用python写支付宝扫码付异步通知收不到的问题
- ¥50 vue组件中无法正确接收并处理axios请求
- ¥15 隐藏系统界面pdf的打印、下载按钮
- ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
- ¥15 基于pso参数优化的LightGBM分类模型
- ¥15 安装Paddleocr时报错无法解决
- ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
- ¥50 分布式追踪trace异常问题
- ¥15 人在外地出差,速帮一点点
- ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改