历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2018年09月02日 | STM32 can配置PA11 PA12

2018-09-02 来源:eefocus

  1. /* Private variables ---------------------------------------------------------*/  

  2. uint16_t CAN_ID;  

  3. uint8_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;  

  4. uint8_t CanFlag,Display;  

  5.   

  6.   

  7.   

  8.   

  9. void CAN_GPIO_Config(void)  

  10. {  

  11. GPIO_InitTypeDef GPIO_InitStructure;     

  12. /* CAN Periph clock enable */  

  13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);  

  14. // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);  

  15.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);  

  16.   

  17.   /* Configure CAN pin: TX */  

  18.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  

  19. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  20.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  21.   GPIO_Init(GPIOA, &GPIO_InitStructure);     

  22.  /* Configure CAN pin: RX */  

  23.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  

  24.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   

  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);     

  26. // GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);  

  27. }  

  28.   

  29.   

  30. void CAN_NVIC_Configuration(void)  

  31. {  

  32.  NVIC_InitTypeDef NVIC_InitStructure;     

  33.      

  34. #ifdef  VECT_TAB_RAM       

  35.   /* Set the Vector Table base location at 0x20000000 */      

  36.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);      

  37. #else  /* VECT_TAB_FLASH  */     

  38.   /* Set the Vector Table base location at 0x08000000 */      

  39.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);        

  40. #endif     

  41.      

  42.   /* enabling interrupt */     

  43.   NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;     

  44.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     

  45.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     

  46.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     

  47.   NVIC_Init(&NVIC_InitStructure);    

  48.   

  49. }  

  50.    

  51. void can_init(void)  

  52. {  

  53. CAN_InitTypeDef        CAN_InitStructure;  

  54. CAN_FilterInitTypeDef  CAN_FilterInitStructure;   

  55.   

  56. CAN_GPIO_Config();  

  57. CAN_NVIC_Configuration();  

  58. /* CAN register init */  

  59. CAN_DeInit(CAN1);  

  60. CAN_StructInit(&CAN_InitStructure);  

  61.   

  62.   

  63.  /* CAN cell init */  

  64.   CAN_InitStructure.CAN_TTCM = DISABLE; /* 时间触发禁止, 时间触发:CAN硬件的内部定时器被激活,并且被用于产生时间戳 */  

  65.   CAN_InitStructure.CAN_ABOM = DISABLE; /* 自动离线禁止,自动离线:一旦硬件监控到128次11个隐性位,就自动退出离线状态。在这里要软件设定后才能退出 */  

  66.   CAN_InitStructure.CAN_AWUM = DISABLE; /* 自动唤醒禁止,有报文来的时候自动退出休眠*/  

  67.   CAN_InitStructure.CAN_NART = DISABLE; /* 报文重传, 如果错误一直传到成功止,否则只传一次 */  

  68.   CAN_InitStructure.CAN_RFLM = DISABLE; /* 接收FIFO锁定, 1--锁定后接收到新的报文摘不要,0--接收到新的报文则覆盖前一报文*/  

  69.   CAN_InitStructure.CAN_TXFP = DISABLE;  /* 发送优先级  0---由标识符决定  1---由发送请求顺序决定*/  

  70.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* 模式*/  

  71.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;      /* 重新同步跳宽,只有can硬件处于初始化模式时才能访问这个寄存器 */  

  72.   CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;      /* 时间段1 */  

  73.   CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;      /* 时间段2 */  

  74.   CAN_InitStructure.CAN_Prescaler = 8;         /* 波特率预分频数 */    

  75. CAN_Init(CAN1, &CAN_InitStructure);            // 初始化CAN1   

  76.   /* 波特率计算方法 */  

  77.   /* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)  此处计算为  CANbps=64000000/(16*(13+2+1))=250kHz */   

  78.   /* 配置大方向: Tseg1>=Tseg2  Tseg2>=tq; Tseg2>=2TSJW */  

  79.   /* 使用CAN波特率计算器得到CANBTR = 0x001C000F   具体某些位对应SJW BS1 BS2 介绍网址http://blog.csdn.net/flydream0/article/details/8170185  */  

  80.   if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED) //F  

  81.   {  

  82. rt_kprintf("CAN error \r\n");  

  83.     /* 初始化时先设置CAN_MCR的初始化位 */     

  84.     /* 然后查看硬件是否真的设置了CAN_MSR的初始化位来确认是否进入了初始化模式  */                    

  85.   }   

  86.   /* 配置CAN过滤器 */  

  87.   /* 32位对应的id */  

  88.   /* stdid[10:0],extid[17:0],ide,rtr */  

  89.   /* 16位对应的id */  

  90.   /* stdid[10:0],ide,rtr,extid[17:15] */  

  91.   /* 一般使用屏蔽模式 */  

  92.   /* 要注意的是fifo接收存满了中断,还有就是fifo的概念,即取的一直是最早那一个数据, 要释放才能取下一个数据 */  

  93.   /* 常使用的中断有 */  

  94.   /* 1,有信息中断,即fifo挂号中断 */  

  95.   /* 2,fifo满中断 */  

  96.   /* 3,fifo满之后又有信息来则中断,即fifo溢出中断 */  

  97.   CAN_FilterInitStructure.CAN_FilterNumber=0;     /* 过滤器0 */  

  98.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;  /* 屏敝模式 */  

  99.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; /* 32位 */  

  100.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;  /* 以下四个都为0, 表明不过滤任何id */  

  101.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;  

  102.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;  

  103.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;  

  104.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;  /* 能够通过该过滤器的报文存到fifo0中 */  

  105.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;  

  106.   CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);   /* 挂号中断, 进入中断后读fifo的报文函数释放报文清中断标志 */  

  107.   CAN_FilterInit(&CAN_FilterInitStructure);  

  108.   

  109.   

  110. }  

  111.   

  112.   

  113. void CanWData(void)  

  114. {  

  115.   

  116.   CanTxMsg TxMessage;  

  117. #if 0  

  118.  /* transmit 1 message */     

  119. //  TxMessage.StdId=0x12;     

  120. //  TxMessage.ExtId=0x34;     

  121.     TxMessage.StdId=0x00;   //???00     

  122.     TxMessage.ExtId=0x00;  //???00     

  123.   TxMessage.IDE=CAN_ID_EXT;     

  124.   TxMessage.RTR=CAN_RTR_DATA;     

  125.   TxMessage.DLC=2;     

  126. //  TxMessage.Data[0]=0xDE;     

  127. //  TxMessage.Data[1]=0xCA;     

  128.   TxMessage.Data[0]=0xBB;   //???BB     

  129.   TxMessage.Data[1]=0xBB;  //???BB     

  130.   CAN_Transmit(CAN1,&TxMessage);    

  131. #else  

  132. uint32_t ID = 0x5a5;  

  133.   CAN_DATA0=rand()%0xff;  CAN_DATA1=rand()%0xff;    

  134.   CAN_DATA2=rand()%0xff;  CAN_DATA3=rand()%0xff;    

  135.   CAN_DATA4=rand()%0xff;  CAN_DATA5=rand()%0xff;  

  136.   CAN_DATA6=rand()%0xff;  CAN_DATA7=rand()%0xff;   

  137.   

  138.   

  139.   /* transmit */  

  140.   TxMessage.StdId = ID;  /* 设置标准id  注意标准id的最高7位不能全是隐性(1)。共11位 */  

  141. //TxMessage.ExtId = 0x00;     //设置扩展id  扩展id共18位  

  142.   TxMessage.RTR = CAN_RTR_DATA; /* 设置为数据帧 */  

  143.   TxMessage.IDE = CAN_ID_STD;   /* 使用标准id */  

  144.   TxMessage.DLC = 8;            /* 数据长度, can报文规定最大的数据长度为8字节 */  

  145.   TxMessage.Data[0] = CAN_DATA0;      

  146.   TxMessage.Data[1] = CAN_DATA1;      

  147.   TxMessage.Data[2] = CAN_DATA2;      

  148.   TxMessage.Data[3] = CAN_DATA3;      

  149.   TxMessage.Data[4] = CAN_DATA4;      

  150.   TxMessage.Data[5] = CAN_DATA5;       

  151.   TxMessage.Data[6] = CAN_DATA6;      

  152.   TxMessage.Data[7] = CAN_DATA7;       

  153.   

  154.   CAN_Transmit(CAN1,&TxMessage);  /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */  

  155. #endif  

  156. }  

  157.   

  158. void USB_LP_CAN1_RX0_IRQHandler(void)  

  159. {  

  160.   CanRxMsg RxMessage;  

  161. int i=0;  

  162.     CAN_Receive(CAN1, 0, &RxMessage);  

  163. for(i=0;i<8;i++)  

  164. printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);  

  165. }  

  166.  


推荐阅读

史海拾趣

ATM [Advanced Technical Materials]公司的发展小趣事

中国ATM的发展历程始于20世纪80年代中期。1987年,中国银行在珠海推出了中国大陆第一台ATM,标志着ATM在中国开始了发展。随后,经过数十年的快速发展,中国ATM市场经历了多个阶段,从初级阶段到专业化阶段,再到如今的快速发展阶段。中国ATM市场的繁荣,不仅反映了国内银行业电子化建设的成果,也体现了电子行业的快速发展和普及。

CTS公司的发展小趣事

进入20世纪90年代,CTS公司迎来了重要的技术突破。随着Motorola通讯零件事业部的加入,CTS在无线通讯领域取得了显著进展,成为该领域的领先者。此外,CTS还积极投入研发,不断推出创新产品,进一步巩固了其在电子行业的地位。

EPIC公司的发展小趣事

1998年,Epic Games发布了一款名为“虚幻”的3D第一人称射击游戏。这款游戏不仅游戏内容新颖,更引人注目的是它背后完全自主开发的3D游戏引擎。这个引擎后来被称为“虚幻引擎”,并成为了Epic Games的核心技术之一。随着游戏的成功,虚幻引擎也逐渐受到了业界的关注。许多其他游戏开发商开始采用这款引擎来开发自己的游戏,从而使得Epic Games在游戏引擎领域取得了显著的商业成功。

台湾富致(FUZETEC)公司的发展小趣事

Futaba Electric最初起源于收音机收讯真空管的制造,但在1970年,公司做出了重大的战略调整,决定结束真空管业务,专注于萤光表示管(VFD)的生产。这一决策标志着公司从传统电子元件向高级显示技术的转型。随着VFD技术的不断发展,Futaba凭借其在清晰度、视角和亮度方面的卓越表现,逐渐在全球VFD市场中占据领先地位,目前市场份额超过60%。这一转型不仅使Futaba成为VFD技术的领导者,还为其在汽车仪表盘和抬头显示器等领域的广泛应用奠定了基础。

Analogix Semiconductor公司的发展小趣事

自1983年Futaba的VFD产品被福特汽车公司采用后,其在美国三大汽车厂的市场占有率迅速达到100%。这一成就不仅证明了Futaba VFD产品在汽车行业的卓越性能和广泛应用,还推动了其在全球汽车市场上的快速扩张。VFD的抗震性能、良好的温差适应性以及高可靠性,使其在汽车仪表盘和抬头显示器等关键部件中扮演了重要角色。随着新能源汽车的兴起,Futaba的VFD技术也进一步适应市场需求,为新能源汽车提供了更加先进的显示解决方案。

Cotco公司的发展小趣事

面对电子行业日新月异的变化和不断涌现的新挑战,Cotco公司始终保持敏锐的市场触觉和应变能力。公司及时调整战略方向,加大在新兴领域如物联网、智能家居等的投入和研发力度。同时,Cotco也积极拓展国际市场,与全球多个国家和地区的合作伙伴建立合作关系,推动产品的全球化销售和服务。展望未来,Cotco将继续秉承创新、质量和服务的理念,致力于成为全球电子行业的佼佼者。

问答坊 | AI 解惑

智能楼宇防盗报警系统的设计与解决方案(一)

一、概述     某地区新建一大楼,有40层。该楼为智能化程度要求比较高的综合性办公楼,该楼25层以下为出租的写字楼,25层以上为该市民防办的办公和指挥中心,因此意义重大,对于防盗报警系统的要求也比较高和特殊。  &nbs ...…

查看全部问答>

DIYA面全过程,附图

一直非常想要拥有一款自己喜欢的又很与众不同的笔记本电脑,因此也一直格外关注各个笔记本电脑厂商的定制业务。前阵子发现清华同方的imini推出了定制业务,进行了相关咨询后,发现机器价格才3198,定制费也只需再加400元,价格经济,当然立即一试。 ...…

查看全部问答>

自动干手控制器

该装置的电路工作原理见图9。平时红外线发光管VD1发射的红外线照射在红外线接收管VD2上,导致VD2的内阻变小,故LSE的④脚此时输出高电平,此时三极管VT截止,继电器J处于释放状态,其常开触点j1-1、j1-2断开,冷暖风机无电源不工作。当人洗完手后 ...…

查看全部问答>

如何将MATLAB应用到Visual Studio中

RTMATLAB做语音的信号处理很好,可以运用多种filter。但是如何将MATLAB运用到Visual Studio .NET中?请有经验的大侠给个建议谢谢…

查看全部问答>

表达式中1U,3U什么意思?

表达式中1U,3U什么意思? #define GPIO_PIN_MASK(pin)              (1U …

查看全部问答>

请问CE5.0下如何导入filter?

我用了如下3种方法都不能导入系统自带的inftee.dll的例子 1.使用了pb5.0编译得到的regsvr32.exe,然后使用 regsvr32.exe inftee.dll,系统返回错误:Registration Operation failed hr = 0x800700c1 2.使用了ce4.0的REGSVRCE.EXE ,说 DllRegiste ...…

查看全部问答>

有人用过MaxplusII吗??模拟一个滚动条,做到这没思路了,哪位大人帮忙给个

问这个是发这吧 课程设计要求做一个模拟滚动条的电路,使用24个灯模拟Windows中的滚动条,有三个灯循环亮,或者正反循环亮。初始有一个灯亮,然后是两个,最后是三个,然后三个灯循环。 我用很笨的办法用了6个D触发器做到了6个灯的符合要求,可是 ...…

查看全部问答>

求助 K1-K4 控制数码管加减演示

#include #include #define uint unsigned int #define uchar unsigned char uchar bai,shi,ge,num; sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; void dela ...…

查看全部问答>