搜索
查看: 4454|回复: 6

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

[复制链接]

该用户从未签到

19

主题

203

帖子

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

主题

203

帖子

0

蝴蝶豆

初级会员

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

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

 usart.c
 
 

#include "usart.h"
 
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, &GPIO_InitStructure);                    //A端口 
           //USART1 RX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
  GPIO_Init(GPIOA, &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(&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, &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->DR=Usart_TransmitDatebuf;
        while((USART1->SR&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

主题

203

帖子

0

蝴蝶豆

初级会员

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

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

led.c
 
 #include "led.h"
 
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, &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, &GPIO_InitStructure);
}
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

203

帖子

0

蝴蝶豆

初级会员

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

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

  can.c 
 
 

#include "can.h"
 
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(&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, &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, &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(&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, &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(&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, &TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF))
  {
    i++;
  }
 
  i = 0;
  while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (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, &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

主题

144

帖子

0

蝴蝶豆

中级会员

最后登录
2021-5-27
发表于 2014-3-3 10:21:04 | 显示全部楼层

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

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

使用道具 举报

该用户从未签到

17

主题

144

帖子

0

蝴蝶豆

中级会员

最后登录
2021-5-27
发表于 2014-3-3 16:33:19 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-12 16:44 , Processed in 1.175486 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表