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

查看: 4260|回复: 6

【ST学习小组】STM32F103的CAN 通信之主控器

[复制链接]

19

主题

184

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-6-26 11:07:16 | 显示全部楼层 |阅读模式
 本CAN主要实现两个芯片的通讯,主控器通过CAN将获得的从控制发来的数据,通过串口显示在上位机上,在上位机上实时得到一个数据曲线。从控制器通过AD获得数据。
 
以下是主控制器的代码程序:
本主程序主要分为三个,main.c   led.c   usart.c  can.c   
 
main.c

#include "stm32f10x.h" 
#include "misc.h"
#include "led.h"
#include "key.h"
#include "usart.h"
//#include "exti.h"
#include "can.h"
 
void RCC_Configuration(void);  
void Delay(__IO uint32_t nCount);
 
//___________________Global Variable declare________
u8 CAN_TransmitDataBuf[8];
u8 ADC_num=0;
u16 ADC_Data0[10];
u16 ADC_Data1[10];
u16 ADC_Data2[10];
u16 ADC_Data3[10];
 
//______________________________________________
 
 
//___________________________ADC modue__________
 
void  Adc_Init(void)
{    
        //先初始化IO口

         RCC->APB2ENR|=1APB2ENR|=1
<
回复

使用道具 举报

19

主题

184

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-6-26 11:10:26 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

 usart.c
 
 

#include &quot;usart.h&quot;
 
USART_InitTypeDef USART_InitStruct;
USART_ClockInitTypeDef USART_ClockInitStruct;
 
void USART1_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA  , ENABLE);       
                //USART1 TX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);                    //A端口 
           //USART1 RX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);                                 
  
}
 
void USART1_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
 
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                   
  
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                     //设置串口中断
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&amp;NVIC_InitStructure);
}
void USART_Config(USART_TypeDef* USARTx)
{
  USART_InitTypeDef USART_InitStructure; 
  USART_InitStructure.USART_BaudRate = 115200;                                                //速率115200bps
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
  USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                        //收发模式
 
  /* Configure USART1 */
  USART_Init(USARTx, &amp;USART_InitStructure);                                                        //配置串口参数函数
 
  
  /* Enable USART1 Receive and Transmit interrupts */
 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断
  //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                                                //使能发送缓冲空中断
  //USART_ITConfig(USART1, USART_IT_TC, ENABLE);                                                //使能发送完成中断 
  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);       
}
 
void USART_Init_Config(void)
{
          USART1_GPIO_Config();                          //端口配置
          USART_Config(USART1);                          //数据格式配置
          USART1_NVIC_Configuration();  //中断配置
}
void Usart_transmitByte(uint8_t Usart_TransmitDatebuf)
{
        USART1-&gt;DR=Usart_TransmitDatebuf;
        while((USART1-&gt;SR&amp;0X40)==0);//wait 
}
 
void Usart_TransmitData(u16 Usart_TransmitDataLength,uint8_t * Usart_TransmitDatebuf)
{
        u16 Usart_Transmitindex;
         //_____________________send the start byte_______________________
                 Usart_transmitByte(0xFF);
                 Usart_transmitByte(0x00);
//        _____________________send the end byte________________________

        for(Usart_Transmitindex=0;Usart_Transmitindex
回复 支持 反对

使用道具 举报

19

主题

184

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-6-26 11:11:08 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

led.c
 
 #include &quot;led.h&quot;
 
void LED_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD  , ENABLE);       
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                     //LED1  V6           //将V6,V7,V8 配置为通用推挽输出  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         //口线翻转速度为50MHz
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);                                         
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                     //LED1  V6           //将V6,V7,V8 配置为通用推挽输出  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         //口线翻转速度为50MHz
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);
}
回复 支持 反对

使用道具 举报

19

主题

184

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-6-26 11:11:48 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

  can.c 
 
 

#include &quot;can.h&quot;
 
u16 ret;
/******************CAN1中断配置函数*********************************************/
//优先级:0
//中断服务程序:USB_LP_CAN1_RX0_IRQn------stm32f10x_it.
void CAN_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
 
  /* Enable CAN1 RX0 interrupt IRQ channel */
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&amp;NVIC_InitStructure);
}
/******************CAN1端口配置函数*********************************************/
//引脚:CAN1RX-PA8、CAN1Tx-PB8
//说明:开启端口B的时钟、CAN1的时钟
void CAN_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);
            /*端口重映射到PB8、PB9上*/
 
 // GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);        //配置CAN总线为从映射
 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);   /* CAN Periph clock enable */
 
}
 
/******************CAN1查询接受配置函数*****************************************/
//波特率:SJW-1tq、BS1-8tq、BS2-7tq、Prescaler-5;
//
u8 CAN_Polling(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  CanRxMsg RxMessage;
  uint32_t i = 0;
  uint8_t TransmitMailbox = 0;
 
  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&amp;CAN_InitStructure);
 
  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;
  CAN_Init(CAN1, &amp;CAN_InitStructure);
 
  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=0;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&amp;CAN_FilterInitStructure);
 
  /* transmit */
  TxMessage.StdId=0x11;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xAA;
  TxMessage.Data[1]=0xAA;
 
  TransmitMailbox=CAN_Transmit(CAN1, &amp;TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) &amp;&amp; (i != 0xFF))
  {
    i++;
  }
 
  i = 0;
  while((CAN_MessagePending(CAN1, CAN_FIFO0) &lt; 1) &amp;&amp; (i != 0xFF))
  {
    i++;
  }
 
  /* receive */
  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN1, CAN_FIFO0, &amp;RxMessage);
 
  if( (RxMessage.StdId!=0x11)|(RxMessage.StdId!=0x12) )
  {
    return 1;  
  }
 
  if (RxMessage.IDE!=CAN_ID_STD)
  {
    return 1;
  }
 
  if (RxMessage.DLC!=2)
  {
    return 1;  
  }
 

  if ((RxMessage.Data[0]
回复 支持 反对

使用道具 举报

0

主题

11

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-10-17 00:35:33 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

谢谢楼主,辛苦了!
回复 支持 反对

使用道具 举报

17

主题

127

回帖

0

蝴蝶豆

中级会员

最后登录
2019-2-12
发表于 2014-3-3 10:21:04 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

学习了,多谢楼主分享
回复 支持 反对

使用道具 举报

17

主题

127

回帖

0

蝴蝶豆

中级会员

最后登录
2019-2-12
发表于 2014-3-3 16:33:19 | 显示全部楼层

回复:【ST学习小组】STM32F103的CAN 通信之主控器

Can_Interrupt函数需要在从新配置一遍吗?
感觉没什么作用呢
回复 支持 反对

使用道具 举报

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