gd32can功能配置及注释
时间: 2023-07-12 21:40:28 浏览: 74
以下是基于GD32F3xx系列芯片的CAN功能配置及注释示例:
```c
#include "gd32f3xx.h"
void CAN_Configuration(void)
{
/* 使能CAN时钟 */
rcu_periph_clock_enable(RCU_CAN0);
/* 配置CAN GPIO */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8 | GPIO_PIN_9);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9);
gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8 | GPIO_PIN_9);
/* CAN 初始化 */
can_deinit(CAN0);
can_struct_para_init(&can_init_struct);
/* 定义CAN时钟分频 */
can_init_struct.can_frequency = 36000000U;
/* 定义CAN位速率 */
can_init_struct.can_tx_sjw = CAN_SJW_1TQ;
can_init_struct.can_rx_sjw = CAN_SJW_1TQ;
can_init_struct.can_bs1 = CAN_BS1_13TQ;
can_init_struct.can_bs2 = CAN_BS2_2TQ;
/* 定义过滤器 */
can_filter_struct_para_init(&can_filter_init_struct);
/* 过滤器模式 */
can_filter_init_struct.can_filter_bits = CAN_FILTERBITS_32BIT;
/* 过滤器ID */
can_filter_init_struct.can_filter_id_high = 0x0000;
can_filter_init_struct.can_filter_id_low = 0x0000;
/* 过滤器掩码 */
can_filter_init_struct.can_filter_mask_id_high = 0x0000;
can_filter_init_struct.can_filter_mask_id_low = 0x0000;
/* 过滤器FIFO */
can_filter_init_struct.can_filter_fifo_number = CAN_FIFO0;
/* 过滤器使能 */
can_filter_enable(CAN0, 0);
/* CAN 初始化 */
can_init(CAN0, &can_init_struct);
/* 配置CAN中断 */
nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);
can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);
/* 启动CAN */
can_enable(CAN0);
}
void CAN_Transmit(uint8_t* data, uint8_t len, uint32_t id)
{
can_trasnmit_message_struct transmit_message;
/* 定义传输结构体 */
can_struct_para_init(&transmit_message);
/* 定义传输格式 */
transmit_message.tx_sfid = id;
transmit_message.tx_efid = 0x00;
transmit_message.tx_ff = CAN_FF_STANDARD;
transmit_message.tx_ft = CAN_FT_DATA;
/* 定义传输数据 */
for (uint8_t i = 0; i < len; i++)
{
transmit_message.tx_data[i] = data[i];
}
/* 定义传输数据长度 */
transmit_message.tx_dlen = len;
/* 发送消息 */
can_message_transmit(CAN0, &transmit_message);
}
void CAN_Receive(uint8_t* data, uint8_t* len, uint32_t* id)
{
can_receive_message_struct receive_message;
/* 定义接收结构体 */
can_struct_para_init(&receive_message);
/* 接收消息 */
can_message_receive(CAN0, CAN_FIFO0, &receive_message);
/* 获取接收数据 */
*id = receive_message.rx_sfid;
*len = receive_message.rx_dlen;
for (uint8_t i = 0; i < *len; i++)
{
data[i] = receive_message.rx_data[i];
}
}
```
注释:
1. `CAN_Transmit`函数:定义CAN发送函数
2. `can_trasnmit_message_struct`:CAN发送结构体,使用`can_struct_para_init`函数初始化为默认值
3. `transmit_message.tx_sfid = id`:定义CAN标准帧ID
4. `transmit_message.tx_ff = CAN_FF_STANDARD`:定义CAN标准帧格式
5. `transmit_message.tx_ft = CAN_FT_DATA`:定义CAN数据帧类型
6. `transmit_message.tx_data[i] = data[i]`:定义CAN数据
7. `transmit_message.tx_dlen = len`:定义CAN数据长度
8. `can_message_transmit(CAN0, &transmit_message)`:发送CAN消息
9. `CAN_Receive`函数:定义CAN接收函数
10. `can_receive_message_struct`:CAN接收结构体,使用`can_struct_para_init`函数初始化为默认值
11. `can_message_receive(CAN0, CAN_FIFO0, &receive_message)`:接收CAN消息
12. `*id = receive_message.rx_sfid`:获取CAN标准帧ID
13. `*len = receive_message.rx_dlen`:获取CAN数据长度
14. `data[i] = receive_message.rx_data[i]`:获取CAN数据