历史上的今天

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

正在发生

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

发布者:yunhao 来源: eefocus关键字:STM32  can配置  PA11  PA12 手机看文章 扫描二维码
随时随地手机看文章
  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.  


关键字:STM32  can配置  PA11  PA12 引用地址:STM32 can配置PA11 PA12

上一篇: STM32之CAN控制器
下一篇:STM32时钟使能及应用总结

推荐阅读

科技的力量正在潜移默化的改变着整个物流行业,未来,信息化、无人化产品将在三到五年内落地开花,推动物流行业更加智慧化、数字化。这不仅仅是企业跟企业之间的协同,更多的是产业间的协同和组织方式的创新。对此,每一个物流行业的嘉宾都有着不同的看法,并结合自身企业业务探索经历,表达了自己对科技与物流融合趋势的预判与展望。 首先,读懂国家的物...
新能源车的兴起,从欧中程度上要感谢特斯拉和美国加州政府,正是由于特斯拉的产品和加州不断严厉的排放规定,从某种程度将纯电车辆带入了人们的视线,而资本的追逐又给“纯电”新能源风潮“锦上添花”,从中国到美国到欧洲,全球都掀起了新能源车的开发热潮。无数的国内外新老势力在新能源领域投入大量的资金。氢气,天然气,太阳能等等能源都被融合到了汽...
近日,清华大学智能社会治理研究院成立大会在清华大学主楼举行。研究院在中央网信办、科技部等相关部委的支持下成立,依托清华大学多学科优势,面向人工智能技术发展与应用对社会治理的综合影响开展研究,为全球人工智能社会影响的研究与治理提供理论支撑。 清华大学党委书记、研究院领导小组联席组长陈旭出席研究院第一次领导小组会议。国家发展改革委副...
广告摘要声明广告撰文 | 罗艳2021年已过半,机器人和智能制造领域上市企业交出的“成绩单”表现如何?「高工机器人」注意到,后疫情时代,国内需求稳步提升,市场供需关系逐步改善,加上政府减免租金、金融支持等政策措施的实施,一些上市公司业绩恢复强劲。「高工机器人」梳理了部分智能制造领域上市企业的上半年业绩,其中,归母净利润同比增长超100%...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved