你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

刘洋【入门笔记】第29讲 STM8 CAN总线数据发送实验  

[复制链接]
众想@刘洋 发布时间:2016-10-8 14:57
刘洋【剑齿虎】STM8开发板学习笔记
29讲   STM8 CAN总线数据发送实验
29.1 CAN控制器原理图   
图片1.png
29.1 CAN控制器接口
29.2 实验目的   
    自定义发送各种类型的帧。在CAN实际应用中要对各种数据类型作一些必要限制。现在我们按照实际应用的过程加深实验过程。包括:标准数据帧、扩展数据帧、标准远程帧、扩展远程帧
29.3 程序文件设计   29.3.1  main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。
/***********************************************************************
*   说    明: CAN转发数据实验
*   开发平台: 剑齿虎STM8开发板        
*   作    者: 刘洋 张殿东
*   版    本: V1.0
*   日    期: 2016-05-03   
*
*   IAR开发环境    版本 V2.20.1
*   ST库函数       版本 V2.2.0
***********************************************************************/
#include "pbdata.h"//引入自定义公共头文件
void BSP_Configuration(void);//硬件初始化函数声明
/***********************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
***********************************************************************/
int main(void)
{
  BSP_Configuration();//硬件驱动初始化函数
  
  while(1)//主程序循环,反复执行循环体里的语句
  {
    CAN_SendData_Demo2();
  }
}
/***********************************************************************
*   函 数 名: BSP_Configuration
*   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*   形    参:无
*   返 回 值: 无
***********************************************************************/
void BSP_Configuration(void)
{  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
  UART1_Congfiguration();//调用RS232串口1初始化函数
  LED_Init();//调用LED初始化函数
  CAN_Configuration();//调用CAN初始化函数
  rim();//打开总中断
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
#endif
29.3.2  pbdata.c文件中的程序
#include "pbdata.h"   //引入自定义公共头文件
/***************************************************************************
*   函 数 名: delay_us
*   功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的微秒数,输入nCount=1微妙
*   返 回 值: 无
***************************************************************************/
void delay_us(u16 nCount)   //16M 晶振时  延时 1个微妙
{
    nCount*=3;//等同于 nCount=nCount*3  相当于把nCount变量扩大3倍
    while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。
}
/***************************************************************************
*   函 数 名: delay_ms
*   功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的毫秒数,输入nCount=1毫秒
*   返 回 值: 无
***************************************************************************/
void delay_ms(u16 nCount)  //16M 晶振时  延时 1个毫秒
{
    while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。
    {
        delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。
    }
}
29.3.3  pbdata.h文件中的程序
#ifndef _PBDATA_H//宏定义,定义文件名称
#define _PBDATA_H
#include "stm8s.h"//引入STM8的头文件
#include <stdio.h>//需要引用这个头文件才能实现
#include "math.h"//需要引用这个头文件才能实现
#include "uart1.h"//引用RS232头文件
#include "can.h"
void delay_us(u16 nCount); //微秒延时程序
void delay_ms(u16 nCount); //毫秒延时程序
u16 Get_decimal(double dt,u8 deci);   //获得数值小数部分
#endif //定义文件名称结束
29.3.4  can.c文件中的程序
#include "pbdata.h"
/***************************************************************************
*   函 数 名: CAN_Configuration
*   功能说明: CAN初始化
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void CAN_Configuration(void)
{
    //初始化CAN波特率为1M   CAN_Init(CAN_MasterCtrl_AllDisabled,CAN_Mode_Normal,CAN_SynJumpWidth_1TimeQuantum,CAN_BitSeg1_11TimeQuantum,CAN_BitSeg2_4TimeQuantum,1);
    //配置CAN第0组过滤器为屏蔽模式。但是屏蔽位都设置为0,所以相当于没启动屏蔽功能。    CAN_FilterInit(CAN_FilterNumber_0,ENABLE,CAN_FilterMode_IdMask,CAN_FilterScale_32Bit,0,0,0,0,0,0,0,0);
    //使能CAN接收中断功能
    CAN_ITConfig(CAN_IT_FMP,ENABLE);
}
/***************************************************************************
*   函 数 名: CAN_RecvData_Demo1
*   功能说明: CAN数据转发实验例程
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void CAN_RecvData_Demo1(void)
{
    u32 id;
    CAN_Id_TypeDef ide;
    CAN_RTR_TypeDef rtr;
    u8 data[8];
    u8 dlc,i;
    CAN_Receive();//读取缓存中的数据
    ide=CAN_GetReceivedIDE();//读取帧类型(标准或扩展)
    rtr=CAN_GetReceivedRTR();//读取帧类型(数据或远程)
    dlc=CAN_GetReceivedDLC();//读取接收到的数据字节数
    for(i=0;i<dlc;i++)
    {
        data=CAN_GetReceivedData(i);//把接收到的数据送到自定义数组里   
    }
    CAN_Transmit(id,ide,rtr,dlc,data);//把接收到的数据转发出去(包括ID号、帧类型和数据)
29.3.5  can.h文件中的程序
#ifndef _CAN_H  //宏定义,定义文件名称
#define _CAN_H
#include "stm8s.h"//引用STM8头文件
void CAN_Configuration(void);//CAN初始化函数
void CAN_RecvData_Demo1(void);//CAN数据转发函数
#endif //定义文件名称结束
29.3.6  uart1.c文件中的程序
设计串口通讯软件是为了通过串口uart1能把CAN通讯数据输出到计算机上显示出来,能直观的看到通讯数据是否和设计一致。
……详细程序请参考程序例程。
29.3.7  uart1.h文件中的程序
……详细程序请参考程序例程。
29.4 实验过程
   我们使用蓝精灵多功能监控软件来实现CAN通讯调试过程,打开串口后,在接收区会有两条提示信息,包括CAN控制器型号、通道等等;接着要设置波特率,波特率默认值是5KBPS,我们要设置为1MBPS
图片2.png
29.2 CAN通讯监视界面
    扩展数据帧字节数量可变,
    标准远程帧,总线单元发出远程帧,请求发送具有同一识别符的数据帧,无字节;

收藏 4 评论21 发布时间:2016-10-8 14:57

举报

21个回答
众想@刘洋 回答时间:2016-10-8 14:57:33
stary666 回答时间:2016-10-8 16:22:27
顶一下,,,,,,,,,,,
ynwscfsfi 回答时间:2016-10-8 19:52:12
感谢分享!
ynwscfsfi 回答时间:2016-10-8 19:52:51
感谢分享!
asssdz-382474 回答时间:2016-10-8 21:51:30


签到签到

签到签到
mark0668 回答时间:2016-10-9 15:28:00
感谢分享!支持
zhoulilin 回答时间:2016-10-19 12:03:45
CAN_Init(CAN_MasterCtrl_AllDisabled,CAN_Mode_Normal,CAN_SynJumpWidth_1TimeQuantum,CAN_BitSeg1_11TimeQuantum,CAN_BitSeg2_4TimeQuantum,1);

这个和库函数对不上。
CAN_InitStatus_TypeDef CAN_Init(CAN_MasterCtrl_TypeDef CAN_MasterCtrl,
                                CAN_Mode_TypeDef CAN_Mode,
                                CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth,
                                CAN_BitSeg1_TypeDef CAN_BitSeg1,
                                CAN_BitSeg2_TypeDef CAN_BitSeg2,
                                CAN_ClockSource_TypeDef CAN_ClockSource,
                                u8 CAN_Prescaler)
zhoulilin 回答时间:2016-10-19 12:04:49
请指教,这样怎么也能编译过。
mark0668 回答时间:2016-10-20 12:38:19

感谢分享!
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版