STM32 can配置PA11 PA12

发布者:yunhao最新更新时间:2018-09-02 来源: 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时钟使能及应用总结

推荐阅读最新更新时间:2024-03-16 16:12

4. stm32启动代码分析(一)
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 库函数的使用要得益于你本身对c语言指针,结构体,及结构体指针的认识。如果你对这些的熟悉程度不够的话,只能说会阻止你进一步前进。 硬件方面,你最好能有基本的数电模电常识,有单片机理论基础,或者微机原理理论,这样你在理解这些硬件组成,或者电路
[单片机]
4. <font color='red'>stm32</font>启动代码分析(一)
STM32的GPIO的复用功能和重映射功能
1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚) STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。 2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变到其他的引脚上! 直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。 如:USART1: 0: 没有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。 (参考AFIO_MAPR寄存器介
[单片机]
基于STM32的WAV音频格式播放器
STM32从SD卡中读取语音文件进行播放,因此需要对语音进行解码,刚开始就一直使用Speex的音频压缩格式,最近发现,在进行语音格式转换时,我们不能很好地分析spx格式音频文件的文件头,这样就会导致语音的播放出现问题。由于WAV采用PCM编码,音质也十分不错,于是考虑用STM32对WAV格式音频文件进行解码,上周末开始找资料和编程,其中也遇到了不少问题,不过功夫不负有心人,最终还是顺利的跑起来了。先将资料和编程过程整理成本文,供大家一起学习和进步。 WAV文件格式是一种重要的用于存放声音文件的文件格式,尽管现在有MP3,RAM等压缩效率更高的声音文件格式,并且广泛被音乐文件所采用,但是又很多的应用程序仍然采用WAV文件格式。由于W
[单片机]
基于<font color='red'>STM32</font>的WAV音频格式播放器
关于STM32堆栈方面知识点
最近弄json,发现经常的堆溢出,然后找问题。因为对STM32堆栈问题没有深刻认识,就花时间好好研究下了堆栈并且做了验证 1.栈地址区间确定 首先找到启动文件,我的启动文件在startup_stm32f40xx.s,一般的启动文件也都在startup_stm32fxxxx.s文件里 __initial_sp 这个参数是栈顶地址,因为栈的增长是向下增长,所以这个参数我们可以理解为栈的起始地址,我设置的栈尺寸是0x400,所以栈的地址范围是 __initial_sp ~ (__initial_sp - 0x400),__initial_sp 这个参数是keil编译代码之后计算出来的,有多种方法确定。 2.确定__i
[单片机]
关于<font color='red'>STM32</font>堆栈方面知识点
stm32定时器输入捕获pwm
花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图 下面一一介绍: TIMx_ARR寄存器为自动重装载的值 TIMx_CR1这里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置对应通道映射到那个IC,TI。 这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。 TIMx_psc寄存器 T
[单片机]
STM32外设驱动篇——DHT11温湿度传感器
已在STM32上进行过测试。本例使用PC0引脚连接DHT11的data引脚。 main函数中调用下面代码中的DTH11_test函数即可。 //数据定义: //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- u8 U8T_data_H,U8T_data_L,U8RH_d
[单片机]
玩转STM32(6)初识编译环境
前面已经介绍了怎么样找到项目的工程文件,只要双击那个文件就可以打开整个项目工程,进入代码开发调试环境。在很多年以前,开发软件还是很困难的事情,因为那时候编译环境非常不友好,不是图形界面,而是基于文本的界面,并且还不是集成开发环境,是分离的。当你在编辑器里写了代码之后,然后再保存成文件,然后退出编辑器,再来到命令行的环境下面,输入调用编译器的命令,才可以编译源码。如果编译有问题,要先把出错的行号和列号记住,再进入编辑器进行代码修改,就这样来来回回,反反复复地进行着,可想而之,那时的开发效率是多么的低下,需要人的记性超级好,耐心也要经得起考验,才可以成为开发人员。到今天这个时代,已经大为改观,整个开发环境已经是集成开发环境了,非常便捷
[单片机]
玩转<font color='red'>STM32</font>(6)初识编译环境
9G-STM32 MDK-ARM开发过程简介
9G-STM32 MDK-ARM开发过程简介 一,准备MDK-ARM+JLINK+STM32软件包 1,在http://www.mcu123.com/news/Soft/embsof/arm/200908/505.html 下载RealView MDK-ARM 3.80a(MDK-ARM V3.80a,MDK3.80a)版本 mdk380a_mcu123.rar http://esoft.mcu123.com/MCU123_temp_0080309@/arm/mdk380a_mcu123.rar (注册机自行查找,安装过程略) 2,在http://www.segger.com/cms/jlink-software.
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved