GD32f103 CAN程序
时间: 2024-05-10 21:17:10 浏览: 7
以下是 GD32F103 上的 CAN 程序示例,你可以参考下面的代码:
```c
#include "gd32f10x.h"
void nvic_config(void);
void gpio_config(void);
void can_config(void);
int main(void)
{
/* NVIC configuration */
nvic_config();
/* GPIO configuration */
gpio_config();
/* CAN configuration */
can_config();
while(1);
}
void nvic_config(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(CAN0_RX1_IRQn, 1, 0);
}
void gpio_config(void)
{
/* Enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOB);
/* Configure CAN GPIO */
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
}
void can_config(void)
{
/* Enable CAN0 clock */
rcu_periph_clock_enable(RCU_CAN0);
/* CAN0 configuration */
can_struct_para_init(CAN_INIT_STRUCT);
CAN_INIT_STRUCT.can_time_triggered=DISABLE;
CAN_INIT_STRUCT.can_auto_bus_off_recovery=ENABLE;
CAN_INIT_STRUCT.can_transmit_fifo_en=DISABLE;
CAN_INIT_STRUCT.can_receive_fifo_number=0;
CAN_INIT_STRUCT.can_mode=CAN_MODE_NORMAL;
CAN_INIT_STRUCT.can_sjw=CAN_SJW_1TQ;
CAN_INIT_STRUCT.can_bs1=CAN_BS1_11TQ;
CAN_INIT_STRUCT.can_bs2=CAN_BS2_4TQ;
CAN_INIT_STRUCT.can_prescaler=6;
can_init(CAN0, &CAN_INIT_STRUCT);
/* CAN0 filter configuration */
can_filter_struct_para_init(CAN_FILTER_STRUCT);
CAN_FILTER_STRUCT.can_filter_number=0;
CAN_FILTER_STRUCT.can_filter_mode=CAN_FILTERMODE_IDMASK;
CAN_FILTER_STRUCT.can_filter_scale=CAN_FILTERSCALE_32BIT;
CAN_FILTER_STRUCT.can_filter_id_high=0x0000;
CAN_FILTER_STRUCT.can_filter_id_low=0x0000;
CAN_FILTER_STRUCT.can_filter_mask_id_high=0x0000;
CAN_FILTER_STRUCT.can_filter_mask_id_low=0x0000;
can_filter_init(&CAN_FILTER_STRUCT);
/* Enable CAN0 interrupt */
can_interrupt_enable(CAN0, CAN_INTEN_TMEIE | CAN_INTEN_FMPIE0 | CAN_INTEN_FFIE0);
}
void CAN0_RX1_IRQHandler(void)
{
/* Check CAN0 receive interrupt flag */
if (can_interrupt_flag_get(CAN0, CAN_INT_FLAG_RF1N) != RESET)
{
/* Clear CAN0 receive interrupt flag */
can_interrupt_flag_clear(CAN0, CAN_INT_FLAG_RF1N);
/* Receive data */
can_receive(CAN0, CAN_FIFO1, &rx_message);
/* TODO: Process received data */
}
}
```
上面的代码中,`nvic_config()` 函数用于配置 NVIC,`gpio_config()` 函数用于配置 GPIO,`can_config()` 函数用于配置 CAN。在 `main()` 函数中,我们首先调用这三个函数,然后进入一个无限循环。在 `CAN0_RX1_IRQHandler()` 中,我们处理 CAN 接收中断并处理接收到的数据。
需要注意的是,以上仅是一个示例程序,你需要根据你的具体需求进行修改和调整。