在项目中用到stm32f105芯片,需要使用到两个CAN口进行通讯,以下是在运行调试过程中出现的问题以及一些解决方法和学习心得。
对GPIO口进行设置
在这里RX使用的是上拉输入,TX是推免输出。这里需要注意的是,在对外设时钟进行设置的时候需要考虑一下CAN口的主从模式。105芯片的CAN2口是从bxCAN,它不能直接的访问SRAM存储器。所以如果在项目中只需要使用CAN2的话,在进行GPIO口外设时钟设置的时候,需要将CAN1的时钟也使能。 如果两个CAN口都有使用到,那么在进行CAN2口设置的时候使能2口的外设时钟就可以了。
设置中断优先级
这里的设置就比较简单,没有什么需要特别注意的地方。设置中断通道、优先级以及子优先级,最后使能中断
static void CAN_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 中断设置 */
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; //CAN1 RX0中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级为2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
模式配置
先对相关的寄存器进行初始化。这里主要提一下CAN_MODE以及波特率(CAN_SJW、CAN_BS1、CAN_BS2、CAN_Prescaler)设置时候的一些注意事项
工作方式
CAN口主要有以下几种工作方式,它们的特点如下:
正常模式(CAN_Mode_Normal):可以正常的接收和发送报文
环回模式(CAN_Mode_LoopBack):将CAN口发送的报文当做接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。环回模式可以避免外部影响,用于自测试。
静默模式(CAN_Mode_Silent):可以正常的接收数据帧和远程帧,智能发出隐性位,而不能真正的发出报文。所以,静默模式通常用于分析CAN总线活动,而不会对总线造成影响。
环回静默模式(CAN_Mode_Silent_LoopBack):该模式可用于“热自测试”,像环回模式那样测试CAN口,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态
波特率设置
波特率的计算公式如下:
CAN 波特率 = RCC_APB1Periph_CAN / Prescaler / (SJW + BS1 + BS2);
RCC_APB1Periph_CAN是CAN控制器外设挂载的APB总线频率;
CAN_Prescaler是CAN预分频系数,设置范围为0-1024;
SJW一般固定为1;
注意以上参数任何一个都不能设为0,否则会乱
过滤器配置
过滤器号:STM32F105芯片复位后默认的0-13号过滤寄存器可以定向到CAN1的 FIFO1或者FIFO0,14-17号定向到CAN2的FIFO1或者FIFO0
过滤模式分为两种。IDMask(标识符屏蔽位模式),特点是不够精准有时候不期望的ID也会通过过滤器,但是允许通过的ID个数会比较多最多无上限;IDList(标识符列表屏蔽模式),特点是可以精准的过滤ID但是数量有限。以下是本人根据CAN2配置的一个过滤器的例程:
void CAN2_Filter_Config(void)
{
uint32_t ExtIdArray[4]={ 0x12040080 , 0x12040081 , 0x12000080 , 0x12000081 };
CAN_FilterInitTypeDef CAN_FilterInitStructure;
uint32_t Mask =0 , temp=0 , i=0;
/*CAN过滤器初始化*/
/* STM32F105复位后默认的0-13号过滤寄存器可以定向到CAN1的FIFO0或FIFO1,14-17号定向到CAN2的FIFO0或FIFO1*/
CAN_FilterInitStructure.CAN_FilterNumber = 14; //过滤器组0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //工作在标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽为单个32位。
/* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
CAN_FilterInitStructure.CAN_FilterIdHigh= ( (ExtIdArray[0]<<3)&0xFFFF0000 )>>16 ; //要过滤的ID高位
CAN_FilterInitStructure.CAN_FilterIdLow= ((ExtIdArray[0]<<3) |CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位
//计算屏蔽码,ExtIdArray[0]为验证码
Mask = 0x1FFFFFFF;
for( i=0;i<4;i++)
{
temp = ExtIdArray[i]^(~ExtIdArray[0]);
Mask &= temp;
}
Mask <<=3;
//计算出的 Mask中置1的位表示与ExtIdArray[0]一样,置0的位表示不关心
CAN_FilterInitStructure.CAN_FilterMaskIdHigh= (Mask>>16)&0xFFFF; //过滤器高16位每位必须匹配
CAN_FilterInitStructure.CAN_FilterMaskIdLow= Mask&0xFFFF; //过滤器低16位每位必须匹配
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ; //过滤器被关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);
/*CAN通信中断使能*/
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}
上一篇:cubemx实现CAN通讯
下一篇:关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
推荐阅读
史海拾趣
Emmoco一直将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,Emmoco还注重持续改进,通过引入先进的生产设备和工艺、优化生产流程等方式,不断提高产品质量和生产效率。这些举措使得Emmoco的产品在市场上赢得了良好的口碑和声誉。
亿佰特(EBYTE)公司自2012年成立以来,一直致力于物联网通信技术的研发。公司团队凭借对无线通信技术的深入理解,不断突破技术瓶颈,成功研发出多款具有创新性的产品。这些产品不仅具备高性能和稳定性,而且能够广泛应用于智能家居、工业控制等领域。亿佰特通过持续的技术创新,逐步在电子行业中树立了领先地位。
到了90年代,随着电子产品的普及和技术的进步,开关市场的竞争愈发激烈。然而,C&K凭借多年的技术积累和市场经验,已经成为世界领先的开关制造商之一。公司不断推出创新产品,满足市场的多样化需求,同时加强与国际知名企业的合作,进一步巩固了其在行业内的领先地位。
随着环保意识的日益增强,Chipcon AS公司积极响应国家号召,将环保理念融入产品研发和生产过程中。公司采用环保材料和生产工艺,致力于降低产品对环境的影响。同时,公司还推出了一系列具有节能环保功能的电子产品,为客户提供了更加环保的选择。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。
以上是根据电子行业的一般情况和趋势虚构的Chipcon AS公司的发展故事。这些故事旨在展示一个电子企业在不同方面可能经历的挑战和机遇,以及如何通过创新和合作实现持续发展。请注意,这些故事并非Chipcon AS公司的真实历史,仅供参考和启发。
近年来,电子行业面临着诸多市场挑战与机遇。在这场全球供应链的博弈中,AXTAL公司展现出了敏锐的市场洞察力和应变能力。面对中国发布的镓锗禁令,AXTAL巧妙地抓住了第一个漏洞,通过在中国设立的子公司申请出口镓锗的许可证,成功绕过了禁令的限制。这一睿智之举不仅为公司打开了新的市场窗口,也彰显了公司在应对市场挑战时的灵活性和创造力。
在半导体产业链中,Enable Semiconductor Corp公司注重与上下游企业的合作。公司与多家芯片设计公司、封装测试企业建立了紧密的合作关系,共同开发新产品、新技术。这种合作模式不仅降低了公司的研发成本,也加快了产品上市的速度。同时,通过与合作伙伴的资源共享和优势互补,Enable Semiconductor Corp公司在市场上形成了强大的竞争力。
4*4键盘扫描程序,健值采用顺序编码方式,程序有详细注释,并有proteus仿真文件。 [ 本帖最后由 fnsheng 于 2009-6-17 09:16 编辑 ]… 查看全部问答∨ |
|
一、引言 电能是目前人类生产和生活中最重要的一种能源形式。合理、高效、精确和方便地利用电能仍然是人类所面临的重大问题。采用电力电子技术的电源装置给电能的利用带来了革命。在世界范围内,用电总量中经过电力电子装置变换和调节的比例已经成 ...… 查看全部问答∨ |
|
本科组_低功耗 基于MSP430和3G传输的便携式心电监护仪 本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 本科组_低功耗 基于MSP430和3G传输的便携式心电监护仪 … 查看全部问答∨ |
|
当我们终于实现注册表永久保存的时候我们发现我们不得不面对新的问题: 由于注册表要保存到永久存储器(如NAND Flash),每次修改注册表都会去读写NAND Flash , 会严重影响某些应用程序的运行. 比如播放音视频时,会写入很多新的注册表键值,每次 ...… 查看全部问答∨ |
考虑到论坛TI的蓝牙活动正在进行,为了方便大伙技术交流,到时想交流蓝牙技术和参加活动的技术朋友都加入到303514407[backcolor=rgba(255, 255, 255, 0.2)]这个蓝牙技术群。 [ 本帖最后由 wateras1 于 2013-11-21 10:53 编辑 ]… 查看全部问答∨ |