gd32can初始化配置及注释
时间: 2023-07-07 08:45:39 浏览: 266
以下是基于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);
}
```
注释:
1. `rcu_periph_clock_enable(RCU_CAN0)`:使能CAN时钟
2. `gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8 | GPIO_PIN_9)`:配置CAN相关GPIO为复用功能
3. `gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8 | GPIO_PIN_9)`:配置CAN相关GPIO复用功能为CAN
4. `can_deinit(CAN0)`:复位CAN控制器
5. `can_init_struct`:CAN初始化结构体,使用`can_struct_para_init`函数初始化为默认值
6. `can_init_struct.can_frequency = 36000000U`:定义CAN时钟分频
7. `can_init_struct.can_tx_sjw = CAN_SJW_1TQ`:定义CAN发送同步跳转宽度
8. `can_init_struct.can_rx_sjw = CAN_SJW_1TQ`:定义CAN接收同步跳转宽度
9. `can_init_struct.can_bs1 = CAN_BS1_13TQ`:定义CAN位时间段1的时间长度
10. `can_init_struct.can_bs2 = CAN_BS2_2TQ`:定义CAN位时间段2的时间长度
11. `can_filter_init_struct`:CAN过滤器结构体,使用`can_filter_struct_para_init`函数初始化为默认值
12. `can_filter_init_struct.can_filter_bits = CAN_FILTERBITS_32BIT`:定义过滤器模式
13. `can_filter_init_struct.can_filter_id_high`:定义过滤器ID高位
14. `can_filter_init_struct.can_filter_id_low`:定义过滤器ID低位
15. `can_filter_init_struct.can_filter_mask_id_high`:定义过滤器掩码高位
16. `can_filter_init_struct.can_filter_mask_id_low`:定义过滤器掩码低位
17. `can_filter_init_struct.can_filter_fifo_number = CAN_FIFO0`:定义过滤器FIFO
18. `can_filter_enable(CAN0, 0)`:使能过滤器
19. `can_init(CAN0, &can_init_struct)`:初始化CAN控制器
20. `nvic_irq_enable(CAN0_RX0_IRQn, 0, 0)`:使能CAN中断
21. `can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0)`:使能CAN接收中断
22. `can_enable(CAN0)`:启动CAN控制器