OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4377|回复: 4

STM32F107VC CAN1通讯 STM32F10X_XX

[复制链接]

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2017-3-6
在线时间
26 小时
发表于 2017-3-6 11:39:01 | 显示全部楼层 |阅读模式
1金钱
本人用的STM32F107VCT6的板子,由于板子引脚都分配好了,做测试有些不方便。现在做CAN 通讯,用的是CAN1,复用重映射到PB8,PB9引脚。本人刚刚接触STM32,基础薄,比较笨,望老司机带带我。问题有以下几个:
第一个:这个程序不能和STM32F103的开发板通信,程序有什么地方不对或者可能有哪些地方出错?
第二个:在while(1)中break为什么不能跳出去,两个灯还一直闪?
第三个:关于c/c++中的USE_STDPERIPH_DRIVER,STM32F10X_CL这个查了好半天,分享一下。
希望稍微详细点,万分感谢
MCU 型号
FLASH大小
STM32F10X_LD
STM32F101xx
STM32F102xx
STM32F103xx
16 ~ 32 Kbytes
STM32F10X_MD
STM32F101xx
STM32F102xx
STM32F103xx
64 ~ 128 Kbytes
STM32F10X_HD
STM32F101xx
STM32F103xx
256 ~ 512 Kbytes
STM32F10X_CL
STM32F105xx
STM32F107xx
忽略

CAN初始化程序是从103开发板直接拷贝过来,稍微改了一下:
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
        GPIO_InitTypeDef                 GPIO_InitStructure;
        CAN_InitTypeDef                CAN_InitStructure;
        CAN_FilterInitTypeDef          CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
        NVIC_InitTypeDef                  NVIC_InitStructure;
#endif

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTB时钟                                                                                                                    

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟
       
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);//开启重映射

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
        GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO

        //CAN单元设置
        CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);
       
        CAN_InitStructure.CAN_TTCM=DISABLE;                        //非时间触发通信模式  
        CAN_InitStructure.CAN_ABOM=DISABLE;                        //软件自动离线管理         
        CAN_InitStructure.CAN_AWUM=DISABLE;                        //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
        CAN_InitStructure.CAN_NART=ENABLE;                        //禁止报文自动传送
        CAN_InitStructure.CAN_RFLM=DISABLE;                         //报文不锁定,新的覆盖旧的  
        CAN_InitStructure.CAN_TXFP=DISABLE;                        //优先级由报文标识符决定
        CAN_InitStructure.CAN_Mode= mode;                //模式设置: mode:0,普通模式;1,回环模式;
        //设置波特率
        CAN_InitStructure.CAN_SJW=tsjw;                                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
        CAN_InitStructure.CAN_BS1=tbs1;                         //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
        CAN_InitStructure.CAN_BS2=tbs2;                                //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~        CAN_BS2_8tq
        CAN_InitStructure.CAN_Prescaler=brp;        //分频系数(Fdiv)为brp+1       
        CAN_Init(CAN1, &CAN_InitStructure);                //初始化CAN1

        CAN_FilterInitStructure.CAN_FilterNumber=0;        //过滤器0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         //屏蔽位模式
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;         //32位宽
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;        //32位ID
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0

        CAN_FilterInit(&CAN_FilterInitStructure);                        //滤波器初始化
       
#if CAN_RX0_INT_ENABLE
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);                                //FIFO0消息挂号中断允许.                    

        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}   

#if CAN_RX0_INT_ENABLE        //使能RX0中断
//中断服务函数                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
        int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
        for(i=0;i<8;i++)
        printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data);
}
#endif

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
//len:数据长度(最大为8)                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{       
        u8 mbox;
        u16 i=0;
        CanTxMsg TxMessage;
        TxMessage.StdId=0x12;                        // 标准标识符
        TxMessage.ExtId=0x12;                        // 设置扩展标示符
        TxMessage.IDE=CAN_Id_Standard;         // 标准帧
        TxMessage.RTR=CAN_RTR_Data;                // 数据帧
        TxMessage.DLC=len;                                // 要发送的数据长度
        for(i=0;i<len;i++)
        TxMessage.Data=msg;                                  
        mbox= CAN_Transmit(CAN1, &TxMessage);   
        i=0;
        while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
        if(i>=0XFFF)return 1;
        return 0;         
}
//can口接收数据查询
//buf:数据缓存区;         
//返回值:0,无数据被收到;
//                 其他,接收的数据长度;
u8 Can_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据       
    for(i=0;i<8;i++)
    buf=RxMessage.Data;  
        return RxMessage.DLC;       
}
这是main程序
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "can.h"
#include "usart.h"

int main(void)
         
{       
         int t;
         u8 key;
         u8 res;
         u8 canbuf[8];
         
         delay_init();
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
         uart_init(115200);                 //串口初始化为115200
         LED_Init();
         CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);
         

  while(1)
        {
                LED1=0;
                LED2=0;
                delay_ms(500);
                LED1=1;
                LED2=1;          //LED1,LED2提示程序运行
                delay_ms(500);
               
                res=Can_Send_Msg(canbuf,8);
                key=Can_Receive_Msg(canbuf);

       }
}





~XFJK5(Z`DV}6KC1B~[ZZ6T.png

最佳答案

查看完整内容[请看2#楼]

终于调通了,原来是串口配置错了 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2017-3-6
在线时间
26 小时
 楼主| 发表于 2017-3-6 11:39:02 | 显示全部楼层
终于调通了,原来是串口配置错了
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
        GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO
应该配置GPIOB的,马虎大意配置成了A,害我调了两天,谢谢你们
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-6 18:41:09 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2017-9-21
在线时间
32 小时
发表于 2017-11-13 22:51:34 | 显示全部楼层
厉害啊,我的哥
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2019-10-21
在线时间
22 小时
发表于 2020-6-21 12:57:02 | 显示全部楼层
楼主,我这两天也在用107调CAN  遇到了一些问题,导致数据不通,能不能借你的程序研究研究,万分感谢 89852772@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 23:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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