LiuDuanWu 2023-11-08 15:16 采纳率: 100%
浏览 8
已结题

gd32f103c8t6 使用oled显示can接收的内容并存储

主控使用gd32f103c8t6
使用1.3寸oled屏显示can协议接收到的内容并存储到内部falsh
要求can协议必须使用pa11,12脚 能正常接收发送数据 oled能正常显示内容
存储falsh数据必须是一条一条的 比如一个门有很多状态 can接收到开门状态 就在oled上面显示开门 并存储到falsh上去 ,
用户设置了门锁密码就存储门锁密码 falsh的存储不会影响其他存储在falsh里面的数据

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-08 18:38
    关注

    【以下回答由 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();
        }
    }
    

    以上就是完整的操作步骤和代码示例,可以根据实际情况进行修改和调整。如果还有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 已采纳回答 11月9日
  • 创建了问题 11月8日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改