当前位置: 首页 > news >正文

免费流量网站推广东莞市民最新疫情

免费流量网站推广,东莞市民最新疫情,怎么用wordpress建外贸网站,网站页面制作公司目录 STM32 CAN通讯实验 CAN硬件原理图 CAN外设原理图 TJA1050T硬件描述 实验线路图 回环实验 CAN头文件配置 CAN_GPIO_Config初始化 CAN初始化结构体 CAN筛选器结构体 接收中断优先级配置 接收中断函数 main文件 实验现象 补充 STM32 CAN通讯实验 CAN硬件原理图…

目录

STM32 CAN通讯实验

CAN硬件原理图

CAN外设原理图

TJA1050T硬件描述

实验线路图

回环实验

CAN头文件配置

 CAN_GPIO_Config初始化

CAN初始化结构体

CAN筛选器结构体

 接收中断优先级配置

接收中断函数

main文件

实验现象

补充


STM32 CAN通讯实验

CAN硬件原理图

CAN外设原理图

野火STM32F103ZET6霸道板载原理图

我们的开发板没有使用GPIO外设的复用功能PA11和PA12,而使用了重定义(重映射)功能PB8和PB9

TJA1050T硬件描述

实验线路图

图中为两个霸道开发板,如果使用指南针开发板需要外接CAN收发器和电阻。

        是否使用RX和TX引脚是根据实际情况来确认是否使用的。如果我们使用回环模式时,在STM32芯片内部的CAN控制器的发送端和接收端就已经通过硬件逻辑连接起来了,比如回环静默模式,根本不用使用STM32的发送和接收引脚。甚至使用回环测试的时候,CAN收发器就算不供电都可以工作。

回环实验

我们配置外设的GPIO功能时,可以参考手册的外设GPIO功能配置

CAN头文件配置

#ifndef __BSP_CAN_H
#define __BSP_CAN_H#include "stm32f10x.h"#define PASS_ID   ((uint32_t)0x1314)#define CAN_TX_GPIO_PROT          GPIOB
#define CAN_TX_GPIO_PIN           GPIO_Pin_9#define  CAN_RX_GPIO_PORT     GPIOB
#define  CAN_RX_GPIO_PIN      GPIO_Pin_8#define CAN_GPIO_CLK                    RCC_APB2Periph_GPIOB/*信息输出*/
#define CAN_DEBUG_ON         1#define CAN_INFO(fmt,arg...)           printf("<<-CAN-INFO->> "fmt"\n",##arg)
#define CAN_ERROR(fmt,arg...)          printf("<<-CAN-ERROR->> "fmt"\n",##arg)
#define CAN_DEBUG(fmt,arg...)          do{\if(CAN_DEBUG_ON)\printf("<<-CAN-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);void CAN_Config(void)    ;     #endif /* __BSP_CAN_H */

 CAN_GPIO_Config初始化

void CAN_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* 使能CAN时钟 */RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1 , ENABLE );/* 使能CAN引脚相关的时钟 */RCC_APB2PeriphClockCmd ( CAN_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE );//使用PA8 9引脚的第二功能GPIO_PinRemapConfig (GPIO_Remap1_CAN1 ,ENABLE);/* 配置CAN的 引脚,普通IO即可 */GPIO_InitStructure.GPIO_Pin = CAN_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(CAN_TX_GPIO_PROT, &GPIO_InitStructure);/* 配置CAN的 引脚,普通IO即可 */GPIO_InitStructure.GPIO_Pin = CAN_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(CAN_RX_GPIO_PORT, &GPIO_InitStructure);}

PB8和PB9使用重映射功能

我们要使用GPIO_PinRemapConfig函数来使能PA8 9引脚的第二功能,此外一定要记得开启相应的AFIO时钟,否则第二功能是无法使用的。

CAN初始化结构体

void CAN_Mode_Config(void)    
{CAN_InitTypeDef CAN_InitTypeStruct;CAN_InitTypeStruct.CAN_ABOM = ENABLE;CAN_InitTypeStruct.CAN_AWUM = ENABLE;CAN_InitTypeStruct.CAN_Mode = CAN_Mode_LoopBack;//CAN_Mode_Normal;//调试时建议使用回环模式,调试完再改成NORMALCAN_InitTypeStruct.CAN_NART = ENABLE; //错误重传CAN_InitTypeStruct.CAN_RFLM = ENABLE;CAN_InitTypeStruct.CAN_TTCM = DISABLE;CAN_InitTypeStruct.CAN_TXFP = DISABLE; //按ID优先级发送//配置成1MbpsCAN_InitTypeStruct.CAN_BS1 = CAN_BS1_5tq;CAN_InitTypeStruct.CAN_BS2 = CAN_BS2_3tq;CAN_InitTypeStruct.CAN_SJW = CAN_SJW_2tq;CAN_InitTypeStruct.CAN_Prescaler = 4;CAN_Init(CAN1,&CAN_InitTypeStruct);}

其中位时序及波特率按照下表配置

CAN筛选器结构体

void CAN_Filter_Config(void)
{CAN_FilterInitTypeDef CAN_FilterInitTypeStruct;CAN_FilterInitTypeStruct.CAN_FilterActivation = ENABLE;CAN_FilterInitTypeStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0  ;CAN_FilterInitTypeStruct.CAN_FilterNumber = 0;CAN_FilterInitTypeStruct.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitTypeStruct.CAN_FilterMode = CAN_FilterMode_IdMask  ;CAN_FilterInitTypeStruct.CAN_FilterIdHigh = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF0000)>>16;CAN_FilterInitTypeStruct.CAN_FilterIdLow = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF);CAN_FilterInitTypeStruct.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitTypeStruct.CAN_FilterMaskIdLow =0xFFFF;    CAN_FilterInit(&CAN_FilterInitTypeStruct);CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE);}    

其中假如我们要过滤的ID为0x1314

使用stm32f10x_can.h文件末尾定义的相关宏

由于使用的是32位筛选器且标识符掩码,所以其中CAN_FilterIdHigh和CAN_FilterIdLow为我们过滤ID格式的高16位和低16位,首先将ID号左移三位,然后或上IDE、RTR位

CAN_FilterInitTypeStruct.CAN_FilterIdHigh = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF0000)>>16;
CAN_FilterInitTypeStruct.CAN_FilterIdLow = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF);

而CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow为要过滤的ID掩码,全为1,表示完全过滤

CAN_FilterInitTypeStruct.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitTypeStruct.CAN_FilterMaskIdLow =0xFFFF;    

 接收中断优先级配置

void CAN_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 配置NVIC为优先级组1 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;/* 配置抢占优先级 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 配置子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断通道 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

在标准库头文件中找到CAN接收数据中断源,我们使用的是接收邮箱0,所以选择USB_LP_CAN1_RX0_IRQn

使能中断放在CAN筛选器结构体配置中

接收中断函数

extern CanRxMsg  CAN_Rece_Data;
extern uint8_t flag;void USB_LP_CAN1_RX0_IRQHandler(void)    
{CAN_Receive(CAN1,CAN_FIFO0, &CAN_Rece_Data); flag = 1;}

要注意的是在CAN里,我们设置完CAN_Receive(CAN1,CAN_FIFO0, &CAN_Rece_Data);之后不需要手动清除接收标志,该函数会自动清除。

flag用于在main函数中判断是否接收到数据,从而做相应的应用处理

我们也可以再加个判断进一步确认接收数据的准确性

main文件

#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./led/bsp_led.h"
#include "./can/bsp_can.h"
#include "./key/bsp_key.h"  CanRxMsg  CAN_Rece_Data;
CanTxMsg  CAN_Tran_Data;uint8_t flag = 0;void Delay(__IO uint32_t nCount); /** 函数名:main* 描述  :主函数* 输入  :无* 输出  :无*/
int main(void)
{     LED_GPIO_Config();LED_BLUE;/* 配置串口为:115200 8-N-1 */USART_Config();printf("\r\n 这是一个CAN通讯实验 \r\n");CAN_Config()    ;   Key_GPIO_Config();printf("\r\n 按KEY1按键发送数据\r\n");while(1){if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  ){uint8_t box;CAN_Tran_Data.StdId = 0;CAN_Tran_Data.ExtId = PASS_ID;CAN_Tran_Data.RTR = CAN_RTR_Data;//使用数据帧CAN_Tran_Data.IDE = CAN_Id_Extended ; //使用扩展帧CAN_Tran_Data.DLC = 1;CAN_Tran_Data.Data[0] = 10;box = CAN_Transmit(CAN1,&CAN_Tran_Data);while(CAN_TransmitStatus(CAN1,box) == CAN_TxStatus_Failed);printf("\r\n 数据包发送完成\r\n");            }         if(flag == 1){printf("\r\n接收到的数据:%d\r\n",CAN_Rece_Data.Data[0]);flag = 0;}else{}}
}void Delay(__IO uint32_t nCount)
{for(; nCount != 0; nCount--);
}

实验现象

补充

由于只有一个板子,无法演示双机实验,双机实验只需要将我们的回环实验中的回环模式换成正常模式,然后将程序分别下载到两个开发板即可。

学完基础的CAN通讯协议之后,如果想要今后从事CAN通讯相关工作,比如工业、汽车领域,我们还需要进一步学习一下CAN OPEN。

http://www.dinnco.com/news/47902.html

相关文章:

  • 网站关键字排名优化伊春seo
  • 广东省建设厅网站6广州企业推广
  • 西安政府网站设计网络营销策划案
  • 市场调研公司成功案例seo营销外包公司
  • 东营建设信息网站网站推广app下载
  • 简单的网站开发模板推广链接让别人点击
  • gif5网站下载不了做的动图软文世界平台
  • 常州武进网站建设百度旗下产品
  • 迈肯奇迹做网站全国疫情的最新数据
  • 百度网站的目标seo网站快速排名软件
  • 免费b2b网站大全不花钱主要推广手段免费
  • 哪里能做网站竞价托管资讯
  • 南阳微网站制作微信seo排名优化软件
  • 青岛网站制作网页百度知识营销
  • 福建网站建设公司360提交入口网址
  • 沈阳做网站黑酷科技怎么给网站做优化
  • b2c网站建设品牌营销策划怎么写
  • 最佳商城ui网站设计互联网广告管理暂行办法
  • 山东专业网站建设软件培训
  • 建设集团网站报告书目录搜索引擎有哪些
  • 主机开通成功网站建设中青海seo关键词排名优化工具
  • 网络科技建设网站杭州排名推广
  • 安福网站制作seo排名培训
  • 网站 做 专家问答百度搜索量排名
  • 网站 首页 关键词种子搜索神器在线搜
  • 淮安企业网站seo百度seo排名优化软件
  • 注册做网站的公司有哪些自己如何做一个网站
  • 克拉玛依网站建设公司怎样做企业推广
  • 网站背景css河南最新消息
  • 深圳网站优化团队信息流优化师职业规划