今天有客户反应,我们没有提供双CAN的标准外设库例子,我以为大家都在用HAL库了![](static/image/smiley/default/smile.gif)
于是,拿了ST的CAN例子,稍微花了点时间,把它移值到了我们的FCM32F092上面,增加了第二个CAN的收发。
移值很简单,就以下步骤:
本例子演示了如何在stm32f091上增加第二个CAN,即移值到fcm32f092xx。
本例子移值自STM32F0xx_StdPeriph_Examples/CAN/CAN_Networking
1 拷贝工程STM32F0xx_StdPeriph_Templates,并在Keil中将工程目标(Project Targets)从STM32F091重命名为FCM32F092。
(此修改无实际用处,只是为了和STM32F091进行区分)
2 工程设定中将RAM大小修改为0x6000(24KB)
3 将STM32F0xx_StdPeriph_Examples/CAN/CAN_Networking目录下的h和c拷贝过来并覆盖原来的
4 添加Utilities\STM32_EVAL\STM32072B_EVAL\stm32072b_eval.c
5 工程选项中,添加包含路径:
..\..\..\Libraries\CMSIS\Include
..\..\..\Utilities\STM32_EVAL\STM32072B_EVAL
..\..\..\Utilities\STM32_EVAL\Common
6 编译工程,保证无错误。
*** 以上修改,为建立CAN_Networking工程的必要操作,并未涉及移植到FCM32F092相关内容 ***
7 修改can相关驱动及定义,增加CAN2
(某些文件为只读,请去掉只读属性)
7.1 stm32f0xx_can.h
#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN) || ((PERIPH) == CAN2))
7.2 stm32f0xx_can.c
void CAN_DeInit(CAN_TypeDef* CANx)
{
// 增加CANx的判断,以及对应CAN2的去初始化
}
7.3 stm32f0xx_rcc.c
增加CAN2相关的位定义,可搜索CAN2。相关内容从fcm32f096xc.h拷贝。
7.4 stm32f0xx.h
增加CAN2相关的定义,可搜索CAN2。
增加filter相关位的定义,原单个CAN为14个,增加到28个。
8 main.c
增加CAN2初始化:时钟、GPIO、过滤器、中断相关
增加CAN2发送
9 stm32f0xx_it.c
CAN中断函数中,增加对CAN中断标志的判断,再进行相关CAN的处理。即:如果是CAN1的中断标志,则操作对象为CAN1;如果是CAN2的中断标志,则操作对象为CAN2。
本例中,只开启了一个中断位,因此只判断了一个标志位。
工程为Projects\FCM32F0xx_StdPeriph_2x_bxCAN,CAN1 & CAN2都可收发。可根据需要修改CAN引脚。
STM32F0xx_StdPeriph_Lib_V1.6.0_bxCANx2.zip
(2.76 MB)
FCM32F092xBxC-C_datasheet_CH_0.11.pdf
(3.36 MB)
|